diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c7d60d3..b8d4431 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,7 +57,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x, 20.x] + node-version: [18.x, 20.x, 22.x] steps: - name: Checkout code @@ -73,7 +73,7 @@ jobs: run: npm ci - name: Run tests - run: npm run test:ci -- --ci --coverage --maxWorkers=2 + run: npm run test:ci -- --coverage - name: Upload coverage to Codecov if: matrix.node-version == '18.x' diff --git a/.gitignore b/.gitignore index f494e79..15a5cb2 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ node_modules/ *.tgz lib +coverage/ diff --git a/dist/Disable.d.ts b/dist/Disable.d.ts deleted file mode 100644 index c57937b..0000000 --- a/dist/Disable.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as React from 'react'; -import type { EnableProps } from './Enable'; -export declare const Disable: React.FC; diff --git a/dist/Enable.d.ts b/dist/Enable.d.ts deleted file mode 100644 index 7acc115..0000000 --- a/dist/Enable.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import * as React from 'react'; -export interface EnableProps { - readonly feature?: string[] | string; - readonly allFeatures?: string[]; - children: React.ReactNode; -} -export declare function Enable({ feature, allFeatures, children, }: EnableProps): JSX.Element | null; diff --git a/dist/EnableContext.d.ts b/dist/EnableContext.d.ts deleted file mode 100644 index c65d9db..0000000 --- a/dist/EnableContext.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -/// -import type { FeatureValue } from './FeatureState'; -export declare type EnableContextType = (feature: string) => FeatureValue; -export declare const EnableContext: import("react").Context; diff --git a/dist/FeatureContext.d.ts b/dist/FeatureContext.d.ts deleted file mode 100644 index 8fc5792..0000000 --- a/dist/FeatureContext.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -/// -import type { FeatureDescription, FeatureValue } from './FeatureState'; -import type { FeaturesDispatch, FeaturesState } from './FeaturesState'; -export declare const FeatureContext: import("react").Context; -export interface FeatureContextType { - overridesSend: FeaturesDispatch; - defaultsSend: FeaturesDispatch; - featuresDescription: readonly FeatureDescription[]; - overridesState: FeaturesState; - defaultsState: FeaturesState; - test: (flag: string) => FeatureValue; -} diff --git a/dist/FeatureState.d.ts b/dist/FeatureState.d.ts deleted file mode 100644 index f30d354..0000000 --- a/dist/FeatureState.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { Dispatch } from 'react'; -export declare type FeatureValue = false | true | undefined; -export declare type FeatureStateValue = 'initial' | 'enabled' | 'disabled' | 'unspecified' | 'asyncEnabled' | 'asyncDisabled' | 'asyncUnspecified'; -export interface FeatureState { - value: FeatureStateValue; - featureDesc?: FeatureDescription; -} -export declare type FeatureDispatch = Dispatch; -export declare function valueForState(featureState: FeatureState): [FeatureValue, boolean]; -export interface FeatureDescription { - readonly name: K; - readonly description?: string; - readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise; - readonly force?: boolean; - readonly noOverride?: boolean; - readonly defaultValue?: FeatureValue; -} -export declare type FeatureAction = { - type: 'DISABLE'; -} | { - type: 'ENABLE'; -} | { - type: 'INIT'; - feature: FeatureDescription; -} | { - type: 'SET'; - value: FeatureValue; -} | { - type: 'TOGGLE'; -} | { - type: 'UNSET'; -} | { - type: 'ASYNC_DONE'; - value: FeatureValue; -}; -export declare const initialFeatureState: FeatureState; -export declare function featureReducer(state: FeatureState, action: FeatureAction): FeatureState; diff --git a/dist/Features.d.ts b/dist/Features.d.ts deleted file mode 100644 index e212700..0000000 --- a/dist/Features.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { type ReactNode } from 'react'; -import type { FeatureDescription } from './FeatureState'; -interface FeatureProps { - readonly features: readonly FeatureDescription[]; - readonly children?: ReactNode; - readonly disableConsole?: boolean; - readonly storage?: Storage; -} -export declare function Features({ children, features, disableConsole, storage, }: FeatureProps): JSX.Element; -export {}; diff --git a/dist/FeaturesState.d.ts b/dist/FeaturesState.d.ts deleted file mode 100644 index 0a8a804..0000000 --- a/dist/FeaturesState.d.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { Dispatch } from 'react'; -import { type FeatureDescription, type FeatureState, type FeatureValue } from './FeatureState'; -export interface FeaturesContext { - features: { - [x: string]: FeatureState; - }; -} -export declare type FeaturesAction = { - type: 'DE_INIT'; -} | { - type: 'DISABLE'; - name: string; -} | { - type: 'ENABLE'; - name: string; -} | { - type: 'INIT'; - features: readonly FeatureDescription[]; -} | { - type: 'SET_ALL'; - features: { - [key: string]: FeatureValue; - }; -} | { - type: 'SET'; - name: string; - value: FeatureValue; -} | { - type: 'TOGGLE'; - name: string; -} | { - type: 'UNSET'; - name: string; -} | { - type: 'ASYNC_DONE'; - name: string; - value: FeatureValue; -}; -export interface FeaturesState { - value: 'idle' | 'ready'; - context: FeaturesContext; -} -export declare type FeaturesDispatch = Dispatch; -export declare function valueOfFeature(featuresState: FeaturesState, feature: string): [FeatureValue, boolean]; -export declare const initialFeaturesState: FeaturesState; -export declare function featuresReducer(state: FeaturesState, action: FeaturesAction): FeaturesState; diff --git a/dist/GlobalEnable.d.ts b/dist/GlobalEnable.d.ts deleted file mode 100644 index c6131a6..0000000 --- a/dist/GlobalEnable.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { FeatureDescription, FeatureValue } from './FeatureState'; -import type { FeaturesDispatch } from './FeaturesState'; -export declare class GlobalEnable { - private readonly featureDesc; - private readonly dispatch; - private readonly testFeature; - constructor(dispatch: FeaturesDispatch, testFeature: (_: string) => FeatureValue, featureDesc: readonly FeatureDescription[]); - toggle(feature: string): void; - enable(feature: string): void; - unset(feature: string): void; - disable(feature: string): void; - setAll(features: { - [key: string]: FeatureValue; - }): void; - listFeatures(): readonly [string, FeatureValue][]; -} -declare global { - interface Window { - feature?: GlobalEnable; - } -} diff --git a/dist/ToggleFeatures.d.ts b/dist/ToggleFeatures.d.ts deleted file mode 100644 index 7061345..0000000 --- a/dist/ToggleFeatures.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -/// -export declare function ToggleFeatures({ defaultOpen, hidden, }: { - defaultOpen?: boolean; - hidden?: boolean; -}): JSX.Element | null; -export declare function ToggleFeatureUnwrapped({ defaultOpen, hidden, }: { - defaultOpen?: boolean; - hidden?: boolean; -}): JSX.Element | null; diff --git a/dist/cjs/src/index.js b/dist/cjs/src/index.js deleted file mode 100644 index 06f0c20..0000000 --- a/dist/cjs/src/index.js +++ /dev/null @@ -1,1994 +0,0 @@ -var __create = Object.create; -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); -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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); - -// src/index.tsx -var src_exports = {}; -__export(src_exports, { - Disable: () => Disable, - Enable: () => Enable, - EnableContext: () => EnableContext, - Features: () => Features, - ToggleFeatures: () => ToggleFeatures, - useAllDisabled: () => useAllDisabled, - useAllEnabled: () => useAllEnabled, - useDisabled: () => useDisabled, - useEnabled: () => useEnabled -}); -module.exports = __toCommonJS(src_exports); - -// src/Disable.tsx -var React = __toESM(require("react")); - -// src/utils.ts -var import_react2 = require("react"); - -// src/EnableContext.tsx -var import_react = require("react"); -var EnableContext = (0, import_react.createContext)((_s) => false); - -// src/utils.ts -function useTestAndConvert(input) { - const test = (0, import_react2.useContext)(EnableContext); - const converted = (0, import_react2.useMemo)(() => input == null ? [] : Array.isArray(input) ? input : [input], [input]); - return [test, converted]; -} - -// src/useAllDisabled.tsx -function useAllDisabled(withoutAll) { - const [test, queryAllWithout] = useTestAndConvert(withoutAll); - return withoutAll.length > 0 && queryAllWithout.every((x) => { - var _a; - return !((_a = test(x)) != null ? _a : false); - }); -} - -// src/useDisabled.tsx -function useDisabled(without) { - const [test, queryAnyWithout] = useTestAndConvert(without); - return queryAnyWithout.some((x) => { - var _a; - return !((_a = test(x)) != null ? _a : false); - }); -} - -// src/Disable.tsx -var Disable = ({ - feature = [], - allFeatures = [], - children -}) => { - const isAny = useDisabled(feature); - const isAll = useAllDisabled(allFeatures); - if (isAny || isAll) { - return /* @__PURE__ */ React.createElement(React.Fragment, null, children); - } - return null; -}; - -// src/Enable.tsx -var React2 = __toESM(require("react")); - -// src/useAllEnabled.tsx -function useAllEnabled(allFeatures) { - const [test, queryAllPresent] = useTestAndConvert(allFeatures); - return queryAllPresent.length > 0 && queryAllPresent.every(test); -} - -// src/useEnabled.tsx -function useEnabled(feature) { - const [test, queryAnyPresent] = useTestAndConvert(feature); - return queryAnyPresent.some(test); -} - -// src/Enable.tsx -function Enable({ - feature = [], - allFeatures = [], - children -}) { - const isAny = useEnabled(feature); - const isAll = useAllEnabled(allFeatures); - if (isAny || isAll) { - return /* @__PURE__ */ React2.createElement(React2.Fragment, null, children); - } - return null; -} - -// src/Features.tsx -var import_react7 = __toESM(require("react")); - -// src/FeatureContext.tsx -var import_react3 = require("react"); -var FeatureContext = (0, import_react3.createContext)(null); - -// src/FeatureState.tsx -function valueForState(featureState) { - var _a, _b; - return [ - featureState.value === "enabled" || featureState.value === "asyncEnabled" ? true : featureState.value === "disabled" || featureState.value === "asyncDisabled" ? false : void 0, - (_b = (_a = featureState.featureDesc) == null ? void 0 : _a.force) != null ? _b : false - ]; -} - -// src/FeaturesState.tsx -function valueOfFeature(featuresState, feature) { - if (featuresState.context.features[feature] == null) { - return [void 0, false]; - } - const featureState = featuresState.context.features[feature]; - if (featureState != null) { - return valueForState(featureState); - } - return [void 0, false]; -} -var initialFeaturesState = { - value: "idle", - context: { - features: {} - } -}; -function featuresReducer(state, action) { - var _a, _b, _c, _d, _e; - switch (action.type) { - case "INIT": { - if (action.features.length === 0) { - return state; - } - const features = {}; - for (const feature of action.features) { - const featureState = { - value: feature.defaultValue === true ? "enabled" : feature.defaultValue === false ? "disabled" : "unspecified", - featureDesc: feature - }; - features[feature.name] = featureState; - } - return { - value: "ready", - context: { features } - }; - } - case "DE_INIT": { - return initialFeaturesState; - } - case "SET_ALL": { - if (state.value !== "ready") { - return state; - } - const features = __spreadValues({}, state.context.features); - Object.keys(features).forEach((name) => { - var _a2, _b2; - const value = (_a2 = action.features[name]) != null ? _a2 : void 0; - const currentFeature = features[name]; - if (((_b2 = currentFeature.featureDesc) == null ? void 0 : _b2.onChangeDefault) != null) { - if (value === true) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncEnabled" }); - } else if (value === false) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncDisabled" }); - } else { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncUnspecified" }); - } - } else { - if (value === true) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "enabled" }); - } else if (value === false) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "disabled" }); - } else { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "unspecified" }); - } - } - }); - return __spreadProps(__spreadValues({}, state), { - context: { features } - }); - } - case "SET": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const { value } = action; - let newValue; - if (((_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault) != null) { - if (value === true) { - newValue = "asyncEnabled"; - } else if (value === false) { - newValue = "asyncDisabled"; - } else { - newValue = "asyncUnspecified"; - } - } else { - if (value === true) { - newValue = "enabled"; - } else if (value === false) { - newValue = "disabled"; - } else { - newValue = "unspecified"; - } - } - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "TOGGLE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_b = feature.featureDesc) == null ? void 0 : _b.onChangeDefault) != null ? "asyncEnabled" : "enabled"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "ENABLE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_c = feature.featureDesc) == null ? void 0 : _c.onChangeDefault) != null ? "asyncEnabled" : "enabled"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "DISABLE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_d = feature.featureDesc) == null ? void 0 : _d.onChangeDefault) != null ? "asyncDisabled" : "disabled"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "UNSET": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_e = feature.featureDesc) == null ? void 0 : _e.onChangeDefault) != null ? "asyncUnspecified" : "unspecified"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "ASYNC_DONE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const { value } = action; - const newValue = value === true ? "enabled" : value === false ? "disabled" : "unspecified"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - default: - return state; - } -} - -// src/useConsoleOverride.tsx -var import_react4 = require("react"); - -// src/GlobalEnable.tsx -var GlobalEnable = class { - constructor(dispatch, testFeature2, featureDesc) { - this.featureDesc = featureDesc; - this.dispatch = dispatch; - this.testFeature = testFeature2; - } - toggle(feature) { - this.dispatch({ type: "TOGGLE", name: feature }); - } - enable(feature) { - this.dispatch({ type: "ENABLE", name: feature }); - } - unset(feature) { - this.dispatch({ type: "UNSET", name: feature }); - } - disable(feature) { - this.dispatch({ type: "DISABLE", name: feature }); - } - setAll(features) { - this.dispatch({ type: "SET_ALL", features }); - } - listFeatures() { - return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]); - } -}; - -// src/useConsoleOverride.tsx -function useConsoleOverride(consoleOverride, features, testFeature2, dispatch) { - (0, import_react4.useEffect)(() => { - if (!consoleOverride) { - if (window.feature != null) { - window.feature = void 0; - } - return () => { - if (window.feature != null) { - window.feature = void 0; - } - }; - } - window.feature = new GlobalEnable(dispatch, testFeature2, features); - return () => { - if (window.feature != null) { - window.feature = void 0; - } - }; - }, [features, dispatch, consoleOverride, testFeature2]); -} - -// src/usePersist.tsx -var import_react5 = require("react"); -var KEY = "react-enable:feature-values"; -function usePersist(storage, features, overrideState) { - const overrides = (0, import_react5.useMemo)(() => { - const newOverrides = {}; - if (overrideState.value === "ready") { - for (const feature of features) { - const [value] = valueOfFeature(overrideState, feature.name); - if (value != null) { - newOverrides[feature.name] = value; - } - } - } - return newOverrides; - }, [features, overrideState]); - const strState = Object.keys(overrides).length === 0 || storage == null ? "{}" : JSON.stringify({ overrides }); - (0, import_react5.useEffect)(() => { - try { - if (storage != null && overrideState.value === "ready") { - storage.setItem(KEY, strState); - } - } catch (e) { - } - }, [overrideState, storage, strState]); -} - -// src/useTestCallback.tsx -var import_react6 = require("react"); - -// src/testFeature.tsx -function testFeature(feature, states) { - const values = states.map((state) => valueOfFeature(state, feature)); - for (const [featureValue, featureForced] of values) { - if (featureValue != null && featureForced) { - return featureValue; - } - } - for (const [featureValue] of values) { - if (featureValue != null) { - return featureValue; - } - } - return void 0; -} - -// src/useTestCallback.tsx -function useTestCallback(defaultsState, overridesState) { - return (0, import_react6.useCallback)((f) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]); -} - -// src/Features.tsx -function Features({ - children, - features, - disableConsole = false, - storage = window.sessionStorage -}) { - const featuresRef = (0, import_react7.useRef)(features); - const [overridesState, overridesDispatch] = (0, import_react7.useReducer)(featuresReducer, initialFeaturesState); - const [defaultsState, defaultsDispatch] = (0, import_react7.useReducer)(featuresReducer, initialFeaturesState); - (0, import_react7.useEffect)(() => { - defaultsDispatch({ type: "INIT", features }); - return () => { - defaultsDispatch({ type: "DE_INIT" }); - }; - }, [features]); - (0, import_react7.useEffect)(() => { - let f = {}; - if (storage != null) { - try { - const featuresJson = storage.getItem(KEY); - if (featuresJson != null) { - const fh = JSON.parse(featuresJson); - f = fh.overrides; - } - } catch (e) { - console.error("error in localStorage", e); - } - } - overridesDispatch({ - type: "INIT", - features: featuresRef.current.filter((x) => x.noOverride !== true).map((x) => { - var _a; - return { - name: x.name, - description: x.description, - defaultValue: (_a = f == null ? void 0 : f[x.name]) != null ? _a : void 0 - }; - }) - }); - return () => { - overridesDispatch({ type: "DE_INIT" }); - }; - }, [storage]); - (0, import_react7.useEffect)(() => { - if (defaultsState.value !== "ready") { - return; - } - Object.entries(defaultsState.context.features).forEach(([name, feature]) => { - var _a; - if (feature.value === "asyncEnabled" || feature.value === "asyncDisabled" || feature.value === "asyncUnspecified") { - const targetValue = feature.value === "asyncEnabled" ? true : feature.value === "asyncDisabled" ? false : void 0; - const onChangeDefault = (_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault; - if (onChangeDefault != null && feature.featureDesc != null) { - onChangeDefault(feature.featureDesc.name, targetValue).then((result) => { - defaultsDispatch({ type: "ASYNC_DONE", name, value: result }); - }).catch(() => { - defaultsDispatch({ - type: "ASYNC_DONE", - name, - value: void 0 - }); - }); - } - } - }); - }, [defaultsState]); - usePersist(storage, featuresRef.current, overridesState); - const testCallback = useTestCallback(overridesState, defaultsState); - useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsDispatch); - const featureValue = (0, import_react7.useMemo)(() => ({ - overridesSend: overridesDispatch, - defaultsSend: defaultsDispatch, - featuresDescription: featuresRef.current, - overridesState, - defaultsState, - test: testCallback - }), [overridesState, defaultsState, testCallback]); - return /* @__PURE__ */ import_react7.default.createElement(FeatureContext.Provider, { - value: featureValue - }, /* @__PURE__ */ import_react7.default.createElement(EnableContext.Provider, { - value: testCallback - }, children)); -} - -// src/ToggleFeatures.tsx -var import_react8 = require("@headlessui/react"); -var import_react9 = __toESM(require("react")); -var import_react_dom = __toESM(require("react-dom")); - -// src/tailwind.css -var tailwind_default = `/* -! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured \`sans\` font-family by default. -*/ - -html { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from \`html\` so users can set them as a class directly on the \`html\` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured \`mono\` font family by default. -2. Correct the odd \`em\` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-size: 1em; - /* 2 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent \`sub\` and \`sup\` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - line-height: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional \`:invalid\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to \`inherit\` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements \`display: block\` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add \`vertical-align: middle\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* -Ensure the default browser behavior of the \`hidden\` attribute. -*/ - -[hidden] { - display: none; -} - -[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - border-radius: 0px; - padding-top: 0.5rem; - padding-right: 0.75rem; - padding-bottom: 0.5rem; - padding-left: 0.75rem; - font-size: 1rem; - line-height: 1.5rem; - --tw-shadow: 0 0 #0000; -} - -[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); - border-color: #2563eb; -} - -input::-moz-placeholder, textarea::-moz-placeholder { - color: #6b7280; - opacity: 1; -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - color: #6b7280; - opacity: 1; -} - -input::placeholder,textarea::placeholder { - color: #6b7280; - opacity: 1; -} - -::-webkit-datetime-edit-fields-wrapper { - padding: 0; -} - -::-webkit-date-and-time-value { - min-height: 1.5em; -} - -::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field { - padding-top: 0; - padding-bottom: 0; -} - -select { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 0.5rem center; - background-repeat: no-repeat; - background-size: 1.5em 1.5em; - padding-right: 2.5rem; - -webkit-print-color-adjust: exact; - color-adjust: exact; -} - -[multiple] { - background-image: initial; - background-position: initial; - background-repeat: unset; - background-size: initial; - padding-right: 0.75rem; - -webkit-print-color-adjust: unset; - color-adjust: unset; -} - -[type='checkbox'],[type='radio'] { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding: 0; - -webkit-print-color-adjust: exact; - color-adjust: exact; - display: inline-block; - vertical-align: middle; - background-origin: border-box; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - flex-shrink: 0; - height: 1rem; - width: 1rem; - color: #2563eb; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - --tw-shadow: 0 0 #0000; -} - -[type='checkbox'] { - border-radius: 0px; -} - -[type='radio'] { - border-radius: 100%; -} - -[type='checkbox']:focus,[type='radio']:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 2px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} - -[type='checkbox']:checked,[type='radio']:checked { - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} - -[type='checkbox']:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); -} - -[type='radio']:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); -} - -[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus { - border-color: transparent; - background-color: currentColor; -} - -[type='checkbox']:indeterminate { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} - -[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { - border-color: transparent; - background-color: currentColor; -} - -[type='file'] { - background: unset; - border-color: inherit; - border-width: 0; - border-radius: 0; - padding: 0; - font-size: unset; - line-height: inherit; -} - -[type='file']:focus { - outline: 1px auto -webkit-focus-ring-color; -} - -*, ::before, ::after { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -.container { - width: 100%; -} - -@media (min-width: 640px) { - .container { - max-width: 640px; - } -} - -@media (min-width: 768px) { - .container { - max-width: 768px; - } -} - -@media (min-width: 1024px) { - .container { - max-width: 1024px; - } -} - -@media (min-width: 1280px) { - .container { - max-width: 1280px; - } -} - -@media (min-width: 1536px) { - .container { - max-width: 1536px; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.pointer-events-none { - pointer-events: none; -} - -.invisible { - visibility: hidden; -} - -.fixed { - position: fixed; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.-inset-px { - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.inset-0 { - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; -} - -.bottom-0 { - bottom: 0px; -} - -.left-0 { - left: 0px; -} - -.z-10 { - z-index: 10; -} - -.mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} - -.my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} - -.mx-8 { - margin-left: 2rem; - margin-right: 2rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-1 { - margin-top: 0.25rem; -} - -.mt-6 { - margin-top: 1.5rem; -} - -.mt-5 { - margin-top: 1.25rem; -} - -.inline-block { - display: inline-block; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.grid { - display: grid; -} - -.hidden { - display: none; -} - -.h-7 { - height: 1.75rem; -} - -.h-4 { - height: 1rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-8 { - height: 2rem; -} - -.h-6 { - height: 1.5rem; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-4 { - width: 1rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-8 { - width: 2rem; -} - -.w-6 { - width: 1.5rem; -} - -.max-w-full { - max-width: 100%; -} - -.shrink { - flex-shrink: 1; -} - -.grow { - flex-grow: 1; -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.cursor-not-allowed { - cursor: not-allowed; -} - -.cursor-pointer { - cursor: pointer; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.flex-row { - flex-direction: row; -} - -.flex-col { - flex-direction: column; -} - -.flex-nowrap { - flex-wrap: nowrap; -} - -.items-end { - align-items: flex-end; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.gap-2 { - gap: 0.5rem; -} - -.gap-1 { - gap: 0.25rem; -} - -.gap-4 { - gap: 1rem; -} - -.gap-9 { - gap: 2.25rem; -} - -.gap-y-6 { - row-gap: 1.5rem; -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-y-auto { - overflow-y: auto; -} - -.rounded-sm { - border-radius: 0.125rem; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-full { - border-radius: 9999px; -} - -.border { - border-width: 1px; -} - -.border-2 { - border-width: 2px; -} - -.border-orange-500 { - --tw-border-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-border-opacity)); -} - -.border-green-500 { - --tw-border-opacity: 1; - border-color: rgb(34 197 94 / var(--tw-border-opacity)); -} - -.border-red-500 { - --tw-border-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-border-opacity)); -} - -.border-transparent { - border-color: transparent; -} - -.border-gray-300 { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); -} - -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} - -.border-gray-500 { - --tw-border-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-border-opacity)); -} - -.bg-blue-600 { - --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.p-3 { - padding: 0.75rem; -} - -.p-1 { - padding: 0.25rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.pt-4 { - padding-top: 1rem; -} - -.pb-10 { - padding-bottom: 2.5rem; -} - -.pt-5 { - padding-top: 1.25rem; -} - -.pb-4 { - padding-bottom: 1rem; -} - -.pt-0 { - padding-top: 0px; -} - -.pb-0 { - padding-bottom: 0px; -} - -.pr-4 { - padding-right: 1rem; -} - -.pl-4 { - padding-left: 1rem; -} - -.text-left { - text-align: left; -} - -.align-middle { - vertical-align: middle; -} - -.align-bottom { - vertical-align: bottom; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.font-medium { - font-weight: 500; -} - -.leading-6 { - line-height: 1.5rem; -} - -.leading-7 { - line-height: 1.75rem; -} - -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} - -.text-orange-500 { - --tw-text-opacity: 1; - color: rgb(249 115 22 / var(--tw-text-opacity)); -} - -.text-green-500 { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity)); -} - -.text-red-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); -} - -.text-blue-500 { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-xl { - --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.ring-2 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.ring-blue-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); -} - -.ring-gray-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity)); -} - -.invert { - --tw-invert: invert(100%); - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.transition-all { - transition-property: all; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.focus\\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.focus\\:ring-2:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\\:ring-blue-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); -} - -.focus\\:ring-offset-2:focus { - --tw-ring-offset-width: 2px; -} - -@media (min-width: 640px) { - .sm\\:my-8 { - margin-top: 2rem; - margin-bottom: 2rem; - } - - .sm\\:mt-3 { - margin-top: 0.75rem; - } - - .sm\\:mt-6 { - margin-top: 1.5rem; - } - - .sm\\:block { - display: block; - } - - .sm\\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .sm\\:gap-x-4 { - -moz-column-gap: 1rem; - column-gap: 1rem; - } - - .sm\\:p-0 { - padding: 0px; - } - - .sm\\:p-6 { - padding: 1.5rem; - } - - .sm\\:align-middle { - vertical-align: middle; - } - - .sm\\:text-sm { - font-size: 0.875rem; - line-height: 1.25rem; - } -} - -@media (min-width: 1024px) { - .lg\\:max-w-\\[80\\%\\] { - max-width: 80%; - } - - .lg\\:gap-4 { - gap: 1rem; - } -} -`; - -// src/ToggleFeatures.tsx -function classNames(...classes) { - return classes.filter(Boolean).join(" "); -} -function ToggleFeature({ - feature -}) { - var _a, _b, _c; - const context = (0, import_react9.useContext)(FeatureContext); - const handleChangeSelection = (0, import_react9.useCallback)((value) => { - if ((context == null ? void 0 : context.overridesSend) != null) { - switch (value) { - case "true": { - context.overridesSend({ type: "ENABLE", name: feature.name }); - break; - } - case "false": { - context.overridesSend({ type: "DISABLE", name: feature.name }); - break; - } - case "unset": { - context.overridesSend({ type: "UNSET", name: feature.name }); - break; - } - } - } - }, [feature.name, context]); - if (context == null) { - return null; - } - const { overridesState, test: testFeature2, defaultsState } = context; - const valueInDefaults = ((_a = valueOfFeature(defaultsState, feature.name)[0]) != null ? _a : "unset").toString(); - const valueInOverrides = ((_b = valueOfFeature(overridesState, feature.name)[0]) != null ? _b : "unset").toString(); - const actualChecked = testFeature2(feature.name); - return /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup, { - disabled: feature.noOverride, - onChange: handleChangeSelection, - value: valueInOverrides - }, /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Label, null, /* @__PURE__ */ import_react9.default.createElement("h6", { - className: "text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7" - }, /* @__PURE__ */ import_react9.default.createElement("span", { - className: "font-medium" - }, "Feature: ", /* @__PURE__ */ import_react9.default.createElement("code", null, feature.name)), feature.noOverride === true ? /* @__PURE__ */ import_react9.default.createElement("div", { - className: "border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" - }, /* @__PURE__ */ import_react9.default.createElement("svg", { - "aria-hidden": "true", - className: "h-4 w-4 min-w-4", - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ import_react9.default.createElement("path", { - clipRule: "evenodd", - d: "M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z", - fillRule: "evenodd" - })), /* @__PURE__ */ import_react9.default.createElement("div", null, "No Overrides")) : null, actualChecked === true ? /* @__PURE__ */ import_react9.default.createElement("div", { - className: "flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1" - }, /* @__PURE__ */ import_react9.default.createElement("svg", { - "aria-hidden": "true", - className: "h-4 w-4 min-w-4", - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ import_react9.default.createElement("path", { - clipRule: "evenodd", - d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", - fillRule: "evenodd" - })), /* @__PURE__ */ import_react9.default.createElement("div", null, actualChecked ? "Enabled" : "Disabled")) : null), feature.description == null ? null : /* @__PURE__ */ import_react9.default.createElement("p", { - className: "text-base text-gray-500 text-sm" - }, feature.description)), /* @__PURE__ */ import_react9.default.createElement("div", { - className: "mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4" - }, [ - { - id: "false", - title: `Disable ${feature.name}`, - description: "Override the feature to be disabled" - }, - { - id: "unset", - title: "Default", - description: "Inherit enabled state from defaults", - disabled: ((_c = feature.noOverride) != null ? _c : false) || feature.force, - defaultValue: valueInDefaults === "true" ? /* @__PURE__ */ import_react9.default.createElement("div", { - className: "text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" - }, /* @__PURE__ */ import_react9.default.createElement("span", null, "Enabled")) : /* @__PURE__ */ import_react9.default.createElement("div", { - className: "text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" - }, /* @__PURE__ */ import_react9.default.createElement("span", null, "Disabled")) - }, - { - id: "true", - title: `Enable ${feature.name}`, - description: "Override the feature to be enabled" - } - ].map((option) => /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Option, { - className: ({ checked, active, disabled }) => classNames(checked ? "border-transparent" : "border-gray-300", !disabled && active ? "border-blue-500 ring-2 ring-blue-500" : "", disabled ? "border-transparent ring-gray-500 cursor-not-allowed" : "cursor-pointer", "relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"), - disabled: option.disabled, - key: option.id, - value: option.id - }, ({ checked, active, disabled }) => /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement("div", { - className: "flex flex-col grow" - }, /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Label, { - as: "span", - className: "flex flex-nowrap flex-row gap-1 items-center space-between" - }, /* @__PURE__ */ import_react9.default.createElement("span", { - className: "text-sm font-medium text-gray-900 grow shrink" - }, option.title), option.defaultValue != null ? option.defaultValue : null, /* @__PURE__ */ import_react9.default.createElement("svg", { - "aria-hidden": "true", - className: classNames(!checked ? "invisible" : "", "h-5 w-5 text-blue-500 min-w-4"), - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ import_react9.default.createElement("path", { - clipRule: "evenodd", - d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", - fillRule: "evenodd" - }))), /* @__PURE__ */ import_react9.default.createElement(import_react8.RadioGroup.Description, { - as: "span", - className: "mt-1 flex items-center text-sm text-gray-500" - }, option.description)), /* @__PURE__ */ import_react9.default.createElement("div", { - "aria-hidden": "true", - className: classNames(!disabled && active ? "border" : "border-2", checked ? disabled ? "border-gray-500" : "border-blue-500" : "border-transparent", "absolute -inset-px rounded-lg pointer-events-none") - })))))); -} -function ShadowContent({ - root, - children -}) { - return import_react_dom.default.createPortal(children, root); -} -function ToggleFeatures({ - defaultOpen = false, - hidden = false -}) { - const [root, setCoreRoot] = (0, import_react9.useState)(null); - const setRoot = (host) => { - if (host == null || root != null) { - return; - } - const shadowRoot = host == null ? void 0 : host.attachShadow({ mode: "open" }); - const style = document.createElement("style"); - const renderDiv = document.createElement("div"); - style.textContent = tailwind_default; - shadowRoot.appendChild(style); - shadowRoot.appendChild(renderDiv); - setCoreRoot(renderDiv); - }; - if (hidden) { - return null; - } - return /* @__PURE__ */ import_react9.default.createElement("div", { - ref: setRoot, - style: { - zIndex: 99999, - position: "fixed", - width: "0", - height: "0", - bottom: 0 - } - }, root != null ? /* @__PURE__ */ import_react9.default.createElement(ShadowContent, { - root - }, /* @__PURE__ */ import_react9.default.createElement(ToggleFeatureUnwrapped, { - defaultOpen - })) : null); -} -function ToggleFeatureUnwrapped({ - defaultOpen = false, - hidden = false -}) { - const [open, setOpen] = (0, import_react9.useState)(defaultOpen); - const context = (0, import_react9.useContext)(FeatureContext); - if (context == null) { - return null; - } - if (hidden) { - return null; - } - const { featuresDescription } = context; - if (featuresDescription.length === 0) { - return null; - } - return /* @__PURE__ */ import_react9.default.createElement("div", { - className: "relative" - }, /* @__PURE__ */ import_react9.default.createElement("div", { - className: "absolute bottom-0 left-0 mx-4 my-4" - }, /* @__PURE__ */ import_react9.default.createElement("button", { - className: "inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", - onClick: () => setOpen(true), - title: "Toggle features", - type: "button" - }, /* @__PURE__ */ import_react9.default.createElement("svg", { - className: "w-6 h-6 min-h-6 min-w-6", - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ import_react9.default.createElement("path", { - clipRule: "evenodd", - d: "M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z", - fillRule: "evenodd" - })))), !open ? null : /* @__PURE__ */ import_react9.default.createElement("div", { - className: "fixed z-10 inset-0 overflow-y-auto" - }, /* @__PURE__ */ import_react9.default.createElement("div", { - className: "flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0" - }, /* @__PURE__ */ import_react9.default.createElement("div", { - className: "relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full" - }, /* @__PURE__ */ import_react9.default.createElement("div", null, /* @__PURE__ */ import_react9.default.createElement("div", { - className: "mt-1 sm:mt-3" - }, /* @__PURE__ */ import_react9.default.createElement("h3", { - className: "flex flex-row gap-4 flex-nowrap items-center space-between" - }, /* @__PURE__ */ import_react9.default.createElement("div", { - className: "grow text-lg leading-6 font-medium text-gray-900" - }, "Feature Flag Overrides")), /* @__PURE__ */ import_react9.default.createElement("p", { - className: "text-sm text-gray-500" - }, "Features can be enabled or disabled unless they are forced upstream. You can also revert to default."), /* @__PURE__ */ import_react9.default.createElement("div", { - className: "mt-6" - }, /* @__PURE__ */ import_react9.default.createElement("fieldset", { - className: "flex flex-col gap-9" - }, /* @__PURE__ */ import_react9.default.createElement("legend", { - className: "sr-only" - }, "Feature Flags"), featuresDescription.map((feature) => /* @__PURE__ */ import_react9.default.createElement(ToggleFeature, { - feature, - key: feature.name - })))), /* @__PURE__ */ import_react9.default.createElement("div", { - className: "flex justify-center items-center mt-5 sm:mt-6" - }, /* @__PURE__ */ import_react9.default.createElement("button", { - className: "inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", - onClick: () => setOpen(false), - type: "button" - }, "Done")))))))); -} -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzeCIsICIuLi8uLi8uLi9zcmMvRGlzYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9FbmFibGVDb250ZXh0LnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlQWxsRGlzYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VEaXNhYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL0VuYWJsZS50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUFsbEVuYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvRmVhdHVyZXMudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVTdGF0ZS50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VDb25zb2xlT3ZlcnJpZGUudHN4IiwgIi4uLy4uLy4uL3NyYy9HbG9iYWxFbmFibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VQZXJzaXN0LnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlVGVzdENhbGxiYWNrLnRzeCIsICIuLi8uLi8uLi9zcmMvdGVzdEZlYXR1cmUudHN4IiwgIi4uLy4uLy4uL3NyYy9Ub2dnbGVGZWF0dXJlcy50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCB7IERpc2FibGUgfSBmcm9tICcuL0Rpc2FibGUnO1xuZXhwb3J0IHsgRW5hYmxlIH0gZnJvbSAnLi9FbmFibGUnO1xuZXhwb3J0IHR5cGUgeyBFbmFibGVDb250ZXh0VHlwZSB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5leHBvcnQgeyBFbmFibGVDb250ZXh0IH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmV4cG9ydCB0eXBlIHsgRmVhdHVyZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5leHBvcnQgdHlwZSB7XG4gIEZlYXR1cmVEZXNjcmlwdGlvbixcbiAgRmVhdHVyZURpc3BhdGNoLFxuICBGZWF0dXJlU3RhdGUsXG4gIEZlYXR1cmVWYWx1ZSxcbn0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuZXhwb3J0IHsgRmVhdHVyZXMgfSBmcm9tICcuL0ZlYXR1cmVzJztcbmV4cG9ydCB7IFRvZ2dsZUZlYXR1cmVzIH0gZnJvbSAnLi9Ub2dnbGVGZWF0dXJlcyc7XG5leHBvcnQgeyB1c2VBbGxEaXNhYmxlZCB9IGZyb20gJy4vdXNlQWxsRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlQWxsRW5hYmxlZCB9IGZyb20gJy4vdXNlQWxsRW5hYmxlZCc7XG5leHBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gJy4vdXNlRGlzYWJsZWQnO1xuZXhwb3J0IHsgdXNlRW5hYmxlZCB9IGZyb20gJy4vdXNlRW5hYmxlZCc7XG4iLCAiLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogSlNYIHJlcXVpcmVzIFJlYWN0IGF0IHJ1bnRpbWVcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBFbmFibGVQcm9wcyB9IGZyb20gJy4vRW5hYmxlJztcbmltcG9ydCB7IHVzZUFsbERpc2FibGVkIH0gZnJvbSAnLi91c2VBbGxEaXNhYmxlZCc7XG5pbXBvcnQgeyB1c2VEaXNhYmxlZCB9IGZyb20gJy4vdXNlRGlzYWJsZWQnO1xuXG4vKipcbiAqIEZlYXR1cmUgd2lsbCBiZSBkaXNhYmxlZCBpZiBhbnkgaW4gdGhlIGxpc3QgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGNvbnN0IERpc2FibGU6IFJlYWN0LkZDPEVuYWJsZVByb3BzPiA9ICh7XG4gIGZlYXR1cmUgPSBbXSxcbiAgYWxsRmVhdHVyZXMgPSBbXSxcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IGlzQW55ID0gdXNlRGlzYWJsZWQoZmVhdHVyZSk7XG4gIGNvbnN0IGlzQWxsID0gdXNlQWxsRGlzYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG4iLCAiaW1wb3J0IHsgdXNlQ29udGV4dCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgRW5hYmxlQ29udGV4dCwgdHlwZSBFbmFibGVDb250ZXh0VHlwZSB9IGZyb20gJy4vRW5hYmxlQ29udGV4dCc7XG5cbi8vIEhlbHBlcjogZ2V0IHJpZCBvZiBzb21lIGJvaWxlcnBsYXRlLlxuLy8ganVzdCBpbnB1dCBtYXNoaW5nIGFuZCBzYW5pdGF0aW9uLCByZW1vdmluZyBleHRyYSByZW5kZXJzLCBhbmQgZ2V0dGluZyB0ZXN0IGZ1bmN0aW9uXG5leHBvcnQgZnVuY3Rpb24gdXNlVGVzdEFuZENvbnZlcnQoXG4gIGlucHV0Pzogc3RyaW5nW10gfCBzdHJpbmcgfCBudWxsLFxuKTogW0VuYWJsZUNvbnRleHRUeXBlLCBzdHJpbmdbXV0ge1xuICBjb25zdCB0ZXN0ID0gdXNlQ29udGV4dChFbmFibGVDb250ZXh0KTtcblxuICAvLyBXZSBtZW1vaXplIGp1c3QgdG8gcHJldmVudCByZS1yZW5kZXJzIHNpbmNlIHRoaXMgY291bGQgYmUgYXQgdGhlIGxlYWYgb2YgYSB0cmVlXG4gIGNvbnN0IGNvbnZlcnRlZCA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKGlucHV0ID09IG51bGwgPyBbXSA6IEFycmF5LmlzQXJyYXkoaW5wdXQpID8gaW5wdXQgOiBbaW5wdXRdKSxcbiAgICBbaW5wdXRdLFxuICApO1xuXG4gIHJldHVybiBbdGVzdCwgY29udmVydGVkXTtcbn1cbiIsICJpbXBvcnQgeyBjcmVhdGVDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IHR5cGUgRW5hYmxlQ29udGV4dFR5cGUgPSAoZmVhdHVyZTogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG5cbi8qKlxuICogQ29udGFpbmVkIGZ1bmN0aW9uIGNhbiBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gZmVhdHVyZSBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgY29uc3QgRW5hYmxlQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8RW5hYmxlQ29udGV4dFR5cGU+KChfcykgPT4gZmFsc2UpO1xuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbGwgc3BlY2lmaWVkIGZlYXR1cmVzIGFyZSBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRGlzYWJsZWQod2l0aG91dEFsbDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsV2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0QWxsKTtcbiAgcmV0dXJuIChcbiAgICB3aXRob3V0QWxsLmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxXaXRob3V0LmV2ZXJ5KCh4KSA9PiAhKHRlc3QoeCkgPz8gZmFsc2UpKVxuICApO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZGlzYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURpc2FibGVkKHdpdGhvdXQ6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVdpdGhvdXRdID0gdXNlVGVzdEFuZENvbnZlcnQod2l0aG91dCk7XG4gIHJldHVybiBxdWVyeUFueVdpdGhvdXQuc29tZSgoeCkgPT4gISh0ZXN0KHgpID8/IGZhbHNlKSk7XG59XG4iLCAiLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogSlNYIHJlcXVpcmVzIFJlYWN0IGF0IHJ1bnRpbWVcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgdXNlQWxsRW5hYmxlZCB9IGZyb20gJy4vdXNlQWxsRW5hYmxlZCc7XG5pbXBvcnQgeyB1c2VFbmFibGVkIH0gZnJvbSAnLi91c2VFbmFibGVkJztcblxuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQcm9wcyB7XG4gIHJlYWRvbmx5IGZlYXR1cmU/OiBzdHJpbmdbXSB8IHN0cmluZztcbiAgcmVhZG9ubHkgYWxsRmVhdHVyZXM/OiBzdHJpbmdbXTtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn1cblxuLyoqXG4gKiBGZWF0dXJlIHdpbGwgYmUgZW5hYmxlZCBpZiBhbnkgZmVhdHVyZSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZCxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEVuYWJsZSh7XG4gIGZlYXR1cmUgPSBbXSxcbiAgYWxsRmVhdHVyZXMgPSBbXSxcbiAgY2hpbGRyZW4sXG59OiBFbmFibGVQcm9wcyk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGlzQW55ID0gdXNlRW5hYmxlZChmZWF0dXJlKTtcbiAgY29uc3QgaXNBbGwgPSB1c2VBbGxFbmFibGVkKGFsbEZlYXR1cmVzKTtcblxuICBpZiAoaXNBbnkgfHwgaXNBbGwpIHtcbiAgICByZXR1cm4gPD57Y2hpbGRyZW59PC8+O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXM6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFsbFByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoYWxsRmVhdHVyZXMpO1xuICByZXR1cm4gcXVlcnlBbGxQcmVzZW50Lmxlbmd0aCA+IDAgJiYgcXVlcnlBbGxQcmVzZW50LmV2ZXJ5KHRlc3QpO1xufVxuIiwgImltcG9ydCB7IHVzZVRlc3RBbmRDb252ZXJ0IH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmZiBhbnkgc3BlY2lmaWVkIGZlYXR1cmUgaXMgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRW5hYmxlZChmZWF0dXJlOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbnlQcmVzZW50XSA9IHVzZVRlc3RBbmRDb252ZXJ0KGZlYXR1cmUpO1xuICByZXR1cm4gcXVlcnlBbnlQcmVzZW50LnNvbWUodGVzdCk7XG59XG4iLCAiaW1wb3J0IFJlYWN0LCB7XG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VFZmZlY3QsXG4gIHVzZU1lbW8sXG4gIHVzZVJlZHVjZXIsXG4gIHVzZVJlZixcbn0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0IH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IGZlYXR1cmVzUmVkdWNlciwgaW5pdGlhbEZlYXR1cmVzU3RhdGUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHVzZUNvbnNvbGVPdmVycmlkZSBmcm9tICcuL3VzZUNvbnNvbGVPdmVycmlkZSc7XG5pbXBvcnQgdXNlUGVyc2lzdCwgeyBLRVkgfSBmcm9tICcuL3VzZVBlcnNpc3QnO1xuaW1wb3J0IHVzZVRlc3RDYWxsYmFjayBmcm9tICcuL3VzZVRlc3RDYWxsYmFjayc7XG5cbmludGVyZmFjZSBGZWF0dXJlUHJvcHMge1xuICByZWFkb25seSBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW107XG4gIHJlYWRvbmx5IGNoaWxkcmVuPzogUmVhY3ROb2RlO1xuICByZWFkb25seSBkaXNhYmxlQ29uc29sZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBTdG9yYWdlO1xufVxuXG4vKipcbiAqIEEgbW9yZSBiYXR0ZXJpZXMtZW5hYmxlZCBwYXJlbnQgY29tcG9uZW50IHRoYXQga2VlcHMgdHJhY2sgb2YgZmVhdHVyZSBzdGF0ZVxuICogaW50ZXJuYWxseSwgYW5kIGNyZWF0ZXMgd2luZG93LmZlYXR1cmUuZW5hYmxlKFwiZlwiKSBhbmQgd2luZG93LmZlYXR1cmUuZGlzYWJsZShcImZcIikuXG4gKiBLZWVwcyB0cmFjayBvZiBvdmVycmlkZXMgYW5kIGRlZmF1bHRzLCB3aXRoIGRlZmF1bHRzIHBvdGVudGlhbGx5IGNvbWluZyBmcm9tIHlvdXIgcHJvcHNcbiAqIGFuZCBvdmVycmlkZXMgYmVpbmcgcGVyc2lzdGVkIHRvIHlvdXIgY2hvaWNlIG9mIHN0b3JhZ2UgbGF5ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBGZWF0dXJlcyh7XG4gIGNoaWxkcmVuLFxuICBmZWF0dXJlcyxcbiAgZGlzYWJsZUNvbnNvbGUgPSBmYWxzZSxcbiAgc3RvcmFnZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZSxcbn06IEZlYXR1cmVQcm9wcyk6IEpTWC5FbGVtZW50IHtcbiAgLy8gQ2FwdHVyZSBvbmx5IGZpcnN0IHZhbHVlOyB3ZSBkb24ndCBjYXJlIGFib3V0IGZ1dHVyZSB1cGRhdGVzXG4gIGNvbnN0IGZlYXR1cmVzUmVmID0gdXNlUmVmKGZlYXR1cmVzKTtcbiAgY29uc3QgW292ZXJyaWRlc1N0YXRlLCBvdmVycmlkZXNEaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKFxuICAgIGZlYXR1cmVzUmVkdWNlcixcbiAgICBpbml0aWFsRmVhdHVyZXNTdGF0ZSxcbiAgKTtcbiAgY29uc3QgW2RlZmF1bHRzU3RhdGUsIGRlZmF1bHRzRGlzcGF0Y2hdID0gdXNlUmVkdWNlcihcbiAgICBmZWF0dXJlc1JlZHVjZXIsXG4gICAgaW5pdGlhbEZlYXR1cmVzU3RhdGUsXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLy8gTG9hZCBkZWZhdWx0c1xuICAgIGRlZmF1bHRzRGlzcGF0Y2goeyB0eXBlOiAnSU5JVCcsIGZlYXR1cmVzIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkZWZhdWx0c0Rpc3BhdGNoKHsgdHlwZTogJ0RFX0lOSVQnIH0pO1xuICAgIH07XG4gIH0sIFtmZWF0dXJlc10pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbGV0IGY6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4gfCB1bmRlZmluZWQ+ID0ge307XG4gICAgaWYgKHN0b3JhZ2UgIT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmVhdHVyZXNKc29uID0gc3RvcmFnZS5nZXRJdGVtKEtFWSk7XG4gICAgICAgIGlmIChmZWF0dXJlc0pzb24gIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGZoID0gSlNPTi5wYXJzZShmZWF0dXJlc0pzb24pO1xuICAgICAgICAgIGYgPSBmaC5vdmVycmlkZXM7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gQ2FuJ3QgcGFyc2Ugb3IgZ2V0IG9yIG90aGVyd2lzZTsgaWdub3JlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2Vycm9yIGluIGxvY2FsU3RvcmFnZScsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG92ZXJyaWRlc0Rpc3BhdGNoKHtcbiAgICAgIHR5cGU6ICdJTklUJyxcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlc1JlZi5jdXJyZW50XG4gICAgICAgIC5maWx0ZXIoKHgpID0+IHgubm9PdmVycmlkZSAhPT0gdHJ1ZSlcbiAgICAgICAgLm1hcCgoeCkgPT4gKHtcbiAgICAgICAgICBuYW1lOiB4Lm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHguZGVzY3JpcHRpb24sXG4gICAgICAgICAgZGVmYXVsdFZhbHVlOiBmPy5beC5uYW1lXSA/PyB1bmRlZmluZWQsXG4gICAgICAgIH0pKSxcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBvdmVycmlkZXNEaXNwYXRjaCh7IHR5cGU6ICdERV9JTklUJyB9KTtcbiAgICB9O1xuICB9LCBbc3RvcmFnZV0pO1xuXG4gIC8vIEhhbmRsZSBhc3luYyBvcGVyYXRpb25zIGZvciBmZWF0dXJlcyB3aXRoIG9uQ2hhbmdlRGVmYXVsdFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkZWZhdWx0c1N0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGZlYXR1cmVzIGluIGFzeW5jIHN0YXRlcyBhbmQgaGFuZGxlIHRoZW1cbiAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0c1N0YXRlLmNvbnRleHQuZmVhdHVyZXMpLmZvckVhY2goXG4gICAgICAoW25hbWUsIGZlYXR1cmVdKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmZWF0dXJlLnZhbHVlID09PSAnYXN5bmNFbmFibGVkJyB8fFxuICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0Rpc2FibGVkJyB8fFxuICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY1Vuc3BlY2lmaWVkJ1xuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRWYWx1ZSA9XG4gICAgICAgICAgICBmZWF0dXJlLnZhbHVlID09PSAnYXN5bmNFbmFibGVkJ1xuICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgOiBmZWF0dXJlLnZhbHVlID09PSAnYXN5bmNEaXNhYmxlZCdcbiAgICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCBvbkNoYW5nZURlZmF1bHQgPSBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQ7XG4gICAgICAgICAgaWYgKG9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsICYmIGZlYXR1cmUuZmVhdHVyZURlc2MgIT0gbnVsbCkge1xuICAgICAgICAgICAgb25DaGFuZ2VEZWZhdWx0KGZlYXR1cmUuZmVhdHVyZURlc2MubmFtZSwgdGFyZ2V0VmFsdWUpXG4gICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0c0Rpc3BhdGNoKHsgdHlwZTogJ0FTWU5DX0RPTkUnLCBuYW1lLCB2YWx1ZTogcmVzdWx0IH0pO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzRGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ0FTWU5DX0RPTkUnLFxuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9LCBbZGVmYXVsdHNTdGF0ZV0pO1xuXG4gIHVzZVBlcnNpc3Qoc3RvcmFnZSwgZmVhdHVyZXNSZWYuY3VycmVudCwgb3ZlcnJpZGVzU3RhdGUpO1xuXG4gIGNvbnN0IHRlc3RDYWxsYmFjayA9IHVzZVRlc3RDYWxsYmFjayhvdmVycmlkZXNTdGF0ZSwgZGVmYXVsdHNTdGF0ZSk7XG4gIHVzZUNvbnNvbGVPdmVycmlkZShcbiAgICAhZGlzYWJsZUNvbnNvbGUsXG4gICAgZmVhdHVyZXNSZWYuY3VycmVudCxcbiAgICB0ZXN0Q2FsbGJhY2ssXG4gICAgZGVmYXVsdHNEaXNwYXRjaCxcbiAgKTtcblxuICBjb25zdCBmZWF0dXJlVmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBvdmVycmlkZXNTZW5kOiBvdmVycmlkZXNEaXNwYXRjaCxcbiAgICAgIGRlZmF1bHRzU2VuZDogZGVmYXVsdHNEaXNwYXRjaCxcbiAgICAgIGZlYXR1cmVzRGVzY3JpcHRpb246IGZlYXR1cmVzUmVmLmN1cnJlbnQsXG4gICAgICBvdmVycmlkZXNTdGF0ZSxcbiAgICAgIGRlZmF1bHRzU3RhdGUsXG4gICAgICB0ZXN0OiB0ZXN0Q2FsbGJhY2ssXG4gICAgfSksXG4gICAgW292ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlLCB0ZXN0Q2FsbGJhY2tdLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPEZlYXR1cmVDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtmZWF0dXJlVmFsdWV9PlxuICAgICAgPEVuYWJsZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3Rlc3RDYWxsYmFja30+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvRW5hYmxlQ29udGV4dC5Qcm92aWRlcj5cbiAgICA8L0ZlYXR1cmVDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlc0Rpc3BhdGNoLCBGZWF0dXJlc1N0YXRlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcblxuZXhwb3J0IGNvbnN0IEZlYXR1cmVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxGZWF0dXJlQ29udGV4dFR5cGUgfCBudWxsPihudWxsKTtcblxuLy8vIEdpdmUgYWNjZXNzIHRvIHRoZSBvdmVycmlkZXMgbGF5ZXJcbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUNvbnRleHRUeXBlIHtcbiAgLy8gTWFrZSBjaGFuZ2VzIHRvIHRoZSBvdmVycmlkZXNcbiAgb3ZlcnJpZGVzU2VuZDogRmVhdHVyZXNEaXNwYXRjaDtcblxuICAvLyBNYWtlIGNoYW5nZXMgdG8gZGVmYXVsdHNcbiAgZGVmYXVsdHNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIGZlYXR1cmVzRGVzY3JpcHRpb246IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuXG4gIC8vIFN0YXRlIGlzIGluIGxheWVyczsgb3ZlcnJpZGVzIGFuZCBkZWZhdWx0c1xuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcbiAgZGVmYXVsdHNTdGF0ZTogRmVhdHVyZXNTdGF0ZTtcblxuICAvLy8gVGVzdCB3aXRoIHByb3BlciBmYWxsYmFjayBhbmQgcmVzcGVjdGluZyB0aGUgdXNlcidzIGZvcmNlIHByZWZlcmVuY2VcbiAgdGVzdDogKGZsYWc6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRGlzcGF0Y2ggfSBmcm9tICdyZWFjdCc7XG5cbi8qKlxuICogRmVhdHVyZSBpcyBlaXRoZXIgb24sIG9mZiwgb3IgJ3Vuc2V0JyxcbiAqIHdoaWNoIG1lYW5zIGl0IHdpbGwgZ28gdG8gdGhlIGRlZmF1bHQgdmFsdWUgb3IgdGhlIGxlc3Mgc3BlY2lmaWMgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIEZlYXR1cmVWYWx1ZSA9IGZhbHNlIHwgdHJ1ZSB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IHR5cGUgRmVhdHVyZVN0YXRlVmFsdWUgPVxuICB8ICdpbml0aWFsJ1xuICB8ICdlbmFibGVkJ1xuICB8ICdkaXNhYmxlZCdcbiAgfCAndW5zcGVjaWZpZWQnXG4gIHwgJ2FzeW5jRW5hYmxlZCdcbiAgfCAnYXN5bmNEaXNhYmxlZCdcbiAgfCAnYXN5bmNVbnNwZWNpZmllZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZVN0YXRlIHtcbiAgdmFsdWU6IEZlYXR1cmVTdGF0ZVZhbHVlO1xuICBmZWF0dXJlRGVzYz86IEZlYXR1cmVEZXNjcmlwdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZURpc3BhdGNoID0gRGlzcGF0Y2g8RmVhdHVyZUFjdGlvbj47XG5cbi8vLyBHaXZlbiBhIGZlYXR1cmVzdGF0ZSwgZGV0ZXJtaW5lIHRoZSB2YWx1ZSAob24sIG9mZiwgb3IgdW5zZXQpXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVGb3JTdGF0ZShcbiAgZmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUsXG4pOiBbRmVhdHVyZVZhbHVlLCBib29sZWFuXSB7XG4gIHJldHVybiBbXG4gICAgZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnZW5hYmxlZCcgfHwgZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnYXN5bmNFbmFibGVkJ1xuICAgICAgPyB0cnVlXG4gICAgICA6IGZlYXR1cmVTdGF0ZS52YWx1ZSA9PT0gJ2Rpc2FibGVkJyB8fFxuICAgICAgICAgIGZlYXR1cmVTdGF0ZS52YWx1ZSA9PT0gJ2FzeW5jRGlzYWJsZWQnXG4gICAgICAgID8gZmFsc2VcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgZmVhdHVyZVN0YXRlLmZlYXR1cmVEZXNjPy5mb3JjZSA/PyBmYWxzZSxcbiAgXTtcbn1cblxuLyoqXG4gKiBEZWZpbml0aW9uIG9mIGEgZmVhdHVyZSB0aGF0IGNhbiBiZSBlbmFibGVkIG9yIGRpc2FibGVkLlxuICogSyBpcyB0aGUgdHlwZSBvZiB0aGUga2V5IHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlRGVzY3JpcHRpb248SyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4ge1xuICByZWFkb25seSBuYW1lOiBLO1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvLy8gSWYgc2V0LCB3aWxsIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBmZWF0dXJlIGRlZmF1bHQgc3RhdGUgaW5zdGVhZCBvZiBzaW1wbHkgb3ZlcnJpZGluZy5cbiAgLy8vIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgdXNlIHRoaXMgdG8gdXBkYXRlIGEgZmVhdHVyZSBmbGFnIG9uIGEgYmFja2VuZCBzZXJ2ZXIuXG4gIC8vLyB3aGVuIHNldCwgdGhlIGZlYXR1cmUgd2lsbCBiZSB1cGRhdGVkIG9uIHRoZSBiYWNrZW5kIHNlcnZlciwgYW5kIHRoZSByZXN1bHQgb2YgdGhlIGFzeW5jXG4gIC8vLyB3aWxsIGJlIHVzZWQgZm9yIHRoZSBmaW5hbCBzdGF0ZSBhZnRlciB0aGUgY2hhbmdlLiB3aGlsZSBjaGFuZ2luZywgdGhlIGZlYXR1cmUgd2lsbCBiZVxuICAvLy8gaW4gdGhlICdjaGFuZ2luZycgc3RhdGUuIEFsc28gbm90ZSB0aGF0IHRoZSBmZWF0dXJlIHdpbGwgYmUgY2hhbmdlZCBhdCB0aGUgXCJkZWZhdWx0XCIgbGF5ZXIuXG4gIHJlYWRvbmx5IG9uQ2hhbmdlRGVmYXVsdD86IChcbiAgICBuYW1lOiBLLFxuICAgIG5ld1ZhbHVlOiBGZWF0dXJlVmFsdWUsXG4gICkgPT4gUHJvbWlzZTxGZWF0dXJlVmFsdWU+O1xuXG4gIC8vLyBpZiBzZXQgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgZmllbGQgdG8gd2hhdCBpdCBpcyBzZXQgaGVyZSB0aHJvdWdoIGxheWVycyBvZiBzdGF0ZXMuXG4gIC8vLyB1c2VmdWwgdG8gaW52ZXJ0IHRoZSBsYXllcnMsIHNpbWlsYXIgdG8gIWltcG9ydGFudCBpbiBDU1MuXG4gIHJlYWRvbmx5IGZvcmNlPzogYm9vbGVhbjtcblxuICAvLy8gSWYgc2V0IHRvIHRydWUsIHRoZSBmZWF0dXJlIHdpbGwgbm90IGJlIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLlxuICByZWFkb25seSBub092ZXJyaWRlPzogYm9vbGVhbjtcblxuICAvLy8gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgdGhlIGZlYXR1cmUgaXMgbm90IHNldCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuXG4gIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZT86IEZlYXR1cmVWYWx1ZTtcbn1cblxuLyoqXG4gKiBBY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhIGZlYXR1cmUuXG4gKi9cbmV4cG9ydCB0eXBlIEZlYXR1cmVBY3Rpb24gPVxuICB8IHsgdHlwZTogJ0RJU0FCTEUnIH1cbiAgfCB7IHR5cGU6ICdFTkFCTEUnIH1cbiAgfCB7IHR5cGU6ICdJTklUJzsgZmVhdHVyZTogRmVhdHVyZURlc2NyaXB0aW9uIH1cbiAgfCB7IHR5cGU6ICdTRVQnOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH1cbiAgfCB7IHR5cGU6ICdUT0dHTEUnIH1cbiAgfCB7IHR5cGU6ICdVTlNFVCcgfVxuICB8IHsgdHlwZTogJ0FTWU5DX0RPTkUnOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH07XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsRmVhdHVyZVN0YXRlOiBGZWF0dXJlU3RhdGUgPSB7XG4gIHZhbHVlOiAnaW5pdGlhbCcsXG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIG1hbmFnaW5nIGluZGl2aWR1YWwgZmVhdHVyZSBzdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZVJlZHVjZXIoXG4gIHN0YXRlOiBGZWF0dXJlU3RhdGUsXG4gIGFjdGlvbjogRmVhdHVyZUFjdGlvbixcbik6IEZlYXR1cmVTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdJTklUJzoge1xuICAgICAgY29uc3QgeyBmZWF0dXJlIH0gPSBhY3Rpb247XG4gICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlXG4gICAgICAgICAgPyAnZW5hYmxlZCdcbiAgICAgICAgICA6IGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICA6ICd1bnNwZWNpZmllZCc7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUgYXMgRmVhdHVyZVN0YXRlVmFsdWUsXG4gICAgICAgIGZlYXR1cmVEZXNjOiBmZWF0dXJlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdFTkFCTEUnOiB7XG4gICAgICBpZiAoc3RhdGUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2FzeW5jRW5hYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2VuYWJsZWQnIH07XG4gICAgfVxuXG4gICAgY2FzZSAnRElTQUJMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNEaXNhYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2Rpc2FibGVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1RPR0dMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNFbmFibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICB9XG5cbiAgICBjYXNlICdVTlNFVCc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNVbnNwZWNpZmllZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ3Vuc3BlY2lmaWVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1NFVCc6IHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGFjdGlvbjtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNFbmFibGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0Rpc2FibGVkJyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2FzeW5jVW5zcGVjaWZpZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICd1bnNwZWNpZmllZCcgfTtcbiAgICB9XG5cbiAgICBjYXNlICdBU1lOQ19ET05FJzoge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2VuYWJsZWQnIH07XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2Rpc2FibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAndW5zcGVjaWZpZWQnIH07XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgRGlzcGF0Y2ggfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7XG4gIHR5cGUgRmVhdHVyZURlc2NyaXB0aW9uLFxuICB0eXBlIEZlYXR1cmVTdGF0ZSxcbiAgdHlwZSBGZWF0dXJlVmFsdWUsXG4gIHZhbHVlRm9yU3RhdGUsXG59IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlc0NvbnRleHQge1xuICAvLyBmZWF0dXJlcyBhcmUgbGF5ZXJlZDpcbiAgLy8gIC0gZGVmYXVsdHM6IGlmIG5vdGhpbmcgZWxzZSBtYXRjaGVzLCBwcm92aWRlZCBhIHZhbHVlIGZvciBmZWF0dXJlXG4gIC8vICAtIGJyb3dzZXI6IGJyb3dzZXItbG9jYWwgdmFsdWVzIGZvciBmZWF0dXJlcyAoa2VwdCBpbiBsb2NhbCBzdG9yYWdlLCBldGMpXG4gIC8vICAtIHVzZXI6IHZhbHVlcyBmcm9tIHRoZSB1c2VyJ3MgcHJvZmlsZSwgaWYgYW55XG4gIC8vICAtIG9yZzogdmFsdWUgZnJvbSB0aGUgb3JnJ3MgcHJvZmlsZSwgaWYgYW55XG4gIGZlYXR1cmVzOiB7IFt4OiBzdHJpbmddOiBGZWF0dXJlU3RhdGUgfTtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNBY3Rpb24gPVxuICB8IHsgdHlwZTogJ0RFX0lOSVQnIH1cbiAgfCB7IHR5cGU6ICdESVNBQkxFJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdFTkFCTEUnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10gfVxuICB8IHsgdHlwZTogJ1NFVF9BTEwnOyBmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSB9XG4gIHwgeyB0eXBlOiAnU0VUJzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH1cbiAgfCB7IHR5cGU6ICdUT0dHTEUnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ1VOU0VUJzsgbmFtZTogc3RyaW5nIH1cbiAgfCB7IHR5cGU6ICdBU1lOQ19ET05FJzsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmVhdHVyZVZhbHVlIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZXNTdGF0ZSB7XG4gIHZhbHVlOiAnaWRsZScgfCAncmVhZHknO1xuICBjb250ZXh0OiBGZWF0dXJlc0NvbnRleHQ7XG59XG5cbmV4cG9ydCB0eXBlIEZlYXR1cmVzRGlzcGF0Y2ggPSBEaXNwYXRjaDxGZWF0dXJlc0FjdGlvbj47XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZU9mRmVhdHVyZShcbiAgZmVhdHVyZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgZmVhdHVyZTogc3RyaW5nLFxuKTogW0ZlYXR1cmVWYWx1ZSwgYm9vbGVhbl0ge1xuICBpZiAoZmVhdHVyZXNTdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2ZlYXR1cmVdID09IG51bGwpIHtcbiAgICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xuICB9XG4gIGNvbnN0IGZlYXR1cmVTdGF0ZSA9IGZlYXR1cmVzU3RhdGUuY29udGV4dC5mZWF0dXJlc1tmZWF0dXJlXTtcbiAgaWYgKGZlYXR1cmVTdGF0ZSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlRm9yU3RhdGUoZmVhdHVyZVN0YXRlKTtcbiAgfVxuICByZXR1cm4gW3VuZGVmaW5lZCwgZmFsc2VdO1xufVxuXG5leHBvcnQgY29uc3QgaW5pdGlhbEZlYXR1cmVzU3RhdGU6IEZlYXR1cmVzU3RhdGUgPSB7XG4gIHZhbHVlOiAnaWRsZScsXG4gIGNvbnRleHQ6IHtcbiAgICBmZWF0dXJlczoge30sXG4gIH0sXG59O1xuXG4vKipcbiAqIFJlZHVjZXIgZm9yIG1hbmFnaW5nIGEgY29sbGVjdGlvbiBvZiBmZWF0dXJlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZXNSZWR1Y2VyKFxuICBzdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbiAgYWN0aW9uOiBGZWF0dXJlc0FjdGlvbixcbik6IEZlYXR1cmVzU3RhdGUge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnSU5JVCc6IHtcbiAgICAgIGlmIChhY3Rpb24uZmVhdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEZlYXR1cmVTdGF0ZSB9ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGZlYXR1cmUgb2YgYWN0aW9uLmZlYXR1cmVzKSB7XG4gICAgICAgIC8vIEluaXRpYWxpemUgZWFjaCBmZWF0dXJlXG4gICAgICAgIGNvbnN0IGZlYXR1cmVTdGF0ZSA9IHtcbiAgICAgICAgICB2YWx1ZTpcbiAgICAgICAgICAgIGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSB0cnVlXG4gICAgICAgICAgICAgID8gKCdlbmFibGVkJyBhcyBjb25zdClcbiAgICAgICAgICAgICAgOiBmZWF0dXJlLmRlZmF1bHRWYWx1ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICA/ICgnZGlzYWJsZWQnIGFzIGNvbnN0KVxuICAgICAgICAgICAgICAgIDogKCd1bnNwZWNpZmllZCcgYXMgY29uc3QpLFxuICAgICAgICAgIGZlYXR1cmVEZXNjOiBmZWF0dXJlLFxuICAgICAgICB9O1xuICAgICAgICBmZWF0dXJlc1tmZWF0dXJlLm5hbWVdID0gZmVhdHVyZVN0YXRlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogJ3JlYWR5JyxcbiAgICAgICAgY29udGV4dDogeyBmZWF0dXJlcyB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdERV9JTklUJzoge1xuICAgICAgcmV0dXJuIGluaXRpYWxGZWF0dXJlc1N0YXRlO1xuICAgIH1cblxuICAgIGNhc2UgJ1NFVF9BTEwnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlcyA9IHsgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyB9O1xuICAgICAgT2JqZWN0LmtleXMoZmVhdHVyZXMpLmZvckVhY2goKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhY3Rpb24uZmVhdHVyZXNbbmFtZV0gPz8gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBjdXJyZW50RmVhdHVyZSA9IGZlYXR1cmVzW25hbWVdO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdhc3luY0VuYWJsZWQnIH07XG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdhc3luY0Rpc2FibGVkJyB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAnYXN5bmNVbnNwZWNpZmllZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0gPSB7IC4uLmN1cnJlbnRGZWF0dXJlLCB2YWx1ZTogJ2Rpc2FibGVkJyB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAndW5zcGVjaWZpZWQnIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHsgZmVhdHVyZXMgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnU0VUJzoge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZSA9IHN0YXRlLmNvbnRleHQuZmVhdHVyZXNbYWN0aW9uLm5hbWVdO1xuICAgICAgaWYgKGZlYXR1cmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGFjdGlvbjtcbiAgICAgIGxldCBuZXdWYWx1ZTogRmVhdHVyZVN0YXRlWyd2YWx1ZSddO1xuXG4gICAgICBpZiAoZmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAnYXN5bmNFbmFibGVkJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdhc3luY0Rpc2FibGVkJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdhc3luY1Vuc3BlY2lmaWVkJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAnZW5hYmxlZCc7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAnZGlzYWJsZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gJ3Vuc3BlY2lmaWVkJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdUT0dHTEUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbFxuICAgICAgICAgID8gJ2FzeW5jRW5hYmxlZCdcbiAgICAgICAgICA6ICdlbmFibGVkJztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyxcbiAgICAgICAgICAgIFthY3Rpb24ubmFtZV06IHsgLi4uZmVhdHVyZSwgdmFsdWU6IG5ld1ZhbHVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnRU5BQkxFJzoge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZSA9IHN0YXRlLmNvbnRleHQuZmVhdHVyZXNbYWN0aW9uLm5hbWVdO1xuICAgICAgaWYgKGZlYXR1cmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgZmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGxcbiAgICAgICAgICA/ICdhc3luY0VuYWJsZWQnXG4gICAgICAgICAgOiAnZW5hYmxlZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0RJU0FCTEUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbFxuICAgICAgICAgID8gJ2FzeW5jRGlzYWJsZWQnXG4gICAgICAgICAgOiAnZGlzYWJsZWQnO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdVTlNFVCc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsXG4gICAgICAgICAgPyAnYXN5bmNVbnNwZWNpZmllZCdcbiAgICAgICAgICA6ICd1bnNwZWNpZmllZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0FTWU5DX0RPTkUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICB2YWx1ZSA9PT0gdHJ1ZVxuICAgICAgICAgID8gJ2VuYWJsZWQnXG4gICAgICAgICAgOiB2YWx1ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgID8gJ2Rpc2FibGVkJ1xuICAgICAgICAgICAgOiAndW5zcGVjaWZpZWQnO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZXNEaXNwYXRjaCB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgeyBHbG9iYWxFbmFibGUgfSBmcm9tICcuL0dsb2JhbEVuYWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZUNvbnNvbGVPdmVycmlkZShcbiAgY29uc29sZU92ZXJyaWRlOiBib29sZWFuLFxuICBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10sXG4gIHRlc3RGZWF0dXJlOiAoXzogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWUsXG4gIGRpc3BhdGNoOiBGZWF0dXJlc0Rpc3BhdGNoLFxuKTogdm9pZCB7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjb25zb2xlT3ZlcnJpZGUpIHtcbiAgICAgIC8vIENsZWFuIHVwIHdpbmRvdy5mZWF0dXJlIGltbWVkaWF0ZWx5IGlmIGNvbnNvbGVPdmVycmlkZSBpcyBkaXNhYmxlZFxuICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgd2luZG93LmZlYXR1cmUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICAgIHdpbmRvdy5mZWF0dXJlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cuZmVhdHVyZSA9IG5ldyBHbG9iYWxFbmFibGUoZGlzcGF0Y2gsIHRlc3RGZWF0dXJlLCBmZWF0dXJlcyk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmICh3aW5kb3cuZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgIHdpbmRvdy5mZWF0dXJlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG4gIH0sIFtmZWF0dXJlcywgZGlzcGF0Y2gsIGNvbnNvbGVPdmVycmlkZSwgdGVzdEZlYXR1cmVdKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlc0Rpc3BhdGNoIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcblxuZXhwb3J0IGNsYXNzIEdsb2JhbEVuYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmVhdHVyZURlc2M6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3BhdGNoOiBGZWF0dXJlc0Rpc3BhdGNoO1xuICBwcml2YXRlIHJlYWRvbmx5IHRlc3RGZWF0dXJlOiAodmFsdWU6IHN0cmluZykgPT4gRmVhdHVyZVZhbHVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRpc3BhdGNoOiBGZWF0dXJlc0Rpc3BhdGNoLFxuICAgIHRlc3RGZWF0dXJlOiAoXzogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWUsXG4gICAgZmVhdHVyZURlc2M6IHJlYWRvbmx5IEZlYXR1cmVEZXNjcmlwdGlvbltdLFxuICApIHtcbiAgICB0aGlzLmZlYXR1cmVEZXNjID0gZmVhdHVyZURlc2M7XG4gICAgdGhpcy5kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIHRoaXMudGVzdEZlYXR1cmUgPSB0ZXN0RmVhdHVyZTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdUT0dHTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIGVuYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgdW5zZXQoZmVhdHVyZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ0RJU0FCTEUnLCBuYW1lOiBmZWF0dXJlIH0pO1xuICB9XG5cbiAgcHVibGljIHNldEFsbChmZWF0dXJlczogeyBba2V5OiBzdHJpbmddOiBGZWF0dXJlVmFsdWUgfSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnU0VUX0FMTCcsIGZlYXR1cmVzIH0pO1xuICB9XG5cbiAgcHVibGljIGxpc3RGZWF0dXJlcygpOiByZWFkb25seSBbc3RyaW5nLCBGZWF0dXJlVmFsdWVdW10ge1xuICAgIHJldHVybiB0aGlzLmZlYXR1cmVEZXNjLm1hcCgoZikgPT4gW2YubmFtZSwgdGhpcy50ZXN0RmVhdHVyZShmLm5hbWUpXSk7XG4gIH1cbn1cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgZmVhdHVyZT86IEdsb2JhbEVuYWJsZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgeyB0eXBlIEZlYXR1cmVzU3RhdGUsIHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcblxuZXhwb3J0IGNvbnN0IEtFWSA9ICdyZWFjdC1lbmFibGU6ZmVhdHVyZS12YWx1ZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VQZXJzaXN0KFxuICBzdG9yYWdlOiBTdG9yYWdlIHwgdW5kZWZpbmVkLFxuICBmZWF0dXJlczogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10sXG4gIG92ZXJyaWRlU3RhdGU6IEZlYXR1cmVzU3RhdGUsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgbmV3T3ZlcnJpZGVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9ID0ge307XG4gICAgaWYgKG92ZXJyaWRlU3RhdGUudmFsdWUgPT09ICdyZWFkeScpIHtcbiAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBmZWF0dXJlcykge1xuICAgICAgICBjb25zdCBbdmFsdWVdID0gdmFsdWVPZkZlYXR1cmUob3ZlcnJpZGVTdGF0ZSwgZmVhdHVyZS5uYW1lKTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBuZXdPdmVycmlkZXNbZmVhdHVyZS5uYW1lXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdPdmVycmlkZXM7XG4gIH0sIFtmZWF0dXJlcywgb3ZlcnJpZGVTdGF0ZV0pO1xuXG4gIGNvbnN0IHN0clN0YXRlID1cbiAgICBPYmplY3Qua2V5cyhvdmVycmlkZXMpLmxlbmd0aCA9PT0gMCB8fCBzdG9yYWdlID09IG51bGxcbiAgICAgID8gJ3t9J1xuICAgICAgOiBKU09OLnN0cmluZ2lmeSh7IG92ZXJyaWRlcyB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoc3RvcmFnZSAhPSBudWxsICYmIG92ZXJyaWRlU3RhdGUudmFsdWUgPT09ICdyZWFkeScpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKEtFWSwgc3RyU3RhdGUpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIENhbid0IHNldCBmb3Igc29tZSByZWFzb25cbiAgICB9XG4gIH0sIFtvdmVycmlkZVN0YXRlLCBzdG9yYWdlLCBzdHJTdGF0ZV0pO1xufVxuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVzU3RhdGUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuaW1wb3J0IHRlc3RGZWF0dXJlIGZyb20gJy4vdGVzdEZlYXR1cmUnO1xuXG4vLy8gQSBjYWxsYmFjayB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gdGVzdCBpZiBhIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBkaXNhYmxlZFxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlVGVzdENhbGxiYWNrKFxuICBkZWZhdWx0c1N0YXRlOiBGZWF0dXJlc1N0YXRlLFxuICBvdmVycmlkZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbik6IChmZWF0dXJlOiBzdHJpbmcpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdXNlQ2FsbGJhY2soXG4gICAgKGY6IHN0cmluZykgPT4gdGVzdEZlYXR1cmUoZiwgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSksXG4gICAgW2RlZmF1bHRzU3RhdGUsIG92ZXJyaWRlc1N0YXRlXSxcbiAgKTtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IHR5cGUgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG4vKiogRGV0ZXJtaW5lIGlmIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQgaW4gb25lIG9mIHRoZSBzdGF0ZSBtYWNoaW5lcywgaW4gb3JkZXJcbiAqXG4gKiBAcGFyYW0gc3RhdGUgVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1hY2hpbmVcbiAqIEBwYXJhbSBmZWF0dXJlIFRoZSBmZWF0dXJlIHRvIGNoZWNrXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGVzdEZlYXR1cmUoXG4gIGZlYXR1cmU6IHN0cmluZyxcbiAgc3RhdGVzOiBGZWF0dXJlc1N0YXRlW10sXG4pOiBGZWF0dXJlVmFsdWUge1xuICBjb25zdCB2YWx1ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSkgPT4gdmFsdWVPZkZlYXR1cmUoc3RhdGUsIGZlYXR1cmUpKTtcblxuICAvLyBsb29rIGZvciBiZXN0IGZvcmNlZCBvcHRpb24sIGluIG9yZGVyXG4gIGZvciAoY29uc3QgW2ZlYXR1cmVWYWx1ZSwgZmVhdHVyZUZvcmNlZF0gb2YgdmFsdWVzKSB7XG4gICAgaWYgKGZlYXR1cmVWYWx1ZSAhPSBudWxsICYmIGZlYXR1cmVGb3JjZWQpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gbG9vayBmb3IgYmVzdCBub24tZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBmZWF0dXJlVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gdW5zZXQgaWYgbm90aGluZyBoaXRcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgeyBSYWRpb0dyb3VwIH0gZnJvbSAnQGhlYWRsZXNzdWkvcmVhY3QnO1xuaW1wb3J0IFJlYWN0LCB7XG4gIHR5cGUgUmVhY3ROb2RlLFxuICB1c2VDYWxsYmFjayxcbiAgdXNlQ29udGV4dCxcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5pbXBvcnQgeyBGZWF0dXJlQ29udGV4dCB9IGZyb20gJy4vRmVhdHVyZUNvbnRleHQnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRGVzY3JpcHRpb24gfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgeyB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG4vLyBAdHMtZXhwZWN0LWVycm9yIGJ1bmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpc1xuaW1wb3J0IHN0eWxlcyBmcm9tICcuL3RhaWx3aW5kLmNzcyc7XG5cbmZ1bmN0aW9uIGNsYXNzTmFtZXMoLi4uY2xhc3Nlczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gY2xhc3Nlcy5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiBUb2dnbGVGZWF0dXJlKHtcbiAgZmVhdHVyZSxcbn06IHtcbiAgZmVhdHVyZTogRmVhdHVyZURlc2NyaXB0aW9uO1xufSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KEZlYXR1cmVDb250ZXh0KTtcbiAgY29uc3QgaGFuZGxlQ2hhbmdlU2VsZWN0aW9uID0gdXNlQ2FsbGJhY2soXG4gICAgKHZhbHVlOiAnZmFsc2UnIHwgJ3RydWUnIHwgJ3Vuc2V0JykgPT4ge1xuICAgICAgaWYgKGNvbnRleHQ/Lm92ZXJyaWRlc1NlbmQgIT0gbnVsbCkge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgY2FzZSAndHJ1ZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdFTkFCTEUnLCBuYW1lOiBmZWF0dXJlLm5hbWUgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnZmFsc2UnOiB7XG4gICAgICAgICAgICBjb250ZXh0Lm92ZXJyaWRlc1NlbmQoeyB0eXBlOiAnRElTQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1bnNldCc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdVTlNFVCcsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZlYXR1cmUubmFtZSwgY29udGV4dF0sXG4gICk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBvdmVycmlkZXNTdGF0ZSwgdGVzdDogdGVzdEZlYXR1cmUsIGRlZmF1bHRzU3RhdGUgfSA9IGNvbnRleHQ7XG5cbiAgY29uc3QgdmFsdWVJbkRlZmF1bHRzID0gKFxuICAgIHZhbHVlT2ZGZWF0dXJlKGRlZmF1bHRzU3RhdGUsIGZlYXR1cmUubmFtZSlbMF0gPz8gJ3Vuc2V0J1xuICApLnRvU3RyaW5nKCkgYXMgJ2ZhbHNlJyB8ICd0cnVlJyB8ICd1bnNldCc7XG5cbiAgY29uc3QgdmFsdWVJbk92ZXJyaWRlcyA9IChcbiAgICB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZXNTdGF0ZSwgZmVhdHVyZS5uYW1lKVswXSA/PyAndW5zZXQnXG4gICkudG9TdHJpbmcoKSBhcyAnZmFsc2UnIHwgJ3RydWUnIHwgJ3Vuc2V0JztcblxuICBjb25zdCBhY3R1YWxDaGVja2VkID0gdGVzdEZlYXR1cmUoZmVhdHVyZS5uYW1lKTtcblxuICByZXR1cm4gKFxuICAgIDxSYWRpb0dyb3VwXG4gICAgICBkaXNhYmxlZD17ZmVhdHVyZS5ub092ZXJyaWRlfVxuICAgICAgb25DaGFuZ2U9e2hhbmRsZUNoYW5nZVNlbGVjdGlvbn1cbiAgICAgIHZhbHVlPXt2YWx1ZUluT3ZlcnJpZGVzfVxuICAgID5cbiAgICAgIDxSYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgICA8aDYgY2xhc3NOYW1lPVwidGV4dC1ncmF5LTkwMCBhbGlnbi1jZW50ZXIgZmxleCBmbGV4LXJvdyBmbGV4LW5vd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLTIgbGc6Z2FwLTQgaC03XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgIEZlYXR1cmU6IDxjb2RlPntmZWF0dXJlLm5hbWV9PC9jb2RlPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB7ZmVhdHVyZS5ub092ZXJyaWRlID09PSB0cnVlID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItb3JhbmdlLTUwMCB0ZXh0LW9yYW5nZS01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk01IDlWN2E1IDUgMCAwMTEwIDB2MmEyIDIgMCAwMTIgMnY1YTIgMiAwIDAxLTIgMkg1YTIgMiAwIDAxLTItMnYtNWEyIDIgMCAwMTItMnptOC0ydjJIN1Y3YTMgMyAwIDAxNiAwelwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2Pk5vIE92ZXJyaWRlczwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAge2FjdHVhbENoZWNrZWQgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1ub3dyYXAgdGV4dC14cyB0ZXh0LWdyZWVuLTUwMCBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWdyZWVuLTUwMCBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC00IHctNCBtaW4tdy00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgPGRpdj57YWN0dWFsQ2hlY2tlZCA/ICdFbmFibGVkJyA6ICdEaXNhYmxlZCd9PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPC9oNj5cbiAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1iYXNlIHRleHQtZ3JheS01MDAgdGV4dC1zbVwiPlxuICAgICAgICAgICAge2ZlYXR1cmUuZGVzY3JpcHRpb259XG4gICAgICAgICAgPC9wPlxuICAgICAgICApfVxuICAgICAgPC9SYWRpb0dyb3VwLkxhYmVsPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IGdyaWQgZ3JpZC1jb2xzLTEgZ2FwLXktNiBzbTpncmlkLWNvbHMtMyBzbTpnYXAteC00XCI+XG4gICAgICAgIHtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdmYWxzZScsXG4gICAgICAgICAgICB0aXRsZTogYERpc2FibGUgJHtmZWF0dXJlLm5hbWV9YCxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnT3ZlcnJpZGUgdGhlIGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd1bnNldCcsXG4gICAgICAgICAgICB0aXRsZTogJ0RlZmF1bHQnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdJbmhlcml0IGVuYWJsZWQgc3RhdGUgZnJvbSBkZWZhdWx0cycsXG4gICAgICAgICAgICBkaXNhYmxlZDogKGZlYXR1cmUubm9PdmVycmlkZSA/PyBmYWxzZSkgfHwgZmVhdHVyZS5mb3JjZSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTpcbiAgICAgICAgICAgICAgdmFsdWVJbkRlZmF1bHRzID09PSAndHJ1ZScgPyAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWdyZWVuLTUwMCBib3JkZXItZ3JlZW4tNTAwIGZsZXggZmxleC1ub3dyYXAgdGV4dC14cyBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5FbmFibGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1yZWQtNTAwIGJvcmRlci1yZWQtNTAwIGZsZXggZmxleC1ub3dyYXAgdGV4dC14cyBmbGV4LXJvdyBnYXAtMSByb3VuZGVkLXNtIGJvcmRlciBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHgtMiBweS0xXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5EaXNhYmxlZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAndHJ1ZScsXG4gICAgICAgICAgICB0aXRsZTogYEVuYWJsZSAke2ZlYXR1cmUubmFtZX1gLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPdmVycmlkZSB0aGUgZmVhdHVyZSB0byBiZSBlbmFibGVkJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLm1hcCgob3B0aW9uKSA9PiAoXG4gICAgICAgICAgPFJhZGlvR3JvdXAuT3B0aW9uXG4gICAgICAgICAgICBjbGFzc05hbWU9eyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT5cbiAgICAgICAgICAgICAgY2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgICBjaGVja2VkID8gJ2JvcmRlci10cmFuc3BhcmVudCcgOiAnYm9yZGVyLWdyYXktMzAwJyxcbiAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlXG4gICAgICAgICAgICAgICAgICA/ICdib3JkZXItYmx1ZS01MDAgcmluZy0yIHJpbmctYmx1ZS01MDAnXG4gICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICA/ICdib3JkZXItdHJhbnNwYXJlbnQgcmluZy1ncmF5LTUwMCBjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgICAgICAgICAgICAgICA6ICdjdXJzb3ItcG9pbnRlcicsXG4gICAgICAgICAgICAgICAgJ3JlbGF0aXZlIGJnLXdoaXRlIGJvcmRlciByb3VuZGVkLWxnIHNoYWRvdy1zbSBwLTMgZmxleCBmb2N1czpvdXRsaW5lLW5vbmUnLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNhYmxlZD17b3B0aW9uLmRpc2FibGVkfVxuICAgICAgICAgICAga2V5PXtvcHRpb24uaWR9XG4gICAgICAgICAgICB2YWx1ZT17b3B0aW9uLmlkfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsoeyBjaGVja2VkLCBhY3RpdmUsIGRpc2FibGVkIH0pID0+IChcbiAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgPFJhZGlvR3JvdXAuTGFiZWxcbiAgICAgICAgICAgICAgICAgICAgYXM9XCJzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LW5vd3JhcCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXIgc3BhY2UtYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBncm93IHNocmlua1wiPlxuICAgICAgICAgICAgICAgICAgICAgIHtvcHRpb24udGl0bGV9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZWZhdWx0VmFsdWUgIT0gbnVsbCA/IG9wdGlvbi5kZWZhdWx0VmFsdWUgOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAhY2hlY2tlZCA/ICdpbnZpc2libGUnIDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnaC01IHctNSB0ZXh0LWJsdWUtNTAwIG1pbi13LTQnLFxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTAgMThhOCA4IDAgMTAwLTE2IDggOCAwIDAwMCAxNnptMy43MDctOS4yOTNhMSAxIDAgMDAtMS40MTQtMS40MTRMOSAxMC41ODYgNy43MDcgOS4yOTNhMSAxIDAgMDAtMS40MTQgMS40MTRsMiAyYTEgMSAwIDAwMS40MTQgMGw0LTR6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXAuTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5EZXNjcmlwdGlvblxuICAgICAgICAgICAgICAgICAgICBhcz1cInNwYW5cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtdC0xIGZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHtvcHRpb24uZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICA8L1JhZGlvR3JvdXAuRGVzY3JpcHRpb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgICAgICAgIWRpc2FibGVkICYmIGFjdGl2ZSA/ICdib3JkZXInIDogJ2JvcmRlci0yJyxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgID8gZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1ncmF5LTUwMCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JvcmRlci1ibHVlLTUwMCdcbiAgICAgICAgICAgICAgICAgICAgICA6ICdib3JkZXItdHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgICAgICAnYWJzb2x1dGUgLWluc2V0LXB4IHJvdW5kZWQtbGcgcG9pbnRlci1ldmVudHMtbm9uZScsXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L1JhZGlvR3JvdXAuT3B0aW9uPlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvUmFkaW9Hcm91cD5cbiAgKTtcbn1cblxuZnVuY3Rpb24gU2hhZG93Q29udGVudCh7XG4gIHJvb3QsXG4gIGNoaWxkcmVuLFxufToge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICByb290OiBFbGVtZW50O1xufSkge1xuICByZXR1cm4gUmVhY3RET00uY3JlYXRlUG9ydGFsKGNoaWxkcmVuLCByb290KTtcbn1cblxuLy8vIFBlcm1pdCB1c2VycyB0byBvdmVycmlkZSBmZWF0dXJlIGZsYWdzIHZpYSBhIEdVSS5cbi8vLyBSZW5kZXJzIGEgc21hbGwgZmxvYXRpbmcgYnV0dG9uIGluIGxvd2VyIGxlZnQgb3IgcmlnaHQsIHByZXNzaW5nIGl0IGJyaW5ncyB1cFxuLy8vIGEgbGlzdCBvZiBmZWF0dXJlcyB0byB0b2dnbGUgYW5kIHRoZWlyIGN1cnJlbnQgb3ZlcnJpZGUgc3RhdGUuIHlvdSBjYW4gb3ZlcnJpZGUgb24gb3Igb3ZlcnJpZGUgb2ZmLFxuLy8vIG9yIHVuc2V0IHRoZSBvdmVycmlkZSBhbmQgZ28gYmFjayB0byBkZWZhdWx0IHZhbHVlLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlRmVhdHVyZXMoe1xuICBkZWZhdWx0T3BlbiA9IGZhbHNlLFxuICBoaWRkZW4gPSBmYWxzZSxcbn06IHtcbiAgZGVmYXVsdE9wZW4/OiBib29sZWFuO1xuICBoaWRkZW4/OiBib29sZWFuO1xufSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IFtyb290LCBzZXRDb3JlUm9vdF0gPSB1c2VTdGF0ZTxIVE1MRGl2RWxlbWVudCB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IHNldFJvb3QgPSAoaG9zdDogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgaWYgKGhvc3QgPT0gbnVsbCB8fCByb290ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2hhZG93Um9vdCA9IGhvc3Q/LmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgcmVuZGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSBzdHlsZXM7XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gICAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZChyZW5kZXJEaXYpO1xuICAgIHNldENvcmVSb290KHJlbmRlckRpdik7XG4gIH07XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e3NldFJvb3R9XG4gICAgICBzdHlsZT17e1xuICAgICAgICB6SW5kZXg6IDk5OTk5LFxuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgd2lkdGg6ICcwJyxcbiAgICAgICAgaGVpZ2h0OiAnMCcsXG4gICAgICAgIGJvdHRvbTogMCxcbiAgICAgIH19XG4gICAgPlxuICAgICAge3Jvb3QgIT0gbnVsbCA/IChcbiAgICAgICAgPFNoYWRvd0NvbnRlbnQgcm9vdD17cm9vdH0+XG4gICAgICAgICAgPFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQgZGVmYXVsdE9wZW49e2RlZmF1bHRPcGVufSAvPlxuICAgICAgICA8L1NoYWRvd0NvbnRlbnQ+XG4gICAgICApIDogbnVsbH1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuLy8vIExpa2UgVG9nZ2xlRmVhdHVyZXMsIGJ1dCBkb2VzIG5vdCBpbmplY3Qgc3R5bGVzIGludG8gYSBzaGFkb3cgRE9NIHJvb3Qgbm9kZS5cbi8vLyB1c2VmdWwgaWYgeW91J3JlIHVzaW5nIHRhaWx3aW5kLlxuZXhwb3J0IGZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmVVbndyYXBwZWQoe1xuICBkZWZhdWx0T3BlbiA9IGZhbHNlLFxuICBoaWRkZW4gPSBmYWxzZSxcbn06IHtcbiAgZGVmYXVsdE9wZW4/OiBib29sZWFuO1xuICBoaWRkZW4/OiBib29sZWFuO1xufSk6IEpTWC5FbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGRlZmF1bHRPcGVuKTtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuXG4gIGlmIChjb250ZXh0ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChoaWRkZW4pIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdlIHdhbnQ6IFJlYWwgdmFsdWUgYWZ0ZXIgYWxsIG5lc3RpbmdzLCB2YWx1ZSBvZiB0aGUgb3ZlcnJpZGUuIHdlIHRvZ2dsZSBvdmVycmlkZVxuICBjb25zdCB7IGZlYXR1cmVzRGVzY3JpcHRpb24gfSA9IGNvbnRleHQ7XG5cbiAgaWYgKGZlYXR1cmVzRGVzY3JpcHRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgYm90dG9tLTAgbGVmdC0wIG14LTQgbXktNFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHRleHQtc20gZm9udC1tZWRpdW0gcC0xIGgtOCB3LTggYWxpZ24tbWlkZGxlIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtZnVsbCBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlICBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGp1c3RpZnktY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6cmluZy1ibHVlLTYwMCBzbTp0ZXh0LXNtXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKHRydWUpfVxuICAgICAgICAgIHRpdGxlPVwiVG9nZ2xlIGZlYXR1cmVzXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInctNiBoLTYgbWluLWgtNiBtaW4tdy02XCJcbiAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyMCAyMFwiXG4gICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICBkPVwiTTMgNmEzIDMgMCAwMTMtM2gxMGExIDEgMCAwMS44IDEuNkwxNC4yNSA4bDIuNTUgMy40QTEgMSAwIDAxMTYgMTNINmExIDEgMCAwMC0xIDF2M2ExIDEgMCAxMS0yIDBWNnpcIlxuICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIHshb3BlbiA/IG51bGwgOiAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZml4ZWQgei0xMCBpbnNldC0wIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1lbmQganVzdGlmeS1mbGV4LXN0YXJ0IG14LTggbXktNCBtaW4taC1zY3JlZW4gcHQtNCBweC00IHBiLTEwIHNtOmJsb2NrIHNtOnAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSBpbmxpbmUtYmxvY2sgYWxpZ24tYm90dG9tIGJnLXdoaXRlIHJvdW5kZWQtbGcgcHgtNCBwdC01IHBiLTQgdGV4dC1sZWZ0IG92ZXJmbG93LWhpZGRlbiBzaGFkb3cteGwgdHJhbnNmb3JtIHRyYW5zaXRpb24tYWxsIHNtOm15LTggc206YWxpZ24tbWlkZGxlIHNtOnAtNiBsZzptYXgtdy1bODAlXSBtYXgtdy1mdWxsXCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHNtOm10LTNcIj5cbiAgICAgICAgICAgICAgICAgIDxoMyBjbGFzc05hbWU9XCJmbGV4IGZsZXgtcm93IGdhcC00IGZsZXgtbm93cmFwIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JvdyB0ZXh0LWxnIGxlYWRpbmctNiBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZSBGbGFnIE92ZXJyaWRlc1xuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgRmVhdHVyZXMgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgdW5sZXNzIHRoZXkgYXJlIGZvcmNlZFxuICAgICAgICAgICAgICAgICAgICB1cHN0cmVhbS4gWW91IGNhbiBhbHNvIHJldmVydCB0byBkZWZhdWx0LlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC05XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxlZ2VuZCBjbGFzc05hbWU9XCJzci1vbmx5XCI+RmVhdHVyZSBGbGFnczwvbGVnZW5kPlxuICAgICAgICAgICAgICAgICAgICAgIHtmZWF0dXJlc0Rlc2NyaXB0aW9uLm1hcCgoZmVhdHVyZSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPFRvZ2dsZUZlYXR1cmUgZmVhdHVyZT17ZmVhdHVyZX0ga2V5PXtmZWF0dXJlLm5hbWV9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIgbXQtNSBzbTptdC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwdC0wIHBiLTAgcHItNCBwbC00IGgtOCBsZWFkaW5nLTcgYWxpZ24tbWlkZGxlIGN1cnNvci1wb2ludGVyIHJvdW5kZWQtc20gYmctYmx1ZS02MDAgdGV4dC13aGl0ZSBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGp1c3RpZnktY2VudGVyIHRleHQtYmFzZSBmb250LW1lZGl1bSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6cmluZy1ibHVlLTYwMCBzbTp0ZXh0LXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIERvbmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7OztBQ0NBLFlBQXVCOzs7QUNEdkIsb0JBQW9DOzs7QUNBcEMsbUJBQThCO0FBU3ZCLElBQU0sZ0JBQWdCLGdDQUFpQyxDQUFDLE9BQU8sS0FBSzs7O0FESHBFLDJCQUNMLE9BQytCO0FBQy9CLFFBQU0sT0FBTyw4QkFBVyxhQUFhO0FBR3JDLFFBQU0sWUFBWSwyQkFDaEIsTUFBTyxTQUFTLE9BQU8sQ0FBQyxJQUFJLE1BQU0sUUFBUSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssR0FDakUsQ0FBQyxLQUFLLENBQ1I7QUFFQSxTQUFPLENBQUMsTUFBTSxTQUFTO0FBQ3pCOzs7QUViTyx3QkFBd0IsWUFBd0M7QUFDckUsUUFBTSxDQUFDLE1BQU0sbUJBQW1CLGtCQUFrQixVQUFVO0FBQzVELFNBQ0UsV0FBVyxTQUFTLEtBQUssZ0JBQWdCLE1BQU0sQ0FBQyxNQUFHO0FBUnZEO0FBUTBELFlBQUUsWUFBSyxDQUFDLE1BQU4sWUFBVztBQUFBLEdBQU07QUFFN0U7OztBQ0xPLHFCQUFxQixTQUFxQztBQUMvRCxRQUFNLENBQUMsTUFBTSxtQkFBbUIsa0JBQWtCLE9BQU87QUFDekQsU0FBTyxnQkFBZ0IsS0FBSyxDQUFDLE1BQUc7QUFQbEM7QUFPcUMsWUFBRSxZQUFLLENBQUMsTUFBTixZQUFXO0FBQUEsR0FBTTtBQUN4RDs7O0FKRU8sSUFBTSxVQUFpQyxDQUFDO0FBQUEsRUFDN0MsVUFBVSxDQUFDO0FBQUEsRUFDWCxjQUFjLENBQUM7QUFBQSxFQUNmO0FBQUEsTUFDSTtBQUNKLFFBQU0sUUFBUSxZQUFZLE9BQU87QUFDakMsUUFBTSxRQUFRLGVBQWUsV0FBVztBQUV4QyxNQUFJLFNBQVMsT0FBTztBQUNsQixXQUFPLDBEQUFHLFFBQVM7QUFBQSxFQUNyQjtBQUVBLFNBQU87QUFDVDs7O0FLdEJBLGFBQXVCOzs7QUNJaEIsdUJBQXVCLGFBQXlDO0FBQ3JFLFFBQU0sQ0FBQyxNQUFNLG1CQUFtQixrQkFBa0IsV0FBVztBQUM3RCxTQUFPLGdCQUFnQixTQUFTLEtBQUssZ0JBQWdCLE1BQU0sSUFBSTtBQUNqRTs7O0FDSE8sb0JBQW9CLFNBQXFDO0FBQzlELFFBQU0sQ0FBQyxNQUFNLG1CQUFtQixrQkFBa0IsT0FBTztBQUN6RCxTQUFPLGdCQUFnQixLQUFLLElBQUk7QUFDbEM7OztBRk9PLGdCQUFnQjtBQUFBLEVBQ3JCLFVBQVUsQ0FBQztBQUFBLEVBQ1gsY0FBYyxDQUFDO0FBQUEsRUFDZjtBQUFBLEdBQ2tDO0FBQ2xDLFFBQU0sUUFBUSxXQUFXLE9BQU87QUFDaEMsUUFBTSxRQUFRLGNBQWMsV0FBVztBQUV2QyxNQUFJLFNBQVMsT0FBTztBQUNsQixXQUFPLDREQUFHLFFBQVM7QUFBQSxFQUNyQjtBQUVBLFNBQU87QUFDVDs7O0FHNUJBLG9CQU1POzs7QUNOUCxvQkFBOEI7QUFJdkIsSUFBTSxpQkFBaUIsaUNBQXlDLElBQUk7OztBQ3FCcEUsdUJBQ0wsY0FDeUI7QUEzQjNCO0FBNEJFLFNBQU87QUFBQSxJQUNMLGFBQWEsVUFBVSxhQUFhLGFBQWEsVUFBVSxpQkFDdkQsT0FDQSxhQUFhLFVBQVUsY0FDckIsYUFBYSxVQUFVLGtCQUN2QixRQUNBO0FBQUEsSUFDTix5QkFBYSxnQkFBYixtQkFBMEIsVUFBMUIsWUFBbUM7QUFBQSxFQUNyQztBQUNGOzs7QUNETyx3QkFDTCxlQUNBLFNBQ3lCO0FBQ3pCLE1BQUksY0FBYyxRQUFRLFNBQVMsWUFBWSxNQUFNO0FBQ25ELFdBQU8sQ0FBQyxRQUFXLEtBQUs7QUFBQSxFQUMxQjtBQUNBLFFBQU0sZUFBZSxjQUFjLFFBQVEsU0FBUztBQUNwRCxNQUFJLGdCQUFnQixNQUFNO0FBQ3hCLFdBQU8sY0FBYyxZQUFZO0FBQUEsRUFDbkM7QUFDQSxTQUFPLENBQUMsUUFBVyxLQUFLO0FBQzFCO0FBRU8sSUFBTSx1QkFBc0M7QUFBQSxFQUNqRCxPQUFPO0FBQUEsRUFDUCxTQUFTO0FBQUEsSUFDUCxVQUFVLENBQUM7QUFBQSxFQUNiO0FBQ0Y7QUFLTyx5QkFDTCxPQUNBLFFBQ2U7QUEvRGpCO0FBZ0VFLFVBQVEsT0FBTztBQUFBLFNBQ1IsUUFBUTtBQUNYLFVBQUksT0FBTyxTQUFTLFdBQVcsR0FBRztBQUNoQyxlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sV0FBMEMsQ0FBQztBQUNqRCxpQkFBVyxXQUFXLE9BQU8sVUFBVTtBQUVyQyxjQUFNLGVBQWU7QUFBQSxVQUNuQixPQUNFLFFBQVEsaUJBQWlCLE9BQ3BCLFlBQ0QsUUFBUSxpQkFBaUIsUUFDdEIsYUFDQTtBQUFBLFVBQ1QsYUFBYTtBQUFBLFFBQ2Y7QUFDQSxpQkFBUyxRQUFRLFFBQVE7QUFBQSxNQUMzQjtBQUVBLGFBQU87QUFBQSxRQUNMLE9BQU87QUFBQSxRQUNQLFNBQVMsRUFBRSxTQUFTO0FBQUEsTUFDdEI7QUFBQSxJQUNGO0FBQUEsU0FFSyxXQUFXO0FBQ2QsYUFBTztBQUFBLElBQ1Q7QUFBQSxTQUVLLFdBQVc7QUFDZCxVQUFJLE1BQU0sVUFBVSxTQUFTO0FBQzNCLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxXQUFXLG1CQUFLLE1BQU0sUUFBUTtBQUNwQyxhQUFPLEtBQUssUUFBUSxFQUFFLFFBQVEsQ0FBQyxTQUFTO0FBckc5QztBQXNHUSxjQUFNLFFBQVEsY0FBTyxTQUFTLFVBQWhCLGFBQXlCO0FBQ3ZDLGNBQU0saUJBQWlCLFNBQVM7QUFFaEMsWUFBSSx1QkFBZSxnQkFBZixvQkFBNEIsb0JBQW1CLE1BQU07QUFDdkQsY0FBSSxVQUFVLE1BQU07QUFDbEIscUJBQVMsUUFBUSxpQ0FBSyxpQkFBTCxFQUFxQixPQUFPLGVBQWU7QUFBQSxVQUM5RCxXQUFXLFVBQVUsT0FBTztBQUMxQixxQkFBUyxRQUFRLGlDQUFLLGlCQUFMLEVBQXFCLE9BQU8sZ0JBQWdCO0FBQUEsVUFDL0QsT0FBTztBQUNMLHFCQUFTLFFBQVEsaUNBQUssaUJBQUwsRUFBcUIsT0FBTyxtQkFBbUI7QUFBQSxVQUNsRTtBQUFBLFFBQ0YsT0FBTztBQUNMLGNBQUksVUFBVSxNQUFNO0FBQ2xCLHFCQUFTLFFBQVEsaUNBQUssaUJBQUwsRUFBcUIsT0FBTyxVQUFVO0FBQUEsVUFDekQsV0FBVyxVQUFVLE9BQU87QUFDMUIscUJBQVMsUUFBUSxpQ0FBSyxpQkFBTCxFQUFxQixPQUFPLFdBQVc7QUFBQSxVQUMxRCxPQUFPO0FBQ0wscUJBQVMsUUFBUSxpQ0FBSyxpQkFBTCxFQUFxQixPQUFPLGNBQWM7QUFBQSxVQUM3RDtBQUFBLFFBQ0Y7QUFBQSxNQUNGLENBQUM7QUFFRCxhQUFPLGlDQUNGLFFBREU7QUFBQSxRQUVMLFNBQVMsRUFBRSxTQUFTO0FBQUEsTUFDdEI7QUFBQSxJQUNGO0FBQUEsU0FFSyxPQUFPO0FBQ1YsVUFBSSxNQUFNLFVBQVUsU0FBUztBQUMzQixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sVUFBVSxNQUFNLFFBQVEsU0FBUyxPQUFPO0FBQzlDLFVBQUksV0FBVyxNQUFNO0FBQ25CLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxFQUFFLFVBQVU7QUFDbEIsVUFBSTtBQUVKLFVBQUksZUFBUSxnQkFBUixtQkFBcUIsb0JBQW1CLE1BQU07QUFDaEQsWUFBSSxVQUFVLE1BQU07QUFDbEIscUJBQVc7QUFBQSxRQUNiLFdBQVcsVUFBVSxPQUFPO0FBQzFCLHFCQUFXO0FBQUEsUUFDYixPQUFPO0FBQ0wscUJBQVc7QUFBQSxRQUNiO0FBQUEsTUFDRixPQUFPO0FBQ0wsWUFBSSxVQUFVLE1BQU07QUFDbEIscUJBQVc7QUFBQSxRQUNiLFdBQVcsVUFBVSxPQUFPO0FBQzFCLHFCQUFXO0FBQUEsUUFDYixPQUFPO0FBQ0wscUJBQVc7QUFBQSxRQUNiO0FBQUEsTUFDRjtBQUVBLGFBQU8saUNBQ0YsUUFERTtBQUFBLFFBRUwsU0FBUztBQUFBLFVBQ1AsVUFBVSxpQ0FDTCxNQUFNLFFBQVEsV0FEVDtBQUFBLGFBRVAsT0FBTyxPQUFPLGlDQUFLLFVBQUwsRUFBYyxPQUFPLFNBQVM7QUFBQSxVQUMvQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLFNBRUssVUFBVTtBQUNiLFVBQUksTUFBTSxVQUFVLFNBQVM7QUFDM0IsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFVBQVUsTUFBTSxRQUFRLFNBQVMsT0FBTztBQUM5QyxVQUFJLFdBQVcsTUFBTTtBQUNuQixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sV0FDSixlQUFRLGdCQUFSLG1CQUFxQixvQkFBbUIsT0FDcEMsaUJBQ0E7QUFFTixhQUFPLGlDQUNGLFFBREU7QUFBQSxRQUVMLFNBQVM7QUFBQSxVQUNQLFVBQVUsaUNBQ0wsTUFBTSxRQUFRLFdBRFQ7QUFBQSxhQUVQLE9BQU8sT0FBTyxpQ0FBSyxVQUFMLEVBQWMsT0FBTyxTQUFTO0FBQUEsVUFDL0M7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxTQUVLLFVBQVU7QUFDYixVQUFJLE1BQU0sVUFBVSxTQUFTO0FBQzNCLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxVQUFVLE1BQU0sUUFBUSxTQUFTLE9BQU87QUFDOUMsVUFBSSxXQUFXLE1BQU07QUFDbkIsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFdBQ0osZUFBUSxnQkFBUixtQkFBcUIsb0JBQW1CLE9BQ3BDLGlCQUNBO0FBRU4sYUFBTyxpQ0FDRixRQURFO0FBQUEsUUFFTCxTQUFTO0FBQUEsVUFDUCxVQUFVLGlDQUNMLE1BQU0sUUFBUSxXQURUO0FBQUEsYUFFUCxPQUFPLE9BQU8saUNBQUssVUFBTCxFQUFjLE9BQU8sU0FBUztBQUFBLFVBQy9DO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsU0FFSyxXQUFXO0FBQ2QsVUFBSSxNQUFNLFVBQVUsU0FBUztBQUMzQixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sVUFBVSxNQUFNLFFBQVEsU0FBUyxPQUFPO0FBQzlDLFVBQUksV0FBVyxNQUFNO0FBQ25CLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxXQUNKLGVBQVEsZ0JBQVIsbUJBQXFCLG9CQUFtQixPQUNwQyxrQkFDQTtBQUVOLGFBQU8saUNBQ0YsUUFERTtBQUFBLFFBRUwsU0FBUztBQUFBLFVBQ1AsVUFBVSxpQ0FDTCxNQUFNLFFBQVEsV0FEVDtBQUFBLGFBRVAsT0FBTyxPQUFPLGlDQUFLLFVBQUwsRUFBYyxPQUFPLFNBQVM7QUFBQSxVQUMvQztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLFNBRUssU0FBUztBQUNaLFVBQUksTUFBTSxVQUFVLFNBQVM7QUFDM0IsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFVBQVUsTUFBTSxRQUFRLFNBQVMsT0FBTztBQUM5QyxVQUFJLFdBQVcsTUFBTTtBQUNuQixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sV0FDSixlQUFRLGdCQUFSLG1CQUFxQixvQkFBbUIsT0FDcEMscUJBQ0E7QUFFTixhQUFPLGlDQUNGLFFBREU7QUFBQSxRQUVMLFNBQVM7QUFBQSxVQUNQLFVBQVUsaUNBQ0wsTUFBTSxRQUFRLFdBRFQ7QUFBQSxhQUVQLE9BQU8sT0FBTyxpQ0FBSyxVQUFMLEVBQWMsT0FBTyxTQUFTO0FBQUEsVUFDL0M7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxTQUVLLGNBQWM7QUFDakIsVUFBSSxNQUFNLFVBQVUsU0FBUztBQUMzQixlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sVUFBVSxNQUFNLFFBQVEsU0FBUyxPQUFPO0FBQzlDLFVBQUksV0FBVyxNQUFNO0FBQ25CLGVBQU87QUFBQSxNQUNUO0FBRUEsWUFBTSxFQUFFLFVBQVU7QUFDbEIsWUFBTSxXQUNKLFVBQVUsT0FDTixZQUNBLFVBQVUsUUFDUixhQUNBO0FBRVIsYUFBTyxpQ0FDRixRQURFO0FBQUEsUUFFTCxTQUFTO0FBQUEsVUFDUCxVQUFVLGlDQUNMLE1BQU0sUUFBUSxXQURUO0FBQUEsYUFFUCxPQUFPLE9BQU8saUNBQUssVUFBTCxFQUFjLE9BQU8sU0FBUztBQUFBLFVBQy9DO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUE7QUFHRSxhQUFPO0FBQUE7QUFFYjs7O0FDcFRBLG9CQUEwQjs7O0FDR25CLHlCQUFtQjtBQUFBLEVBS3hCLFlBQ0UsVUFDQSxjQUNBLGFBQ0E7QUFDQSxTQUFLLGNBQWM7QUFDbkIsU0FBSyxXQUFXO0FBQ2hCLFNBQUssY0FBYztBQUFBLEVBQ3JCO0FBQUEsRUFFTyxPQUFPLFNBQXVCO0FBQ25DLFNBQUssU0FBUyxFQUFFLE1BQU0sVUFBVSxNQUFNLFFBQVEsQ0FBQztBQUFBLEVBQ2pEO0FBQUEsRUFFTyxPQUFPLFNBQXVCO0FBQ25DLFNBQUssU0FBUyxFQUFFLE1BQU0sVUFBVSxNQUFNLFFBQVEsQ0FBQztBQUFBLEVBQ2pEO0FBQUEsRUFFTyxNQUFNLFNBQXVCO0FBQ2xDLFNBQUssU0FBUyxFQUFFLE1BQU0sU0FBUyxNQUFNLFFBQVEsQ0FBQztBQUFBLEVBQ2hEO0FBQUEsRUFFTyxRQUFRLFNBQXVCO0FBQ3BDLFNBQUssU0FBUyxFQUFFLE1BQU0sV0FBVyxNQUFNLFFBQVEsQ0FBQztBQUFBLEVBQ2xEO0FBQUEsRUFFTyxPQUFPLFVBQWlEO0FBQzdELFNBQUssU0FBUyxFQUFFLE1BQU0sV0FBVyxTQUFTLENBQUM7QUFBQSxFQUM3QztBQUFBLEVBRU8sZUFBa0Q7QUFDdkQsV0FBTyxLQUFLLFlBQVksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sS0FBSyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFBQSxFQUN2RTtBQUNGOzs7QURwQ2UsNEJBQ2IsaUJBQ0EsVUFDQSxjQUNBLFVBQ007QUFDTiwrQkFBVSxNQUFNO0FBQ2QsUUFBSSxDQUFDLGlCQUFpQjtBQUVwQixVQUFJLE9BQU8sV0FBVyxNQUFNO0FBQzFCLGVBQU8sVUFBVTtBQUFBLE1BQ25CO0FBQ0EsYUFBTyxNQUFNO0FBQ1gsWUFBSSxPQUFPLFdBQVcsTUFBTTtBQUMxQixpQkFBTyxVQUFVO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUNBLFdBQU8sVUFBVSxJQUFJLGFBQWEsVUFBVSxjQUFhLFFBQVE7QUFDakUsV0FBTyxNQUFNO0FBQ1gsVUFBSSxPQUFPLFdBQVcsTUFBTTtBQUMxQixlQUFPLFVBQVU7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFBQSxFQUNGLEdBQUcsQ0FBQyxVQUFVLFVBQVUsaUJBQWlCLFlBQVcsQ0FBQztBQUN2RDs7O0FFOUJBLG9CQUFtQztBQUk1QixJQUFNLE1BQU07QUFFSixvQkFDYixTQUNBLFVBQ0EsZUFDTTtBQUNOLFFBQU0sWUFBWSwyQkFBUSxNQUFNO0FBQzlCLFVBQU0sZUFBZ0QsQ0FBQztBQUN2RCxRQUFJLGNBQWMsVUFBVSxTQUFTO0FBQ25DLGlCQUFXLFdBQVcsVUFBVTtBQUM5QixjQUFNLENBQUMsU0FBUyxlQUFlLGVBQWUsUUFBUSxJQUFJO0FBQzFELFlBQUksU0FBUyxNQUFNO0FBQ2pCLHVCQUFhLFFBQVEsUUFBUTtBQUFBLFFBQy9CO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVCxHQUFHLENBQUMsVUFBVSxhQUFhLENBQUM7QUFFNUIsUUFBTSxXQUNKLE9BQU8sS0FBSyxTQUFTLEVBQUUsV0FBVyxLQUFLLFdBQVcsT0FDOUMsT0FDQSxLQUFLLFVBQVUsRUFBRSxVQUFVLENBQUM7QUFFbEMsK0JBQVUsTUFBTTtBQUNkLFFBQUk7QUFDRixVQUFJLFdBQVcsUUFBUSxjQUFjLFVBQVUsU0FBUztBQUN0RCxnQkFBUSxRQUFRLEtBQUssUUFBUTtBQUFBLE1BQy9CO0FBQUEsSUFDRixTQUFTLEdBQVA7QUFBQSxJQUVGO0FBQUEsRUFDRixHQUFHLENBQUMsZUFBZSxTQUFTLFFBQVEsQ0FBQztBQUN2Qzs7O0FDdENBLG9CQUE0Qjs7O0FDU2IscUJBQ2IsU0FDQSxRQUNjO0FBQ2QsUUFBTSxTQUFTLE9BQU8sSUFBSSxDQUFDLFVBQVUsZUFBZSxPQUFPLE9BQU8sQ0FBQztBQUduRSxhQUFXLENBQUMsY0FBYyxrQkFBa0IsUUFBUTtBQUNsRCxRQUFJLGdCQUFnQixRQUFRLGVBQWU7QUFDekMsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBR0EsYUFBVyxDQUFDLGlCQUFpQixRQUFRO0FBQ25DLFFBQUksZ0JBQWdCLE1BQU07QUFDeEIsYUFBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBR0EsU0FBTztBQUNUOzs7QUR6QmUseUJBQ2IsZUFDQSxnQkFDMEM7QUFDMUMsU0FBTywrQkFDTCxDQUFDLE1BQWMsWUFBWSxHQUFHLENBQUMsZUFBZSxjQUFjLENBQUMsR0FDN0QsQ0FBQyxlQUFlLGNBQWMsQ0FDaEM7QUFDRjs7O0FQZU8sa0JBQWtCO0FBQUEsRUFDdkI7QUFBQSxFQUNBO0FBQUEsRUFDQSxpQkFBaUI7QUFBQSxFQUNqQixVQUFVLE9BQU87QUFBQSxHQUNXO0FBRTVCLFFBQU0sY0FBYywwQkFBTyxRQUFRO0FBQ25DLFFBQU0sQ0FBQyxnQkFBZ0IscUJBQXFCLDhCQUMxQyxpQkFDQSxvQkFDRjtBQUNBLFFBQU0sQ0FBQyxlQUFlLG9CQUFvQiw4QkFDeEMsaUJBQ0Esb0JBQ0Y7QUFFQSwrQkFBVSxNQUFNO0FBRWQscUJBQWlCLEVBQUUsTUFBTSxRQUFRLFNBQVMsQ0FBQztBQUMzQyxXQUFPLE1BQU07QUFDWCx1QkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUFBLElBQ3RDO0FBQUEsRUFDRixHQUFHLENBQUMsUUFBUSxDQUFDO0FBRWIsK0JBQVUsTUFBTTtBQUNkLFFBQUksSUFBeUMsQ0FBQztBQUM5QyxRQUFJLFdBQVcsTUFBTTtBQUNuQixVQUFJO0FBQ0YsY0FBTSxlQUFlLFFBQVEsUUFBUSxHQUFHO0FBQ3hDLFlBQUksZ0JBQWdCLE1BQU07QUFDeEIsZ0JBQU0sS0FBSyxLQUFLLE1BQU0sWUFBWTtBQUNsQyxjQUFJLEdBQUc7QUFBQSxRQUNUO0FBQUEsTUFDRixTQUFTLEdBQVA7QUFFQSxnQkFBUSxNQUFNLHlCQUF5QixDQUFDO0FBQUEsTUFDMUM7QUFBQSxJQUNGO0FBRUEsc0JBQWtCO0FBQUEsTUFDaEIsTUFBTTtBQUFBLE1BQ04sVUFBVSxZQUFZLFFBQ25CLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZUFBZSxJQUFJLEVBQ25DLElBQUksQ0FBQyxNQUFHO0FBekVqQjtBQXlFcUI7QUFBQSxVQUNYLE1BQU0sRUFBRTtBQUFBLFVBQ1IsYUFBYSxFQUFFO0FBQUEsVUFDZixjQUFjLDZCQUFJLEVBQUUsVUFBTixZQUFlO0FBQUEsUUFDL0I7QUFBQSxPQUFFO0FBQUEsSUFDTixDQUFDO0FBRUQsV0FBTyxNQUFNO0FBQ1gsd0JBQWtCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFBQSxJQUN2QztBQUFBLEVBQ0YsR0FBRyxDQUFDLE9BQU8sQ0FBQztBQUdaLCtCQUFVLE1BQU07QUFDZCxRQUFJLGNBQWMsVUFBVSxTQUFTO0FBQ25DO0FBQUEsSUFDRjtBQUdBLFdBQU8sUUFBUSxjQUFjLFFBQVEsUUFBUSxFQUFFLFFBQzdDLENBQUMsQ0FBQyxNQUFNLGFBQWE7QUE3RjNCO0FBOEZRLFVBQ0UsUUFBUSxVQUFVLGtCQUNsQixRQUFRLFVBQVUsbUJBQ2xCLFFBQVEsVUFBVSxvQkFDbEI7QUFDQSxjQUFNLGNBQ0osUUFBUSxVQUFVLGlCQUNkLE9BQ0EsUUFBUSxVQUFVLGtCQUNoQixRQUNBO0FBRVIsY0FBTSxrQkFBa0IsY0FBUSxnQkFBUixtQkFBcUI7QUFDN0MsWUFBSSxtQkFBbUIsUUFBUSxRQUFRLGVBQWUsTUFBTTtBQUMxRCwwQkFBZ0IsUUFBUSxZQUFZLE1BQU0sV0FBVyxFQUNsRCxLQUFLLENBQUMsV0FBVztBQUNoQiw2QkFBaUIsRUFBRSxNQUFNLGNBQWMsTUFBTSxPQUFPLE9BQU8sQ0FBQztBQUFBLFVBQzlELENBQUMsRUFDQSxNQUFNLE1BQU07QUFDWCw2QkFBaUI7QUFBQSxjQUNmLE1BQU07QUFBQSxjQUNOO0FBQUEsY0FDQSxPQUFPO0FBQUEsWUFDVCxDQUFDO0FBQUEsVUFDSCxDQUFDO0FBQUEsUUFDTDtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQ0Y7QUFBQSxFQUNGLEdBQUcsQ0FBQyxhQUFhLENBQUM7QUFFbEIsYUFBVyxTQUFTLFlBQVksU0FBUyxjQUFjO0FBRXZELFFBQU0sZUFBZSxnQkFBZ0IsZ0JBQWdCLGFBQWE7QUFDbEUscUJBQ0UsQ0FBQyxnQkFDRCxZQUFZLFNBQ1osY0FDQSxnQkFDRjtBQUVBLFFBQU0sZUFBZSwyQkFDbkIsTUFBTztBQUFBLElBQ0wsZUFBZTtBQUFBLElBQ2YsY0FBYztBQUFBLElBQ2QscUJBQXFCLFlBQVk7QUFBQSxJQUNqQztBQUFBLElBQ0E7QUFBQSxJQUNBLE1BQU07QUFBQSxFQUNSLElBQ0EsQ0FBQyxnQkFBZ0IsZUFBZSxZQUFZLENBQzlDO0FBRUEsU0FDRSxvREFBQyxlQUFlLFVBQWY7QUFBQSxJQUF3QixPQUFPO0FBQUEsS0FDOUIsb0RBQUMsY0FBYyxVQUFkO0FBQUEsSUFBdUIsT0FBTztBQUFBLEtBQzVCLFFBQ0gsQ0FDRjtBQUVKOzs7QVMxSkEsb0JBQTJCO0FBQzNCLG9CQUtPO0FBQ1AsdUJBQXFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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 diff --git a/dist/cjs/src/index.js.map b/dist/cjs/src/index.js.map deleted file mode 100644 index 0340967..0000000 --- a/dist/cjs/src/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/index.tsx", "../../../src/Disable.tsx", "../../../src/utils.ts", "../../../src/EnableContext.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/Enable.tsx", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Features.tsx", "../../../src/FeatureContext.tsx", "../../../src/FeatureState.tsx", "../../../src/FeaturesState.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/ToggleFeatures.tsx"], - "sourcesContent": ["export { Disable } from './Disable';\nexport { Enable } from './Enable';\nexport type { EnableContextType } from './EnableContext';\nexport { EnableContext } from './EnableContext';\nexport type { FeatureContextType } from './FeatureContext';\nexport type {\n FeatureDescription,\n FeatureDispatch,\n FeatureState,\n FeatureValue,\n} from './FeatureState';\nexport { Features } from './Features';\nexport { ToggleFeatures } from './ToggleFeatures';\nexport { useAllDisabled } from './useAllDisabled';\nexport { useAllEnabled } from './useAllEnabled';\nexport { useDisabled } from './useDisabled';\nexport { useEnabled } from './useEnabled';\n", "// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport type { EnableProps } from './Enable';\nimport { useAllDisabled } from './useAllDisabled';\nimport { useDisabled } from './useDisabled';\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children,\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContext, type EnableContextType } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(\n input?: string[] | string | null,\n): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(\n () => (input == null ? [] : Array.isArray(input) ? input : [input]),\n [input],\n );\n\n return [test, converted];\n}\n", "import { createContext } from 'react';\n\nimport type { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return (\n withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false))\n );\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({\n feature = [],\n allFeatures = [],\n children,\n}: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import React, {\n type ReactNode,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { featuresReducer, initialFeaturesState } from './FeaturesState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n const [defaultsState, defaultsDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n\n useEffect(() => {\n /// Load defaults\n defaultsDispatch({ type: 'INIT', features });\n return () => {\n defaultsDispatch({ type: 'DE_INIT' });\n };\n }, [features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesDispatch({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({\n name: x.name,\n description: x.description,\n defaultValue: f?.[x.name] ?? undefined,\n })),\n });\n\n return () => {\n overridesDispatch({ type: 'DE_INIT' });\n };\n }, [storage]);\n\n // Handle async operations for features with onChangeDefault\n useEffect(() => {\n if (defaultsState.value !== 'ready') {\n return;\n }\n\n // Check for features in async states and handle them\n Object.entries(defaultsState.context.features).forEach(\n ([name, feature]) => {\n if (\n feature.value === 'asyncEnabled' ||\n feature.value === 'asyncDisabled' ||\n feature.value === 'asyncUnspecified'\n ) {\n const targetValue =\n feature.value === 'asyncEnabled'\n ? true\n : feature.value === 'asyncDisabled'\n ? false\n : undefined;\n\n const onChangeDefault = feature.featureDesc?.onChangeDefault;\n if (onChangeDefault != null && feature.featureDesc != null) {\n onChangeDefault(feature.featureDesc.name, targetValue)\n .then((result) => {\n defaultsDispatch({ type: 'ASYNC_DONE', name, value: result });\n })\n .catch(() => {\n defaultsDispatch({\n type: 'ASYNC_DONE',\n name,\n value: undefined,\n });\n });\n }\n }\n },\n );\n }, [defaultsState]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(\n !disableConsole,\n featuresRef.current,\n testCallback,\n defaultsDispatch,\n );\n\n const featureValue = useMemo(\n () => ({\n overridesSend: overridesDispatch,\n defaultsSend: defaultsDispatch,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesState, defaultsState, testCallback],\n );\n\n return (\n \n \n {children}\n \n \n );\n}\n", "import { createContext } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch, FeaturesState } from './FeaturesState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import type { Dispatch } from 'react';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureStateValue =\n | 'initial'\n | 'enabled'\n | 'disabled'\n | 'unspecified'\n | 'asyncEnabled'\n | 'asyncDisabled'\n | 'asyncUnspecified';\n\nexport interface FeatureState {\n value: FeatureStateValue;\n featureDesc?: FeatureDescription;\n}\n\nexport type FeatureDispatch = Dispatch;\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(\n featureState: FeatureState,\n): [FeatureValue, boolean] {\n return [\n featureState.value === 'enabled' || featureState.value === 'asyncEnabled'\n ? true\n : featureState.value === 'disabled' ||\n featureState.value === 'asyncDisabled'\n ? false\n : undefined,\n featureState.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (\n name: K,\n newValue: FeatureValue,\n ) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' }\n | { type: 'ASYNC_DONE'; value: FeatureValue };\n\nexport const initialFeatureState: FeatureState = {\n value: 'initial',\n};\n\n/**\n * Reducer for managing individual feature state\n */\nexport function featureReducer(\n state: FeatureState,\n action: FeatureAction,\n): FeatureState {\n switch (action.type) {\n case 'INIT': {\n const { feature } = action;\n const value =\n feature.defaultValue === true\n ? 'enabled'\n : feature.defaultValue === false\n ? 'disabled'\n : 'unspecified';\n return {\n value: value as FeatureStateValue,\n featureDesc: feature,\n };\n }\n\n case 'ENABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'DISABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'disabled' };\n }\n\n case 'TOGGLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'UNSET': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncUnspecified' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'SET': {\n const { value } = action;\n if (state.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n return { ...state, value: 'asyncEnabled' };\n }\n if (value === false) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'asyncUnspecified' };\n }\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'ASYNC_DONE': {\n const { value } = action;\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n default:\n return state;\n }\n}\n", "import type { Dispatch } from 'react';\n\nimport {\n type FeatureDescription,\n type FeatureState,\n type FeatureValue,\n valueForState,\n} from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: FeatureState };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string }\n | { type: 'ASYNC_DONE'; name: string; value: FeatureValue };\n\nexport interface FeaturesState {\n value: 'idle' | 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesDispatch = Dispatch;\n\nexport function valueOfFeature(\n featuresState: FeaturesState,\n feature: string,\n): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature];\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\nexport const initialFeaturesState: FeaturesState = {\n value: 'idle',\n context: {\n features: {},\n },\n};\n\n/**\n * Reducer for managing a collection of features\n */\nexport function featuresReducer(\n state: FeaturesState,\n action: FeaturesAction,\n): FeaturesState {\n switch (action.type) {\n case 'INIT': {\n if (action.features.length === 0) {\n return state;\n }\n\n const features: { [x: string]: FeatureState } = {};\n for (const feature of action.features) {\n // Initialize each feature\n const featureState = {\n value:\n feature.defaultValue === true\n ? ('enabled' as const)\n : feature.defaultValue === false\n ? ('disabled' as const)\n : ('unspecified' as const),\n featureDesc: feature,\n };\n features[feature.name] = featureState;\n }\n\n return {\n value: 'ready',\n context: { features },\n };\n }\n\n case 'DE_INIT': {\n return initialFeaturesState;\n }\n\n case 'SET_ALL': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const features = { ...state.context.features };\n Object.keys(features).forEach((name) => {\n const value = action.features[name] ?? undefined;\n const currentFeature = features[name];\n\n if (currentFeature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'asyncEnabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'asyncDisabled' };\n } else {\n features[name] = { ...currentFeature, value: 'asyncUnspecified' };\n }\n } else {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'enabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'disabled' };\n } else {\n features[name] = { ...currentFeature, value: 'unspecified' };\n }\n }\n });\n\n return {\n ...state,\n context: { features },\n };\n }\n\n case 'SET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n let newValue: FeatureState['value'];\n\n if (feature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n newValue = 'asyncEnabled';\n } else if (value === false) {\n newValue = 'asyncDisabled';\n } else {\n newValue = 'asyncUnspecified';\n }\n } else {\n if (value === true) {\n newValue = 'enabled';\n } else if (value === false) {\n newValue = 'disabled';\n } else {\n newValue = 'unspecified';\n }\n }\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'TOGGLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ENABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'DISABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncDisabled'\n : 'disabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'UNSET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncUnspecified'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ASYNC_DONE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n const newValue =\n value === true\n ? 'enabled'\n : value === false\n ? 'disabled'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n default:\n return state;\n }\n}\n", "import { useEffect } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch,\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n // Clean up window.feature immediately if consoleOverride is disabled\n if (window.feature != null) {\n window.feature = undefined;\n }\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[],\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useEffect, useMemo } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState,\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.value === 'ready') {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState =\n Object.keys(overrides).length === 0 || storage == null\n ? '{}'\n : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.value === 'ready') {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport type { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState,\n): (feature: string) => boolean | undefined {\n return useCallback(\n (f: string) => testFeature(f, [defaultsState, overridesState]),\n [defaultsState, overridesState],\n );\n}\n", "import type { FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(\n feature: string,\n states: FeaturesState[],\n): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import { RadioGroup } from '@headlessui/react';\nimport React, {\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { valueOfFeature } from './FeaturesState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({\n feature,\n}: {\n feature: FeatureDescription;\n}): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context],\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (\n valueOfFeature(defaultsState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const valueInOverrides = (\n valueOfFeature(overridesState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null : (\n

\n {feature.description}\n

\n )}\n
\n
\n {[\n {\n id: 'false',\n title: `Disable ${feature.name}`,\n description: 'Override the feature to be disabled',\n },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n {\n id: 'true',\n title: `Enable ${feature.name}`,\n description: 'Override the feature to be enabled',\n },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active\n ? 'border-blue-500 ring-2 ring-blue-500'\n : '',\n disabled\n ? 'border-transparent ring-gray-500 cursor-not-allowed'\n : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none',\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n \n {option.title}\n \n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n \n );\n}\n\nfunction ShadowContent({\n root,\n children,\n}: {\n children: ReactNode;\n root: Element;\n}) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n \n {root != null ? (\n \n \n \n ) : null}\n \n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
\n Feature Flag Overrides\n
\n

\n

\n Features can be enabled or disabled unless they are forced\n upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], - "mappings": "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", - "names": [] -} diff --git a/dist/esm/src/index.js b/dist/esm/src/index.js deleted file mode 100644 index 650c36a..0000000 --- a/dist/esm/src/index.js +++ /dev/null @@ -1,1981 +0,0 @@ -var __defProp = Object.defineProperty; -var __defProps = Object.defineProperties; -var __getOwnPropDescs = Object.getOwnPropertyDescriptors; -var __getOwnPropSymbols = Object.getOwnPropertySymbols; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __propIsEnum = Object.prototype.propertyIsEnumerable; -var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; -var __spreadValues = (a, b) => { - for (var prop in b || (b = {})) - if (__hasOwnProp.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - if (__getOwnPropSymbols) - for (var prop of __getOwnPropSymbols(b)) { - if (__propIsEnum.call(b, prop)) - __defNormalProp(a, prop, b[prop]); - } - return a; -}; -var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); - -// src/Disable.tsx -import * as React from "react"; - -// src/utils.ts -import { useContext, useMemo } from "react"; - -// src/EnableContext.tsx -import { createContext } from "react"; -var EnableContext = createContext((_s) => false); - -// src/utils.ts -function useTestAndConvert(input) { - const test = useContext(EnableContext); - const converted = useMemo(() => input == null ? [] : Array.isArray(input) ? input : [input], [input]); - return [test, converted]; -} - -// src/useAllDisabled.tsx -function useAllDisabled(withoutAll) { - const [test, queryAllWithout] = useTestAndConvert(withoutAll); - return withoutAll.length > 0 && queryAllWithout.every((x) => { - var _a; - return !((_a = test(x)) != null ? _a : false); - }); -} - -// src/useDisabled.tsx -function useDisabled(without) { - const [test, queryAnyWithout] = useTestAndConvert(without); - return queryAnyWithout.some((x) => { - var _a; - return !((_a = test(x)) != null ? _a : false); - }); -} - -// src/Disable.tsx -var Disable = ({ - feature = [], - allFeatures = [], - children -}) => { - const isAny = useDisabled(feature); - const isAll = useAllDisabled(allFeatures); - if (isAny || isAll) { - return /* @__PURE__ */ React.createElement(React.Fragment, null, children); - } - return null; -}; - -// src/Enable.tsx -import * as React2 from "react"; - -// src/useAllEnabled.tsx -function useAllEnabled(allFeatures) { - const [test, queryAllPresent] = useTestAndConvert(allFeatures); - return queryAllPresent.length > 0 && queryAllPresent.every(test); -} - -// src/useEnabled.tsx -function useEnabled(feature) { - const [test, queryAnyPresent] = useTestAndConvert(feature); - return queryAnyPresent.some(test); -} - -// src/Enable.tsx -function Enable({ - feature = [], - allFeatures = [], - children -}) { - const isAny = useEnabled(feature); - const isAll = useAllEnabled(allFeatures); - if (isAny || isAll) { - return /* @__PURE__ */ React2.createElement(React2.Fragment, null, children); - } - return null; -} - -// src/Features.tsx -import React3, { - useEffect as useEffect3, - useMemo as useMemo3, - useReducer, - useRef -} from "react"; - -// src/FeatureContext.tsx -import { createContext as createContext2 } from "react"; -var FeatureContext = createContext2(null); - -// src/FeatureState.tsx -function valueForState(featureState) { - var _a, _b; - return [ - featureState.value === "enabled" || featureState.value === "asyncEnabled" ? true : featureState.value === "disabled" || featureState.value === "asyncDisabled" ? false : void 0, - (_b = (_a = featureState.featureDesc) == null ? void 0 : _a.force) != null ? _b : false - ]; -} - -// src/FeaturesState.tsx -function valueOfFeature(featuresState, feature) { - if (featuresState.context.features[feature] == null) { - return [void 0, false]; - } - const featureState = featuresState.context.features[feature]; - if (featureState != null) { - return valueForState(featureState); - } - return [void 0, false]; -} -var initialFeaturesState = { - value: "idle", - context: { - features: {} - } -}; -function featuresReducer(state, action) { - var _a, _b, _c, _d, _e; - switch (action.type) { - case "INIT": { - if (action.features.length === 0) { - return state; - } - const features = {}; - for (const feature of action.features) { - const featureState = { - value: feature.defaultValue === true ? "enabled" : feature.defaultValue === false ? "disabled" : "unspecified", - featureDesc: feature - }; - features[feature.name] = featureState; - } - return { - value: "ready", - context: { features } - }; - } - case "DE_INIT": { - return initialFeaturesState; - } - case "SET_ALL": { - if (state.value !== "ready") { - return state; - } - const features = __spreadValues({}, state.context.features); - Object.keys(features).forEach((name) => { - var _a2, _b2; - const value = (_a2 = action.features[name]) != null ? _a2 : void 0; - const currentFeature = features[name]; - if (((_b2 = currentFeature.featureDesc) == null ? void 0 : _b2.onChangeDefault) != null) { - if (value === true) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncEnabled" }); - } else if (value === false) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncDisabled" }); - } else { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "asyncUnspecified" }); - } - } else { - if (value === true) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "enabled" }); - } else if (value === false) { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "disabled" }); - } else { - features[name] = __spreadProps(__spreadValues({}, currentFeature), { value: "unspecified" }); - } - } - }); - return __spreadProps(__spreadValues({}, state), { - context: { features } - }); - } - case "SET": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const { value } = action; - let newValue; - if (((_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault) != null) { - if (value === true) { - newValue = "asyncEnabled"; - } else if (value === false) { - newValue = "asyncDisabled"; - } else { - newValue = "asyncUnspecified"; - } - } else { - if (value === true) { - newValue = "enabled"; - } else if (value === false) { - newValue = "disabled"; - } else { - newValue = "unspecified"; - } - } - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "TOGGLE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_b = feature.featureDesc) == null ? void 0 : _b.onChangeDefault) != null ? "asyncEnabled" : "enabled"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "ENABLE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_c = feature.featureDesc) == null ? void 0 : _c.onChangeDefault) != null ? "asyncEnabled" : "enabled"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "DISABLE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_d = feature.featureDesc) == null ? void 0 : _d.onChangeDefault) != null ? "asyncDisabled" : "disabled"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "UNSET": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const newValue = ((_e = feature.featureDesc) == null ? void 0 : _e.onChangeDefault) != null ? "asyncUnspecified" : "unspecified"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - case "ASYNC_DONE": { - if (state.value !== "ready") { - return state; - } - const feature = state.context.features[action.name]; - if (feature == null) { - return state; - } - const { value } = action; - const newValue = value === true ? "enabled" : value === false ? "disabled" : "unspecified"; - return __spreadProps(__spreadValues({}, state), { - context: { - features: __spreadProps(__spreadValues({}, state.context.features), { - [action.name]: __spreadProps(__spreadValues({}, feature), { value: newValue }) - }) - } - }); - } - default: - return state; - } -} - -// src/useConsoleOverride.tsx -import { useEffect } from "react"; - -// src/GlobalEnable.tsx -var GlobalEnable = class { - constructor(dispatch, testFeature2, featureDesc) { - this.featureDesc = featureDesc; - this.dispatch = dispatch; - this.testFeature = testFeature2; - } - toggle(feature) { - this.dispatch({ type: "TOGGLE", name: feature }); - } - enable(feature) { - this.dispatch({ type: "ENABLE", name: feature }); - } - unset(feature) { - this.dispatch({ type: "UNSET", name: feature }); - } - disable(feature) { - this.dispatch({ type: "DISABLE", name: feature }); - } - setAll(features) { - this.dispatch({ type: "SET_ALL", features }); - } - listFeatures() { - return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]); - } -}; - -// src/useConsoleOverride.tsx -function useConsoleOverride(consoleOverride, features, testFeature2, dispatch) { - useEffect(() => { - if (!consoleOverride) { - if (window.feature != null) { - window.feature = void 0; - } - return () => { - if (window.feature != null) { - window.feature = void 0; - } - }; - } - window.feature = new GlobalEnable(dispatch, testFeature2, features); - return () => { - if (window.feature != null) { - window.feature = void 0; - } - }; - }, [features, dispatch, consoleOverride, testFeature2]); -} - -// src/usePersist.tsx -import { useEffect as useEffect2, useMemo as useMemo2 } from "react"; -var KEY = "react-enable:feature-values"; -function usePersist(storage, features, overrideState) { - const overrides = useMemo2(() => { - const newOverrides = {}; - if (overrideState.value === "ready") { - for (const feature of features) { - const [value] = valueOfFeature(overrideState, feature.name); - if (value != null) { - newOverrides[feature.name] = value; - } - } - } - return newOverrides; - }, [features, overrideState]); - const strState = Object.keys(overrides).length === 0 || storage == null ? "{}" : JSON.stringify({ overrides }); - useEffect2(() => { - try { - if (storage != null && overrideState.value === "ready") { - storage.setItem(KEY, strState); - } - } catch (e) { - } - }, [overrideState, storage, strState]); -} - -// src/useTestCallback.tsx -import { useCallback } from "react"; - -// src/testFeature.tsx -function testFeature(feature, states) { - const values = states.map((state) => valueOfFeature(state, feature)); - for (const [featureValue, featureForced] of values) { - if (featureValue != null && featureForced) { - return featureValue; - } - } - for (const [featureValue] of values) { - if (featureValue != null) { - return featureValue; - } - } - return void 0; -} - -// src/useTestCallback.tsx -function useTestCallback(defaultsState, overridesState) { - return useCallback((f) => testFeature(f, [defaultsState, overridesState]), [defaultsState, overridesState]); -} - -// src/Features.tsx -function Features({ - children, - features, - disableConsole = false, - storage = window.sessionStorage -}) { - const featuresRef = useRef(features); - const [overridesState, overridesDispatch] = useReducer(featuresReducer, initialFeaturesState); - const [defaultsState, defaultsDispatch] = useReducer(featuresReducer, initialFeaturesState); - useEffect3(() => { - defaultsDispatch({ type: "INIT", features }); - return () => { - defaultsDispatch({ type: "DE_INIT" }); - }; - }, [features]); - useEffect3(() => { - let f = {}; - if (storage != null) { - try { - const featuresJson = storage.getItem(KEY); - if (featuresJson != null) { - const fh = JSON.parse(featuresJson); - f = fh.overrides; - } - } catch (e) { - console.error("error in localStorage", e); - } - } - overridesDispatch({ - type: "INIT", - features: featuresRef.current.filter((x) => x.noOverride !== true).map((x) => { - var _a; - return { - name: x.name, - description: x.description, - defaultValue: (_a = f == null ? void 0 : f[x.name]) != null ? _a : void 0 - }; - }) - }); - return () => { - overridesDispatch({ type: "DE_INIT" }); - }; - }, [storage]); - useEffect3(() => { - if (defaultsState.value !== "ready") { - return; - } - Object.entries(defaultsState.context.features).forEach(([name, feature]) => { - var _a; - if (feature.value === "asyncEnabled" || feature.value === "asyncDisabled" || feature.value === "asyncUnspecified") { - const targetValue = feature.value === "asyncEnabled" ? true : feature.value === "asyncDisabled" ? false : void 0; - const onChangeDefault = (_a = feature.featureDesc) == null ? void 0 : _a.onChangeDefault; - if (onChangeDefault != null && feature.featureDesc != null) { - onChangeDefault(feature.featureDesc.name, targetValue).then((result) => { - defaultsDispatch({ type: "ASYNC_DONE", name, value: result }); - }).catch(() => { - defaultsDispatch({ - type: "ASYNC_DONE", - name, - value: void 0 - }); - }); - } - } - }); - }, [defaultsState]); - usePersist(storage, featuresRef.current, overridesState); - const testCallback = useTestCallback(overridesState, defaultsState); - useConsoleOverride(!disableConsole, featuresRef.current, testCallback, defaultsDispatch); - const featureValue = useMemo3(() => ({ - overridesSend: overridesDispatch, - defaultsSend: defaultsDispatch, - featuresDescription: featuresRef.current, - overridesState, - defaultsState, - test: testCallback - }), [overridesState, defaultsState, testCallback]); - return /* @__PURE__ */ React3.createElement(FeatureContext.Provider, { - value: featureValue - }, /* @__PURE__ */ React3.createElement(EnableContext.Provider, { - value: testCallback - }, children)); -} - -// src/ToggleFeatures.tsx -import { RadioGroup } from "@headlessui/react"; -import React4, { - useCallback as useCallback2, - useContext as useContext2, - useState -} from "react"; -import ReactDOM from "react-dom"; - -// src/tailwind.css -var tailwind_default = `/* -! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured \`sans\` font-family by default. -*/ - -html { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from \`html\` so users can set them as a class directly on the \`html\` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured \`mono\` font family by default. -2. Correct the odd \`em\` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-size: 1em; - /* 2 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent \`sub\` and \`sup\` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - line-height: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -[type='button'], -[type='reset'], -[type='submit'] { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional \`:invalid\` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to \`inherit\` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} - -fieldset { - margin: 0; - padding: 0; -} - -legend { - padding: 0; -} - -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements \`display: block\` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add \`vertical-align: middle\` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* -Ensure the default browser behavior of the \`hidden\` attribute. -*/ - -[hidden] { - display: none; -} - -[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - border-radius: 0px; - padding-top: 0.5rem; - padding-right: 0.75rem; - padding-bottom: 0.5rem; - padding-left: 0.75rem; - font-size: 1rem; - line-height: 1.5rem; - --tw-shadow: 0 0 #0000; -} - -[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); - border-color: #2563eb; -} - -input::-moz-placeholder, textarea::-moz-placeholder { - color: #6b7280; - opacity: 1; -} - -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - color: #6b7280; - opacity: 1; -} - -input::placeholder,textarea::placeholder { - color: #6b7280; - opacity: 1; -} - -::-webkit-datetime-edit-fields-wrapper { - padding: 0; -} - -::-webkit-date-and-time-value { - min-height: 1.5em; -} - -::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field { - padding-top: 0; - padding-bottom: 0; -} - -select { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 0.5rem center; - background-repeat: no-repeat; - background-size: 1.5em 1.5em; - padding-right: 2.5rem; - -webkit-print-color-adjust: exact; - color-adjust: exact; -} - -[multiple] { - background-image: initial; - background-position: initial; - background-repeat: unset; - background-size: initial; - padding-right: 0.75rem; - -webkit-print-color-adjust: unset; - color-adjust: unset; -} - -[type='checkbox'],[type='radio'] { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding: 0; - -webkit-print-color-adjust: exact; - color-adjust: exact; - display: inline-block; - vertical-align: middle; - background-origin: border-box; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - flex-shrink: 0; - height: 1rem; - width: 1rem; - color: #2563eb; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - --tw-shadow: 0 0 #0000; -} - -[type='checkbox'] { - border-radius: 0px; -} - -[type='radio'] { - border-radius: 100%; -} - -[type='checkbox']:focus,[type='radio']:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 2px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); -} - -[type='checkbox']:checked,[type='radio']:checked { - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} - -[type='checkbox']:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); -} - -[type='radio']:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); -} - -[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus { - border-color: transparent; - background-color: currentColor; -} - -[type='checkbox']:indeterminate { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} - -[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { - border-color: transparent; - background-color: currentColor; -} - -[type='file'] { - background: unset; - border-color: inherit; - border-width: 0; - border-radius: 0; - padding: 0; - font-size: unset; - line-height: inherit; -} - -[type='file']:focus { - outline: 1px auto -webkit-focus-ring-color; -} - -*, ::before, ::after { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - -.container { - width: 100%; -} - -@media (min-width: 640px) { - .container { - max-width: 640px; - } -} - -@media (min-width: 768px) { - .container { - max-width: 768px; - } -} - -@media (min-width: 1024px) { - .container { - max-width: 1024px; - } -} - -@media (min-width: 1280px) { - .container { - max-width: 1280px; - } -} - -@media (min-width: 1536px) { - .container { - max-width: 1536px; - } -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} - -.pointer-events-none { - pointer-events: none; -} - -.invisible { - visibility: hidden; -} - -.fixed { - position: fixed; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.-inset-px { - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.inset-0 { - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; -} - -.bottom-0 { - bottom: 0px; -} - -.left-0 { - left: 0px; -} - -.z-10 { - z-index: 10; -} - -.mx-4 { - margin-left: 1rem; - margin-right: 1rem; -} - -.my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} - -.mx-8 { - margin-left: 2rem; - margin-right: 2rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-1 { - margin-top: 0.25rem; -} - -.mt-6 { - margin-top: 1.5rem; -} - -.mt-5 { - margin-top: 1.25rem; -} - -.inline-block { - display: inline-block; -} - -.flex { - display: flex; -} - -.inline-flex { - display: inline-flex; -} - -.grid { - display: grid; -} - -.hidden { - display: none; -} - -.h-7 { - height: 1.75rem; -} - -.h-4 { - height: 1rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-8 { - height: 2rem; -} - -.h-6 { - height: 1.5rem; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-4 { - width: 1rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-8 { - width: 2rem; -} - -.w-6 { - width: 1.5rem; -} - -.max-w-full { - max-width: 100%; -} - -.shrink { - flex-shrink: 1; -} - -.grow { - flex-grow: 1; -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.cursor-not-allowed { - cursor: not-allowed; -} - -.cursor-pointer { - cursor: pointer; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.flex-row { - flex-direction: row; -} - -.flex-col { - flex-direction: column; -} - -.flex-nowrap { - flex-wrap: nowrap; -} - -.items-end { - align-items: flex-end; -} - -.items-center { - align-items: center; -} - -.justify-center { - justify-content: center; -} - -.gap-2 { - gap: 0.5rem; -} - -.gap-1 { - gap: 0.25rem; -} - -.gap-4 { - gap: 1rem; -} - -.gap-9 { - gap: 2.25rem; -} - -.gap-y-6 { - row-gap: 1.5rem; -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-y-auto { - overflow-y: auto; -} - -.rounded-sm { - border-radius: 0.125rem; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-full { - border-radius: 9999px; -} - -.border { - border-width: 1px; -} - -.border-2 { - border-width: 2px; -} - -.border-orange-500 { - --tw-border-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-border-opacity)); -} - -.border-green-500 { - --tw-border-opacity: 1; - border-color: rgb(34 197 94 / var(--tw-border-opacity)); -} - -.border-red-500 { - --tw-border-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-border-opacity)); -} - -.border-transparent { - border-color: transparent; -} - -.border-gray-300 { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); -} - -.border-blue-500 { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} - -.border-gray-500 { - --tw-border-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-border-opacity)); -} - -.bg-blue-600 { - --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.p-3 { - padding: 0.75rem; -} - -.p-1 { - padding: 0.25rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} - -.pt-4 { - padding-top: 1rem; -} - -.pb-10 { - padding-bottom: 2.5rem; -} - -.pt-5 { - padding-top: 1.25rem; -} - -.pb-4 { - padding-bottom: 1rem; -} - -.pt-0 { - padding-top: 0px; -} - -.pb-0 { - padding-bottom: 0px; -} - -.pr-4 { - padding-right: 1rem; -} - -.pl-4 { - padding-left: 1rem; -} - -.text-left { - text-align: left; -} - -.align-middle { - vertical-align: middle; -} - -.align-bottom { - vertical-align: bottom; -} - -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.font-medium { - font-weight: 500; -} - -.leading-6 { - line-height: 1.5rem; -} - -.leading-7 { - line-height: 1.75rem; -} - -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} - -.text-orange-500 { - --tw-text-opacity: 1; - color: rgb(249 115 22 / var(--tw-text-opacity)); -} - -.text-green-500 { - --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity)); -} - -.text-red-500 { - --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); -} - -.text-blue-500 { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.shadow-xl { - --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); -} - -.ring-2 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.ring-blue-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); -} - -.ring-gray-500 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity)); -} - -.invert { - --tw-invert: invert(100%); - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} - -.transition-all { - transition-property: all; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - -.focus\\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.focus\\:ring-2:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - -.focus\\:ring-blue-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); -} - -.focus\\:ring-offset-2:focus { - --tw-ring-offset-width: 2px; -} - -@media (min-width: 640px) { - .sm\\:my-8 { - margin-top: 2rem; - margin-bottom: 2rem; - } - - .sm\\:mt-3 { - margin-top: 0.75rem; - } - - .sm\\:mt-6 { - margin-top: 1.5rem; - } - - .sm\\:block { - display: block; - } - - .sm\\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } - - .sm\\:gap-x-4 { - -moz-column-gap: 1rem; - column-gap: 1rem; - } - - .sm\\:p-0 { - padding: 0px; - } - - .sm\\:p-6 { - padding: 1.5rem; - } - - .sm\\:align-middle { - vertical-align: middle; - } - - .sm\\:text-sm { - font-size: 0.875rem; - line-height: 1.25rem; - } -} - -@media (min-width: 1024px) { - .lg\\:max-w-\\[80\\%\\] { - max-width: 80%; - } - - .lg\\:gap-4 { - gap: 1rem; - } -} -`; - -// src/ToggleFeatures.tsx -function classNames(...classes) { - return classes.filter(Boolean).join(" "); -} -function ToggleFeature({ - feature -}) { - var _a, _b, _c; - const context = useContext2(FeatureContext); - const handleChangeSelection = useCallback2((value) => { - if ((context == null ? void 0 : context.overridesSend) != null) { - switch (value) { - case "true": { - context.overridesSend({ type: "ENABLE", name: feature.name }); - break; - } - case "false": { - context.overridesSend({ type: "DISABLE", name: feature.name }); - break; - } - case "unset": { - context.overridesSend({ type: "UNSET", name: feature.name }); - break; - } - } - } - }, [feature.name, context]); - if (context == null) { - return null; - } - const { overridesState, test: testFeature2, defaultsState } = context; - const valueInDefaults = ((_a = valueOfFeature(defaultsState, feature.name)[0]) != null ? _a : "unset").toString(); - const valueInOverrides = ((_b = valueOfFeature(overridesState, feature.name)[0]) != null ? _b : "unset").toString(); - const actualChecked = testFeature2(feature.name); - return /* @__PURE__ */ React4.createElement(RadioGroup, { - disabled: feature.noOverride, - onChange: handleChangeSelection, - value: valueInOverrides - }, /* @__PURE__ */ React4.createElement(RadioGroup.Label, null, /* @__PURE__ */ React4.createElement("h6", { - className: "text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7" - }, /* @__PURE__ */ React4.createElement("span", { - className: "font-medium" - }, "Feature: ", /* @__PURE__ */ React4.createElement("code", null, feature.name)), feature.noOverride === true ? /* @__PURE__ */ React4.createElement("div", { - className: "border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" - }, /* @__PURE__ */ React4.createElement("svg", { - "aria-hidden": "true", - className: "h-4 w-4 min-w-4", - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ React4.createElement("path", { - clipRule: "evenodd", - d: "M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z", - fillRule: "evenodd" - })), /* @__PURE__ */ React4.createElement("div", null, "No Overrides")) : null, actualChecked === true ? /* @__PURE__ */ React4.createElement("div", { - className: "flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1" - }, /* @__PURE__ */ React4.createElement("svg", { - "aria-hidden": "true", - className: "h-4 w-4 min-w-4", - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ React4.createElement("path", { - clipRule: "evenodd", - d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", - fillRule: "evenodd" - })), /* @__PURE__ */ React4.createElement("div", null, actualChecked ? "Enabled" : "Disabled")) : null), feature.description == null ? null : /* @__PURE__ */ React4.createElement("p", { - className: "text-base text-gray-500 text-sm" - }, feature.description)), /* @__PURE__ */ React4.createElement("div", { - className: "mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4" - }, [ - { - id: "false", - title: `Disable ${feature.name}`, - description: "Override the feature to be disabled" - }, - { - id: "unset", - title: "Default", - description: "Inherit enabled state from defaults", - disabled: ((_c = feature.noOverride) != null ? _c : false) || feature.force, - defaultValue: valueInDefaults === "true" ? /* @__PURE__ */ React4.createElement("div", { - className: "text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" - }, /* @__PURE__ */ React4.createElement("span", null, "Enabled")) : /* @__PURE__ */ React4.createElement("div", { - className: "text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1" - }, /* @__PURE__ */ React4.createElement("span", null, "Disabled")) - }, - { - id: "true", - title: `Enable ${feature.name}`, - description: "Override the feature to be enabled" - } - ].map((option) => /* @__PURE__ */ React4.createElement(RadioGroup.Option, { - className: ({ checked, active, disabled }) => classNames(checked ? "border-transparent" : "border-gray-300", !disabled && active ? "border-blue-500 ring-2 ring-blue-500" : "", disabled ? "border-transparent ring-gray-500 cursor-not-allowed" : "cursor-pointer", "relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none"), - disabled: option.disabled, - key: option.id, - value: option.id - }, ({ checked, active, disabled }) => /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement("div", { - className: "flex flex-col grow" - }, /* @__PURE__ */ React4.createElement(RadioGroup.Label, { - as: "span", - className: "flex flex-nowrap flex-row gap-1 items-center space-between" - }, /* @__PURE__ */ React4.createElement("span", { - className: "text-sm font-medium text-gray-900 grow shrink" - }, option.title), option.defaultValue != null ? option.defaultValue : null, /* @__PURE__ */ React4.createElement("svg", { - "aria-hidden": "true", - className: classNames(!checked ? "invisible" : "", "h-5 w-5 text-blue-500 min-w-4"), - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ React4.createElement("path", { - clipRule: "evenodd", - d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", - fillRule: "evenodd" - }))), /* @__PURE__ */ React4.createElement(RadioGroup.Description, { - as: "span", - className: "mt-1 flex items-center text-sm text-gray-500" - }, option.description)), /* @__PURE__ */ React4.createElement("div", { - "aria-hidden": "true", - className: classNames(!disabled && active ? "border" : "border-2", checked ? disabled ? "border-gray-500" : "border-blue-500" : "border-transparent", "absolute -inset-px rounded-lg pointer-events-none") - })))))); -} -function ShadowContent({ - root, - children -}) { - return ReactDOM.createPortal(children, root); -} -function ToggleFeatures({ - defaultOpen = false, - hidden = false -}) { - const [root, setCoreRoot] = useState(null); - const setRoot = (host) => { - if (host == null || root != null) { - return; - } - const shadowRoot = host == null ? void 0 : host.attachShadow({ mode: "open" }); - const style = document.createElement("style"); - const renderDiv = document.createElement("div"); - style.textContent = tailwind_default; - shadowRoot.appendChild(style); - shadowRoot.appendChild(renderDiv); - setCoreRoot(renderDiv); - }; - if (hidden) { - return null; - } - return /* @__PURE__ */ React4.createElement("div", { - ref: setRoot, - style: { - zIndex: 99999, - position: "fixed", - width: "0", - height: "0", - bottom: 0 - } - }, root != null ? /* @__PURE__ */ React4.createElement(ShadowContent, { - root - }, /* @__PURE__ */ React4.createElement(ToggleFeatureUnwrapped, { - defaultOpen - })) : null); -} -function ToggleFeatureUnwrapped({ - defaultOpen = false, - hidden = false -}) { - const [open, setOpen] = useState(defaultOpen); - const context = useContext2(FeatureContext); - if (context == null) { - return null; - } - if (hidden) { - return null; - } - const { featuresDescription } = context; - if (featuresDescription.length === 0) { - return null; - } - return /* @__PURE__ */ React4.createElement("div", { - className: "relative" - }, /* @__PURE__ */ React4.createElement("div", { - className: "absolute bottom-0 left-0 mx-4 my-4" - }, /* @__PURE__ */ React4.createElement("button", { - className: "inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", - onClick: () => setOpen(true), - title: "Toggle features", - type: "button" - }, /* @__PURE__ */ React4.createElement("svg", { - className: "w-6 h-6 min-h-6 min-w-6", - fill: "currentColor", - viewBox: "0 0 20 20", - xmlns: "http://www.w3.org/2000/svg" - }, /* @__PURE__ */ React4.createElement("path", { - clipRule: "evenodd", - d: "M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z", - fillRule: "evenodd" - })))), !open ? null : /* @__PURE__ */ React4.createElement("div", { - className: "fixed z-10 inset-0 overflow-y-auto" - }, /* @__PURE__ */ React4.createElement("div", { - className: "flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0" - }, /* @__PURE__ */ React4.createElement("div", { - className: "relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full" - }, /* @__PURE__ */ React4.createElement("div", null, /* @__PURE__ */ React4.createElement("div", { - className: "mt-1 sm:mt-3" - }, /* @__PURE__ */ React4.createElement("h3", { - className: "flex flex-row gap-4 flex-nowrap items-center space-between" - }, /* @__PURE__ */ React4.createElement("div", { - className: "grow text-lg leading-6 font-medium text-gray-900" - }, "Feature Flag Overrides")), /* @__PURE__ */ React4.createElement("p", { - className: "text-sm text-gray-500" - }, "Features can be enabled or disabled unless they are forced upstream. You can also revert to default."), /* @__PURE__ */ React4.createElement("div", { - className: "mt-6" - }, /* @__PURE__ */ React4.createElement("fieldset", { - className: "flex flex-col gap-9" - }, /* @__PURE__ */ React4.createElement("legend", { - className: "sr-only" - }, "Feature Flags"), featuresDescription.map((feature) => /* @__PURE__ */ React4.createElement(ToggleFeature, { - feature, - key: feature.name - })))), /* @__PURE__ */ React4.createElement("div", { - className: "flex justify-center items-center mt-5 sm:mt-6" - }, /* @__PURE__ */ React4.createElement("button", { - className: "inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", - onClick: () => setOpen(false), - type: "button" - }, "Done")))))))); -} -export { - Disable, - Enable, - EnableContext, - Features, - ToggleFeatures, - useAllDisabled, - useAllEnabled, - useDisabled, - useEnabled -}; -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0Rpc2FibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91dGlscy50cyIsICIuLi8uLi8uLi9zcmMvRW5hYmxlQ29udGV4dC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZUFsbERpc2FibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRGlzYWJsZWQudHN4IiwgIi4uLy4uLy4uL3NyYy9FbmFibGUudHN4IiwgIi4uLy4uLy4uL3NyYy91c2VBbGxFbmFibGVkLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlRW5hYmxlZC50c3giLCAiLi4vLi4vLi4vc3JjL0ZlYXR1cmVzLnRzeCIsICIuLi8uLi8uLi9zcmMvRmVhdHVyZUNvbnRleHQudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlU3RhdGUudHN4IiwgIi4uLy4uLy4uL3NyYy9GZWF0dXJlc1N0YXRlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlQ29uc29sZU92ZXJyaWRlLnRzeCIsICIuLi8uLi8uLi9zcmMvR2xvYmFsRW5hYmxlLnRzeCIsICIuLi8uLi8uLi9zcmMvdXNlUGVyc2lzdC50c3giLCAiLi4vLi4vLi4vc3JjL3VzZVRlc3RDYWxsYmFjay50c3giLCAiLi4vLi4vLi4vc3JjL3Rlc3RGZWF0dXJlLnRzeCIsICIuLi8uLi8uLi9zcmMvVG9nZ2xlRmVhdHVyZXMudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiBKU1ggcmVxdWlyZXMgUmVhY3QgYXQgcnVudGltZVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IEVuYWJsZVByb3BzIH0gZnJvbSAnLi9FbmFibGUnO1xuaW1wb3J0IHsgdXNlQWxsRGlzYWJsZWQgfSBmcm9tICcuL3VzZUFsbERpc2FibGVkJztcbmltcG9ydCB7IHVzZURpc2FibGVkIH0gZnJvbSAnLi91c2VEaXNhYmxlZCc7XG5cbi8qKlxuICogRmVhdHVyZSB3aWxsIGJlIGRpc2FibGVkIGlmIGFueSBpbiB0aGUgbGlzdCBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgY29uc3QgRGlzYWJsZTogUmVhY3QuRkM8RW5hYmxlUHJvcHM+ID0gKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlbixcbn0pID0+IHtcbiAgY29uc3QgaXNBbnkgPSB1c2VEaXNhYmxlZChmZWF0dXJlKTtcbiAgY29uc3QgaXNBbGwgPSB1c2VBbGxEaXNhYmxlZChhbGxGZWF0dXJlcyk7XG5cbiAgaWYgKGlzQW55IHx8IGlzQWxsKSB7XG4gICAgcmV0dXJuIDw+e2NoaWxkcmVufTwvPjtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcbiIsICJpbXBvcnQgeyB1c2VDb250ZXh0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyBFbmFibGVDb250ZXh0LCB0eXBlIEVuYWJsZUNvbnRleHRUeXBlIH0gZnJvbSAnLi9FbmFibGVDb250ZXh0JztcblxuLy8gSGVscGVyOiBnZXQgcmlkIG9mIHNvbWUgYm9pbGVycGxhdGUuXG4vLyBqdXN0IGlucHV0IG1hc2hpbmcgYW5kIHNhbml0YXRpb24sIHJlbW92aW5nIGV4dHJhIHJlbmRlcnMsIGFuZCBnZXR0aW5nIHRlc3QgZnVuY3Rpb25cbmV4cG9ydCBmdW5jdGlvbiB1c2VUZXN0QW5kQ29udmVydChcbiAgaW5wdXQ/OiBzdHJpbmdbXSB8IHN0cmluZyB8IG51bGwsXG4pOiBbRW5hYmxlQ29udGV4dFR5cGUsIHN0cmluZ1tdXSB7XG4gIGNvbnN0IHRlc3QgPSB1c2VDb250ZXh0KEVuYWJsZUNvbnRleHQpO1xuXG4gIC8vIFdlIG1lbW9pemUganVzdCB0byBwcmV2ZW50IHJlLXJlbmRlcnMgc2luY2UgdGhpcyBjb3VsZCBiZSBhdCB0aGUgbGVhZiBvZiBhIHRyZWVcbiAgY29uc3QgY29udmVydGVkID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoaW5wdXQgPT0gbnVsbCA/IFtdIDogQXJyYXkuaXNBcnJheShpbnB1dCkgPyBpbnB1dCA6IFtpbnB1dF0pLFxuICAgIFtpbnB1dF0sXG4gICk7XG5cbiAgcmV0dXJuIFt0ZXN0LCBjb252ZXJ0ZWRdO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUNvbnRleHQgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgdHlwZSBFbmFibGVDb250ZXh0VHlwZSA9IChmZWF0dXJlOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZTtcblxuLyoqXG4gKiBDb250YWluZWQgZnVuY3Rpb24gY2FuIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBFbmFibGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxFbmFibGVDb250ZXh0VHlwZT4oKF9zKSA9PiBmYWxzZSk7XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFsbCBzcGVjaWZpZWQgZmVhdHVyZXMgYXJlIGRpc2FibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VBbGxEaXNhYmxlZCh3aXRob3V0QWxsOiBzdHJpbmdbXSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBbdGVzdCwgcXVlcnlBbGxXaXRob3V0XSA9IHVzZVRlc3RBbmRDb252ZXJ0KHdpdGhvdXRBbGwpO1xuICByZXR1cm4gKFxuICAgIHdpdGhvdXRBbGwubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFdpdGhvdXQuZXZlcnkoKHgpID0+ICEodGVzdCh4KSA/PyBmYWxzZSkpXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFueSBzcGVjaWZpZWQgZmVhdHVyZSBpcyBkaXNhYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRGlzYWJsZWQod2l0aG91dDogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QW55V2l0aG91dF0gPSB1c2VUZXN0QW5kQ29udmVydCh3aXRob3V0KTtcbiAgcmV0dXJuIHF1ZXJ5QW55V2l0aG91dC5zb21lKCh4KSA9PiAhKHRlc3QoeCkgPz8gZmFsc2UpKTtcbn1cbiIsICIvLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiBKU1ggcmVxdWlyZXMgUmVhY3QgYXQgcnVudGltZVxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgeyB1c2VBbGxFbmFibGVkIH0gZnJvbSAnLi91c2VBbGxFbmFibGVkJztcbmltcG9ydCB7IHVzZUVuYWJsZWQgfSBmcm9tICcuL3VzZUVuYWJsZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVuYWJsZVByb3BzIHtcbiAgcmVhZG9ubHkgZmVhdHVyZT86IHN0cmluZ1tdIHwgc3RyaW5nO1xuICByZWFkb25seSBhbGxGZWF0dXJlcz86IHN0cmluZ1tdO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufVxuXG4vKipcbiAqIEZlYXR1cmUgd2lsbCBiZSBlbmFibGVkIGlmIGFueSBmZWF0dXJlIGluIHRoZSBsaXN0IGFyZSBlbmFibGVkLFxuICovXG5leHBvcnQgZnVuY3Rpb24gRW5hYmxlKHtcbiAgZmVhdHVyZSA9IFtdLFxuICBhbGxGZWF0dXJlcyA9IFtdLFxuICBjaGlsZHJlbixcbn06IEVuYWJsZVByb3BzKTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgaXNBbnkgPSB1c2VFbmFibGVkKGZlYXR1cmUpO1xuICBjb25zdCBpc0FsbCA9IHVzZUFsbEVuYWJsZWQoYWxsRmVhdHVyZXMpO1xuXG4gIGlmIChpc0FueSB8fCBpc0FsbCkge1xuICAgIHJldHVybiA8PntjaGlsZHJlbn08Lz47XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICJpbXBvcnQgeyB1c2VUZXN0QW5kQ29udmVydCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZmYgYWxsIHNwZWNpZmllZCBmZWF0dXJlcyBhcmUgZW5hYmxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlQWxsRW5hYmxlZChhbGxGZWF0dXJlczogc3RyaW5nW10gfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgW3Rlc3QsIHF1ZXJ5QWxsUHJlc2VudF0gPSB1c2VUZXN0QW5kQ29udmVydChhbGxGZWF0dXJlcyk7XG4gIHJldHVybiBxdWVyeUFsbFByZXNlbnQubGVuZ3RoID4gMCAmJiBxdWVyeUFsbFByZXNlbnQuZXZlcnkodGVzdCk7XG59XG4iLCAiaW1wb3J0IHsgdXNlVGVzdEFuZENvbnZlcnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWZmIGFueSBzcGVjaWZpZWQgZmVhdHVyZSBpcyBlbmFibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VFbmFibGVkKGZlYXR1cmU6IHN0cmluZ1tdIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IFt0ZXN0LCBxdWVyeUFueVByZXNlbnRdID0gdXNlVGVzdEFuZENvbnZlcnQoZmVhdHVyZSk7XG4gIHJldHVybiBxdWVyeUFueVByZXNlbnQuc29tZSh0ZXN0KTtcbn1cbiIsICJpbXBvcnQgUmVhY3QsIHtcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlUmVkdWNlcixcbiAgdXNlUmVmLFxufSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IEVuYWJsZUNvbnRleHQgfSBmcm9tICcuL0VuYWJsZUNvbnRleHQnO1xuaW1wb3J0IHsgRmVhdHVyZUNvbnRleHQgfSBmcm9tICcuL0ZlYXR1cmVDb250ZXh0JztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHsgZmVhdHVyZXNSZWR1Y2VyLCBpbml0aWFsRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgdXNlQ29uc29sZU92ZXJyaWRlIGZyb20gJy4vdXNlQ29uc29sZU92ZXJyaWRlJztcbmltcG9ydCB1c2VQZXJzaXN0LCB7IEtFWSB9IGZyb20gJy4vdXNlUGVyc2lzdCc7XG5pbXBvcnQgdXNlVGVzdENhbGxiYWNrIGZyb20gJy4vdXNlVGVzdENhbGxiYWNrJztcblxuaW50ZXJmYWNlIEZlYXR1cmVQcm9wcyB7XG4gIHJlYWRvbmx5IGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXTtcbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGRpc2FibGVDb25zb2xlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RvcmFnZT86IFN0b3JhZ2U7XG59XG5cbi8qKlxuICogQSBtb3JlIGJhdHRlcmllcy1lbmFibGVkIHBhcmVudCBjb21wb25lbnQgdGhhdCBrZWVwcyB0cmFjayBvZiBmZWF0dXJlIHN0YXRlXG4gKiBpbnRlcm5hbGx5LCBhbmQgY3JlYXRlcyB3aW5kb3cuZmVhdHVyZS5lbmFibGUoXCJmXCIpIGFuZCB3aW5kb3cuZmVhdHVyZS5kaXNhYmxlKFwiZlwiKS5cbiAqIEtlZXBzIHRyYWNrIG9mIG92ZXJyaWRlcyBhbmQgZGVmYXVsdHMsIHdpdGggZGVmYXVsdHMgcG90ZW50aWFsbHkgY29taW5nIGZyb20geW91ciBwcm9wc1xuICogYW5kIG92ZXJyaWRlcyBiZWluZyBwZXJzaXN0ZWQgdG8geW91ciBjaG9pY2Ugb2Ygc3RvcmFnZSBsYXllci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZlYXR1cmVzKHtcbiAgY2hpbGRyZW4sXG4gIGZlYXR1cmVzLFxuICBkaXNhYmxlQ29uc29sZSA9IGZhbHNlLFxuICBzdG9yYWdlID0gd2luZG93LnNlc3Npb25TdG9yYWdlLFxufTogRmVhdHVyZVByb3BzKTogSlNYLkVsZW1lbnQge1xuICAvLyBDYXB0dXJlIG9ubHkgZmlyc3QgdmFsdWU7IHdlIGRvbid0IGNhcmUgYWJvdXQgZnV0dXJlIHVwZGF0ZXNcbiAgY29uc3QgZmVhdHVyZXNSZWYgPSB1c2VSZWYoZmVhdHVyZXMpO1xuICBjb25zdCBbb3ZlcnJpZGVzU3RhdGUsIG92ZXJyaWRlc0Rpc3BhdGNoXSA9IHVzZVJlZHVjZXIoXG4gICAgZmVhdHVyZXNSZWR1Y2VyLFxuICAgIGluaXRpYWxGZWF0dXJlc1N0YXRlLFxuICApO1xuICBjb25zdCBbZGVmYXVsdHNTdGF0ZSwgZGVmYXVsdHNEaXNwYXRjaF0gPSB1c2VSZWR1Y2VyKFxuICAgIGZlYXR1cmVzUmVkdWNlcixcbiAgICBpbml0aWFsRmVhdHVyZXNTdGF0ZSxcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vLyBMb2FkIGRlZmF1bHRzXG4gICAgZGVmYXVsdHNEaXNwYXRjaCh7IHR5cGU6ICdJTklUJywgZmVhdHVyZXMgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRlZmF1bHRzRGlzcGF0Y2goeyB0eXBlOiAnREVfSU5JVCcgfSk7XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgZjogUmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHVuZGVmaW5lZD4gPSB7fTtcbiAgICBpZiAoc3RvcmFnZSAhPSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBmZWF0dXJlc0pzb24gPSBzdG9yYWdlLmdldEl0ZW0oS0VZKTtcbiAgICAgICAgaWYgKGZlYXR1cmVzSnNvbiAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgZmggPSBKU09OLnBhcnNlKGZlYXR1cmVzSnNvbik7XG4gICAgICAgICAgZiA9IGZoLm92ZXJyaWRlcztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBDYW4ndCBwYXJzZSBvciBnZXQgb3Igb3RoZXJ3aXNlOyBpZ25vcmVcbiAgICAgICAgY29uc29sZS5lcnJvcignZXJyb3IgaW4gbG9jYWxTdG9yYWdlJywgZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGVzRGlzcGF0Y2goe1xuICAgICAgdHlwZTogJ0lOSVQnLFxuICAgICAgZmVhdHVyZXM6IGZlYXR1cmVzUmVmLmN1cnJlbnRcbiAgICAgICAgLmZpbHRlcigoeCkgPT4geC5ub092ZXJyaWRlICE9PSB0cnVlKVxuICAgICAgICAubWFwKCh4KSA9PiAoe1xuICAgICAgICAgIG5hbWU6IHgubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogeC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBkZWZhdWx0VmFsdWU6IGY/Llt4Lm5hbWVdID8/IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIG92ZXJyaWRlc0Rpc3BhdGNoKHsgdHlwZTogJ0RFX0lOSVQnIH0pO1xuICAgIH07XG4gIH0sIFtzdG9yYWdlXSk7XG5cbiAgLy8gSGFuZGxlIGFzeW5jIG9wZXJhdGlvbnMgZm9yIGZlYXR1cmVzIHdpdGggb25DaGFuZ2VEZWZhdWx0XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRlZmF1bHRzU3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZmVhdHVyZXMgaW4gYXN5bmMgc3RhdGVzIGFuZCBoYW5kbGUgdGhlbVxuICAgIE9iamVjdC5lbnRyaWVzKGRlZmF1bHRzU3RhdGUuY29udGV4dC5mZWF0dXJlcykuZm9yRWFjaChcbiAgICAgIChbbmFtZSwgZmVhdHVyZV0pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0VuYWJsZWQnIHx8XG4gICAgICAgICAgZmVhdHVyZS52YWx1ZSA9PT0gJ2FzeW5jRGlzYWJsZWQnIHx8XG4gICAgICAgICAgZmVhdHVyZS52YWx1ZSA9PT0gJ2FzeW5jVW5zcGVjaWZpZWQnXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldFZhbHVlID1cbiAgICAgICAgICAgIGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0VuYWJsZWQnXG4gICAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgICA6IGZlYXR1cmUudmFsdWUgPT09ICdhc3luY0Rpc2FibGVkJ1xuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIGNvbnN0IG9uQ2hhbmdlRGVmYXVsdCA9IGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdDtcbiAgICAgICAgICBpZiAob25DaGFuZ2VEZWZhdWx0ICE9IG51bGwgJiYgZmVhdHVyZS5mZWF0dXJlRGVzYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBvbkNoYW5nZURlZmF1bHQoZmVhdHVyZS5mZWF0dXJlRGVzYy5uYW1lLCB0YXJnZXRWYWx1ZSlcbiAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlZmF1bHRzRGlzcGF0Y2goeyB0eXBlOiAnQVNZTkNfRE9ORScsIG5hbWUsIHZhbHVlOiByZXN1bHQgfSk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdHNEaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnQVNZTkNfRE9ORScsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH0sIFtkZWZhdWx0c1N0YXRlXSk7XG5cbiAgdXNlUGVyc2lzdChzdG9yYWdlLCBmZWF0dXJlc1JlZi5jdXJyZW50LCBvdmVycmlkZXNTdGF0ZSk7XG5cbiAgY29uc3QgdGVzdENhbGxiYWNrID0gdXNlVGVzdENhbGxiYWNrKG92ZXJyaWRlc1N0YXRlLCBkZWZhdWx0c1N0YXRlKTtcbiAgdXNlQ29uc29sZU92ZXJyaWRlKFxuICAgICFkaXNhYmxlQ29uc29sZSxcbiAgICBmZWF0dXJlc1JlZi5jdXJyZW50LFxuICAgIHRlc3RDYWxsYmFjayxcbiAgICBkZWZhdWx0c0Rpc3BhdGNoLFxuICApO1xuXG4gIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gKHtcbiAgICAgIG92ZXJyaWRlc1NlbmQ6IG92ZXJyaWRlc0Rpc3BhdGNoLFxuICAgICAgZGVmYXVsdHNTZW5kOiBkZWZhdWx0c0Rpc3BhdGNoLFxuICAgICAgZmVhdHVyZXNEZXNjcmlwdGlvbjogZmVhdHVyZXNSZWYuY3VycmVudCxcbiAgICAgIG92ZXJyaWRlc1N0YXRlLFxuICAgICAgZGVmYXVsdHNTdGF0ZSxcbiAgICAgIHRlc3Q6IHRlc3RDYWxsYmFjayxcbiAgICB9KSxcbiAgICBbb3ZlcnJpZGVzU3RhdGUsIGRlZmF1bHRzU3RhdGUsIHRlc3RDYWxsYmFja10sXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8RmVhdHVyZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2ZlYXR1cmVWYWx1ZX0+XG4gICAgICA8RW5hYmxlQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17dGVzdENhbGxiYWNrfT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9FbmFibGVDb250ZXh0LlByb3ZpZGVyPlxuICAgIDwvRmVhdHVyZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59XG4iLCAiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVzRGlzcGF0Y2gsIEZlYXR1cmVzU3RhdGUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG5leHBvcnQgY29uc3QgRmVhdHVyZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEZlYXR1cmVDb250ZXh0VHlwZSB8IG51bGw+KG51bGwpO1xuXG4vLy8gR2l2ZSBhY2Nlc3MgdG8gdGhlIG92ZXJyaWRlcyBsYXllclxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlQ29udGV4dFR5cGUge1xuICAvLyBNYWtlIGNoYW5nZXMgdG8gdGhlIG92ZXJyaWRlc1xuICBvdmVycmlkZXNTZW5kOiBGZWF0dXJlc0Rpc3BhdGNoO1xuXG4gIC8vIE1ha2UgY2hhbmdlcyB0byBkZWZhdWx0c1xuICBkZWZhdWx0c1NlbmQ6IEZlYXR1cmVzRGlzcGF0Y2g7XG5cbiAgZmVhdHVyZXNEZXNjcmlwdGlvbjogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW107XG5cbiAgLy8gU3RhdGUgaXMgaW4gbGF5ZXJzOyBvdmVycmlkZXMgYW5kIGRlZmF1bHRzXG4gIG92ZXJyaWRlc1N0YXRlOiBGZWF0dXJlc1N0YXRlO1xuICBkZWZhdWx0c1N0YXRlOiBGZWF0dXJlc1N0YXRlO1xuXG4gIC8vLyBUZXN0IHdpdGggcHJvcGVyIGZhbGxiYWNrIGFuZCByZXNwZWN0aW5nIHRoZSB1c2VyJ3MgZm9yY2UgcHJlZmVyZW5jZVxuICB0ZXN0OiAoZmxhZzogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gJ3JlYWN0JztcblxuLyoqXG4gKiBGZWF0dXJlIGlzIGVpdGhlciBvbiwgb2ZmLCBvciAndW5zZXQnLFxuICogd2hpY2ggbWVhbnMgaXQgd2lsbCBnbyB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvciB0aGUgbGVzcyBzcGVjaWZpYyB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZVZhbHVlID0gZmFsc2UgfCB0cnVlIHwgdW5kZWZpbmVkO1xuXG5leHBvcnQgdHlwZSBGZWF0dXJlU3RhdGVWYWx1ZSA9XG4gIHwgJ2luaXRpYWwnXG4gIHwgJ2VuYWJsZWQnXG4gIHwgJ2Rpc2FibGVkJ1xuICB8ICd1bnNwZWNpZmllZCdcbiAgfCAnYXN5bmNFbmFibGVkJ1xuICB8ICdhc3luY0Rpc2FibGVkJ1xuICB8ICdhc3luY1Vuc3BlY2lmaWVkJztcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlU3RhdGUge1xuICB2YWx1ZTogRmVhdHVyZVN0YXRlVmFsdWU7XG4gIGZlYXR1cmVEZXNjPzogRmVhdHVyZURlc2NyaXB0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlRGlzcGF0Y2ggPSBEaXNwYXRjaDxGZWF0dXJlQWN0aW9uPjtcblxuLy8vIEdpdmVuIGEgZmVhdHVyZXN0YXRlLCBkZXRlcm1pbmUgdGhlIHZhbHVlIChvbiwgb2ZmLCBvciB1bnNldClcbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUZvclN0YXRlKFxuICBmZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSxcbik6IFtGZWF0dXJlVmFsdWUsIGJvb2xlYW5dIHtcbiAgcmV0dXJuIFtcbiAgICBmZWF0dXJlU3RhdGUudmFsdWUgPT09ICdlbmFibGVkJyB8fCBmZWF0dXJlU3RhdGUudmFsdWUgPT09ICdhc3luY0VuYWJsZWQnXG4gICAgICA/IHRydWVcbiAgICAgIDogZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnZGlzYWJsZWQnIHx8XG4gICAgICAgICAgZmVhdHVyZVN0YXRlLnZhbHVlID09PSAnYXN5bmNEaXNhYmxlZCdcbiAgICAgICAgPyBmYWxzZVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICBmZWF0dXJlU3RhdGUuZmVhdHVyZURlc2M/LmZvcmNlID8/IGZhbHNlLFxuICBdO1xufVxuXG4vKipcbiAqIERlZmluaXRpb24gb2YgYSBmZWF0dXJlIHRoYXQgY2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gKiBLIGlzIHRoZSB0eXBlIG9mIHRoZSBrZXkgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBmZWF0dXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVEZXNjcmlwdGlvbjxLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiB7XG4gIHJlYWRvbmx5IG5hbWU6IEs7XG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8vLyBJZiBzZXQsIHdpbGwgYmUgdXNlZCB0byB1cGRhdGUgdGhlIGZlYXR1cmUgZGVmYXVsdCBzdGF0ZSBpbnN0ZWFkIG9mIHNpbXBseSBvdmVycmlkaW5nLlxuICAvLy8gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB1c2UgdGhpcyB0byB1cGRhdGUgYSBmZWF0dXJlIGZsYWcgb24gYSBiYWNrZW5kIHNlcnZlci5cbiAgLy8vIHdoZW4gc2V0LCB0aGUgZmVhdHVyZSB3aWxsIGJlIHVwZGF0ZWQgb24gdGhlIGJhY2tlbmQgc2VydmVyLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgYXN5bmNcbiAgLy8vIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGZpbmFsIHN0YXRlIGFmdGVyIHRoZSBjaGFuZ2UuIHdoaWxlIGNoYW5naW5nLCB0aGUgZmVhdHVyZSB3aWxsIGJlXG4gIC8vLyBpbiB0aGUgJ2NoYW5naW5nJyBzdGF0ZS4gQWxzbyBub3RlIHRoYXQgdGhlIGZlYXR1cmUgd2lsbCBiZSBjaGFuZ2VkIGF0IHRoZSBcImRlZmF1bHRcIiBsYXllci5cbiAgcmVhZG9ubHkgb25DaGFuZ2VEZWZhdWx0PzogKFxuICAgIG5hbWU6IEssXG4gICAgbmV3VmFsdWU6IEZlYXR1cmVWYWx1ZSxcbiAgKSA9PiBQcm9taXNlPEZlYXR1cmVWYWx1ZT47XG5cbiAgLy8vIGlmIHNldCB0cnVlLCB3aWxsIGZvcmNlIHRoZSBmaWVsZCB0byB3aGF0IGl0IGlzIHNldCBoZXJlIHRocm91Z2ggbGF5ZXJzIG9mIHN0YXRlcy5cbiAgLy8vIHVzZWZ1bCB0byBpbnZlcnQgdGhlIGxheWVycywgc2ltaWxhciB0byAhaW1wb3J0YW50IGluIENTUy5cbiAgcmVhZG9ubHkgZm9yY2U/OiBib29sZWFuO1xuXG4gIC8vLyBJZiBzZXQgdG8gdHJ1ZSwgdGhlIGZlYXR1cmUgd2lsbCBub3QgYmUgb3ZlcnJpZGFibGUgYnkgdGhlIHVzZXIuXG4gIHJlYWRvbmx5IG5vT3ZlcnJpZGU/OiBib29sZWFuO1xuXG4gIC8vLyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoYXQgc2hvdWxkIGhhcHBlbiBpZiB0aGUgZmVhdHVyZSBpcyBub3Qgc2V0IHRvIGEgcGFydGljdWxhciB2YWx1ZS5cbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlPzogRmVhdHVyZVZhbHVlO1xufVxuXG4vKipcbiAqIEFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGEgZmVhdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRmVhdHVyZUFjdGlvbiA9XG4gIHwgeyB0eXBlOiAnRElTQUJMRScgfVxuICB8IHsgdHlwZTogJ0VOQUJMRScgfVxuICB8IHsgdHlwZTogJ0lOSVQnOyBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb24gfVxuICB8IHsgdHlwZTogJ1NFVCc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRScgfVxuICB8IHsgdHlwZTogJ1VOU0VUJyB9XG4gIHwgeyB0eXBlOiAnQVNZTkNfRE9ORSc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfTtcblxuZXhwb3J0IGNvbnN0IGluaXRpYWxGZWF0dXJlU3RhdGU6IEZlYXR1cmVTdGF0ZSA9IHtcbiAgdmFsdWU6ICdpbml0aWFsJyxcbn07XG5cbi8qKlxuICogUmVkdWNlciBmb3IgbWFuYWdpbmcgaW5kaXZpZHVhbCBmZWF0dXJlIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlUmVkdWNlcihcbiAgc3RhdGU6IEZlYXR1cmVTdGF0ZSxcbiAgYWN0aW9uOiBGZWF0dXJlQWN0aW9uLFxuKTogRmVhdHVyZVN0YXRlIHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ0lOSVQnOiB7XG4gICAgICBjb25zdCB7IGZlYXR1cmUgfSA9IGFjdGlvbjtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IHRydWVcbiAgICAgICAgICA/ICdlbmFibGVkJ1xuICAgICAgICAgIDogZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IGZhbHNlXG4gICAgICAgICAgICA/ICdkaXNhYmxlZCdcbiAgICAgICAgICAgIDogJ3Vuc3BlY2lmaWVkJztcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSBhcyBGZWF0dXJlU3RhdGVWYWx1ZSxcbiAgICAgICAgZmVhdHVyZURlc2M6IGZlYXR1cmUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0VOQUJMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNFbmFibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICB9XG5cbiAgICBjYXNlICdESVNBQkxFJzoge1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0Rpc2FibGVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgfVxuXG4gICAgY2FzZSAnVE9HR0xFJzoge1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0VuYWJsZWQnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdlbmFibGVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1VOU0VUJzoge1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY1Vuc3BlY2lmaWVkJyB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAndW5zcGVjaWZpZWQnIH07XG4gICAgfVxuXG4gICAgY2FzZSAnU0VUJzoge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgaWYgKHN0YXRlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdhc3luY0VuYWJsZWQnIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnYXN5bmNVbnNwZWNpZmllZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdlbmFibGVkJyB9O1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICdkaXNhYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IC4uLnN0YXRlLCB2YWx1ZTogJ3Vuc3BlY2lmaWVkJyB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0FTWU5DX0RPTkUnOiB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBhY3Rpb247XG4gICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZW5hYmxlZCcgfTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgICB9XG4gICAgICByZXR1cm4geyAuLi5zdGF0ZSwgdmFsdWU6ICd1bnNwZWNpZmllZCcgfTtcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlO1xuICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBEaXNwYXRjaCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHtcbiAgdHlwZSBGZWF0dXJlRGVzY3JpcHRpb24sXG4gIHR5cGUgRmVhdHVyZVN0YXRlLFxuICB0eXBlIEZlYXR1cmVWYWx1ZSxcbiAgdmFsdWVGb3JTdGF0ZSxcbn0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZlYXR1cmVzQ29udGV4dCB7XG4gIC8vIGZlYXR1cmVzIGFyZSBsYXllcmVkOlxuICAvLyAgLSBkZWZhdWx0czogaWYgbm90aGluZyBlbHNlIG1hdGNoZXMsIHByb3ZpZGVkIGEgdmFsdWUgZm9yIGZlYXR1cmVcbiAgLy8gIC0gYnJvd3NlcjogYnJvd3Nlci1sb2NhbCB2YWx1ZXMgZm9yIGZlYXR1cmVzIChrZXB0IGluIGxvY2FsIHN0b3JhZ2UsIGV0YylcbiAgLy8gIC0gdXNlcjogdmFsdWVzIGZyb20gdGhlIHVzZXIncyBwcm9maWxlLCBpZiBhbnlcbiAgLy8gIC0gb3JnOiB2YWx1ZSBmcm9tIHRoZSBvcmcncyBwcm9maWxlLCBpZiBhbnlcbiAgZmVhdHVyZXM6IHsgW3g6IHN0cmluZ106IEZlYXR1cmVTdGF0ZSB9O1xufVxuXG5leHBvcnQgdHlwZSBGZWF0dXJlc0FjdGlvbiA9XG4gIHwgeyB0eXBlOiAnREVfSU5JVCcgfVxuICB8IHsgdHlwZTogJ0RJU0FCTEUnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ0VOQUJMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnSU5JVCc7IGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSB9XG4gIHwgeyB0eXBlOiAnU0VUX0FMTCc7IGZlYXR1cmVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9IH1cbiAgfCB7IHR5cGU6ICdTRVQnOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfVxuICB8IHsgdHlwZTogJ1RPR0dMRSc7IG5hbWU6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiAnVU5TRVQnOyBuYW1lOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogJ0FTWU5DX0RPTkUnOyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBGZWF0dXJlVmFsdWUgfTtcblxuZXhwb3J0IGludGVyZmFjZSBGZWF0dXJlc1N0YXRlIHtcbiAgdmFsdWU6ICdpZGxlJyB8ICdyZWFkeSc7XG4gIGNvbnRleHQ6IEZlYXR1cmVzQ29udGV4dDtcbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZXNEaXNwYXRjaCA9IERpc3BhdGNoPEZlYXR1cmVzQWN0aW9uPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlT2ZGZWF0dXJlKFxuICBmZWF0dXJlc1N0YXRlOiBGZWF0dXJlc1N0YXRlLFxuICBmZWF0dXJlOiBzdHJpbmcsXG4pOiBbRmVhdHVyZVZhbHVlLCBib29sZWFuXSB7XG4gIGlmIChmZWF0dXJlc1N0YXRlLmNvbnRleHQuZmVhdHVyZXNbZmVhdHVyZV0gPT0gbnVsbCkge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCBmYWxzZV07XG4gIH1cbiAgY29uc3QgZmVhdHVyZVN0YXRlID0gZmVhdHVyZXNTdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2ZlYXR1cmVdO1xuICBpZiAoZmVhdHVyZVN0YXRlICE9IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWVGb3JTdGF0ZShmZWF0dXJlU3RhdGUpO1xuICB9XG4gIHJldHVybiBbdW5kZWZpbmVkLCBmYWxzZV07XG59XG5cbmV4cG9ydCBjb25zdCBpbml0aWFsRmVhdHVyZXNTdGF0ZTogRmVhdHVyZXNTdGF0ZSA9IHtcbiAgdmFsdWU6ICdpZGxlJyxcbiAgY29udGV4dDoge1xuICAgIGZlYXR1cmVzOiB7fSxcbiAgfSxcbn07XG5cbi8qKlxuICogUmVkdWNlciBmb3IgbWFuYWdpbmcgYSBjb2xsZWN0aW9uIG9mIGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlc1JlZHVjZXIoXG4gIHN0YXRlOiBGZWF0dXJlc1N0YXRlLFxuICBhY3Rpb246IEZlYXR1cmVzQWN0aW9uLFxuKTogRmVhdHVyZXNTdGF0ZSB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlICdJTklUJzoge1xuICAgICAgaWYgKGFjdGlvbi5mZWF0dXJlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlczogeyBbeDogc3RyaW5nXTogRmVhdHVyZVN0YXRlIH0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgZmVhdHVyZSBvZiBhY3Rpb24uZmVhdHVyZXMpIHtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlYWNoIGZlYXR1cmVcbiAgICAgICAgY29uc3QgZmVhdHVyZVN0YXRlID0ge1xuICAgICAgICAgIHZhbHVlOlxuICAgICAgICAgICAgZmVhdHVyZS5kZWZhdWx0VmFsdWUgPT09IHRydWVcbiAgICAgICAgICAgICAgPyAoJ2VuYWJsZWQnIGFzIGNvbnN0KVxuICAgICAgICAgICAgICA6IGZlYXR1cmUuZGVmYXVsdFZhbHVlID09PSBmYWxzZVxuICAgICAgICAgICAgICAgID8gKCdkaXNhYmxlZCcgYXMgY29uc3QpXG4gICAgICAgICAgICAgICAgOiAoJ3Vuc3BlY2lmaWVkJyBhcyBjb25zdCksXG4gICAgICAgICAgZmVhdHVyZURlc2M6IGZlYXR1cmUsXG4gICAgICAgIH07XG4gICAgICAgIGZlYXR1cmVzW2ZlYXR1cmUubmFtZV0gPSBmZWF0dXJlU3RhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiAncmVhZHknLFxuICAgICAgICBjb250ZXh0OiB7IGZlYXR1cmVzIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ0RFX0lOSVQnOiB7XG4gICAgICByZXR1cm4gaW5pdGlhbEZlYXR1cmVzU3RhdGU7XG4gICAgfVxuXG4gICAgY2FzZSAnU0VUX0FMTCc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmVzID0geyAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzIH07XG4gICAgICBPYmplY3Qua2V5cyhmZWF0dXJlcykuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFjdGlvbi5mZWF0dXJlc1tuYW1lXSA/PyB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGZWF0dXJlID0gZmVhdHVyZXNbbmFtZV07XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0gPSB7IC4uLmN1cnJlbnRGZWF0dXJlLCB2YWx1ZTogJ2FzeW5jRW5hYmxlZCcgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgZmVhdHVyZXNbbmFtZV0gPSB7IC4uLmN1cnJlbnRGZWF0dXJlLCB2YWx1ZTogJ2FzeW5jRGlzYWJsZWQnIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdhc3luY1Vuc3BlY2lmaWVkJyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICdlbmFibGVkJyB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBmZWF0dXJlc1tuYW1lXSA9IHsgLi4uY3VycmVudEZlYXR1cmUsIHZhbHVlOiAnZGlzYWJsZWQnIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZlYXR1cmVzW25hbWVdID0geyAuLi5jdXJyZW50RmVhdHVyZSwgdmFsdWU6ICd1bnNwZWNpZmllZCcgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDogeyBmZWF0dXJlcyB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdTRVQnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gYWN0aW9uO1xuICAgICAgbGV0IG5ld1ZhbHVlOiBGZWF0dXJlU3RhdGVbJ3ZhbHVlJ107XG5cbiAgICAgIGlmIChmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbCkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdhc3luY0VuYWJsZWQnO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIG5ld1ZhbHVlID0gJ2FzeW5jRGlzYWJsZWQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld1ZhbHVlID0gJ2FzeW5jVW5zcGVjaWZpZWQnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdlbmFibGVkJztcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9ICdkaXNhYmxlZCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3VmFsdWUgPSAndW5zcGVjaWZpZWQnO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1RPR0dMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsXG4gICAgICAgICAgPyAnYXN5bmNFbmFibGVkJ1xuICAgICAgICAgIDogJ2VuYWJsZWQnO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGZlYXR1cmVzOiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5jb250ZXh0LmZlYXR1cmVzLFxuICAgICAgICAgICAgW2FjdGlvbi5uYW1lXTogeyAuLi5mZWF0dXJlLCB2YWx1ZTogbmV3VmFsdWUgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjYXNlICdFTkFCTEUnOiB7XG4gICAgICBpZiAoc3RhdGUudmFsdWUgIT09ICdyZWFkeScpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWF0dXJlID0gc3RhdGUuY29udGV4dC5mZWF0dXJlc1thY3Rpb24ubmFtZV07XG4gICAgICBpZiAoZmVhdHVyZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3VmFsdWUgPVxuICAgICAgICBmZWF0dXJlLmZlYXR1cmVEZXNjPy5vbkNoYW5nZURlZmF1bHQgIT0gbnVsbFxuICAgICAgICAgID8gJ2FzeW5jRW5hYmxlZCdcbiAgICAgICAgICA6ICdlbmFibGVkJztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyxcbiAgICAgICAgICAgIFthY3Rpb24ubmFtZV06IHsgLi4uZmVhdHVyZSwgdmFsdWU6IG5ld1ZhbHVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnRElTQUJMRSc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIGZlYXR1cmUuZmVhdHVyZURlc2M/Lm9uQ2hhbmdlRGVmYXVsdCAhPSBudWxsXG4gICAgICAgICAgPyAnYXN5bmNEaXNhYmxlZCdcbiAgICAgICAgICA6ICdkaXNhYmxlZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNhc2UgJ1VOU0VUJzoge1xuICAgICAgaWYgKHN0YXRlLnZhbHVlICE9PSAncmVhZHknKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVhdHVyZSA9IHN0YXRlLmNvbnRleHQuZmVhdHVyZXNbYWN0aW9uLm5hbWVdO1xuICAgICAgaWYgKGZlYXR1cmUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgZmVhdHVyZS5mZWF0dXJlRGVzYz8ub25DaGFuZ2VEZWZhdWx0ICE9IG51bGxcbiAgICAgICAgICA/ICdhc3luY1Vuc3BlY2lmaWVkJ1xuICAgICAgICAgIDogJ3Vuc3BlY2lmaWVkJztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBmZWF0dXJlczoge1xuICAgICAgICAgICAgLi4uc3RhdGUuY29udGV4dC5mZWF0dXJlcyxcbiAgICAgICAgICAgIFthY3Rpb24ubmFtZV06IHsgLi4uZmVhdHVyZSwgdmFsdWU6IG5ld1ZhbHVlIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY2FzZSAnQVNZTkNfRE9ORSc6IHtcbiAgICAgIGlmIChzdGF0ZS52YWx1ZSAhPT0gJ3JlYWR5Jykge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZlYXR1cmUgPSBzdGF0ZS5jb250ZXh0LmZlYXR1cmVzW2FjdGlvbi5uYW1lXTtcbiAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBhY3Rpb247XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9XG4gICAgICAgIHZhbHVlID09PSB0cnVlXG4gICAgICAgICAgPyAnZW5hYmxlZCdcbiAgICAgICAgICA6IHZhbHVlID09PSBmYWxzZVxuICAgICAgICAgICAgPyAnZGlzYWJsZWQnXG4gICAgICAgICAgICA6ICd1bnNwZWNpZmllZCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgZmVhdHVyZXM6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmNvbnRleHQuZmVhdHVyZXMsXG4gICAgICAgICAgICBbYWN0aW9uLm5hbWVdOiB7IC4uLmZlYXR1cmUsIHZhbHVlOiBuZXdWYWx1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiwgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlc0Rpc3BhdGNoIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbmltcG9ydCB7IEdsb2JhbEVuYWJsZSB9IGZyb20gJy4vR2xvYmFsRW5hYmxlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdXNlQ29uc29sZU92ZXJyaWRlKFxuICBjb25zb2xlT3ZlcnJpZGU6IGJvb2xlYW4sXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2gsXG4pOiB2b2lkIHtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNvbnNvbGVPdmVycmlkZSkge1xuICAgICAgLy8gQ2xlYW4gdXAgd2luZG93LmZlYXR1cmUgaW1tZWRpYXRlbHkgaWYgY29uc29sZU92ZXJyaWRlIGlzIGRpc2FibGVkXG4gICAgICBpZiAod2luZG93LmZlYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICB3aW5kb3cuZmVhdHVyZSA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICh3aW5kb3cuZmVhdHVyZSAhPSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmZlYXR1cmUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5mZWF0dXJlID0gbmV3IEdsb2JhbEVuYWJsZShkaXNwYXRjaCwgdGVzdEZlYXR1cmUsIGZlYXR1cmVzKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlICE9IG51bGwpIHtcbiAgICAgICAgd2luZG93LmZlYXR1cmUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgfSwgW2ZlYXR1cmVzLCBkaXNwYXRjaCwgY29uc29sZU92ZXJyaWRlLCB0ZXN0RmVhdHVyZV0pO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRmVhdHVyZURlc2NyaXB0aW9uLCBGZWF0dXJlVmFsdWUgfSBmcm9tICcuL0ZlYXR1cmVTdGF0ZSc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVzRGlzcGF0Y2ggfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsRW5hYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmZWF0dXJlRGVzYzogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW107XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2g7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGVzdEZlYXR1cmU6ICh2YWx1ZTogc3RyaW5nKSA9PiBGZWF0dXJlVmFsdWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZGlzcGF0Y2g6IEZlYXR1cmVzRGlzcGF0Y2gsXG4gICAgdGVzdEZlYXR1cmU6IChfOiBzdHJpbmcpID0+IEZlYXR1cmVWYWx1ZSxcbiAgICBmZWF0dXJlRGVzYzogcmVhZG9ubHkgRmVhdHVyZURlc2NyaXB0aW9uW10sXG4gICkge1xuICAgIHRoaXMuZmVhdHVyZURlc2MgPSBmZWF0dXJlRGVzYztcbiAgICB0aGlzLmRpc3BhdGNoID0gZGlzcGF0Y2g7XG4gICAgdGhpcy50ZXN0RmVhdHVyZSA9IHRlc3RGZWF0dXJlO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZShmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1RPR0dMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKGZlYXR1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnRU5BQkxFJywgbmFtZTogZmVhdHVyZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bnNldChmZWF0dXJlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZSB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKGZlYXR1cmU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2goeyB0eXBlOiAnRElTQUJMRScsIG5hbWU6IGZlYXR1cmUgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWxsKGZlYXR1cmVzOiB7IFtrZXk6IHN0cmluZ106IEZlYXR1cmVWYWx1ZSB9KTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaCh7IHR5cGU6ICdTRVRfQUxMJywgZmVhdHVyZXMgfSk7XG4gIH1cblxuICBwdWJsaWMgbGlzdEZlYXR1cmVzKCk6IHJlYWRvbmx5IFtzdHJpbmcsIEZlYXR1cmVWYWx1ZV1bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmVhdHVyZURlc2MubWFwKChmKSA9PiBbZi5uYW1lLCB0aGlzLnRlc3RGZWF0dXJlKGYubmFtZSldKTtcbiAgfVxufVxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBmZWF0dXJlPzogR2xvYmFsRW5hYmxlO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRGVzY3JpcHRpb24sIEZlYXR1cmVWYWx1ZSB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IHR5cGUgRmVhdHVyZXNTdGF0ZSwgdmFsdWVPZkZlYXR1cmUgfSBmcm9tICcuL0ZlYXR1cmVzU3RhdGUnO1xuXG5leHBvcnQgY29uc3QgS0VZID0gJ3JlYWN0LWVuYWJsZTpmZWF0dXJlLXZhbHVlcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVzZVBlcnNpc3QoXG4gIHN0b3JhZ2U6IFN0b3JhZ2UgfCB1bmRlZmluZWQsXG4gIGZlYXR1cmVzOiByZWFkb25seSBGZWF0dXJlRGVzY3JpcHRpb25bXSxcbiAgb3ZlcnJpZGVTdGF0ZTogRmVhdHVyZXNTdGF0ZSxcbik6IHZvaWQge1xuICBjb25zdCBvdmVycmlkZXMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBuZXdPdmVycmlkZXM6IHsgW2tleTogc3RyaW5nXTogRmVhdHVyZVZhbHVlIH0gPSB7fTtcbiAgICBpZiAob3ZlcnJpZGVTdGF0ZS52YWx1ZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgZm9yIChjb25zdCBmZWF0dXJlIG9mIGZlYXR1cmVzKSB7XG4gICAgICAgIGNvbnN0IFt2YWx1ZV0gPSB2YWx1ZU9mRmVhdHVyZShvdmVycmlkZVN0YXRlLCBmZWF0dXJlLm5hbWUpO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld092ZXJyaWRlc1tmZWF0dXJlLm5hbWVdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld092ZXJyaWRlcztcbiAgfSwgW2ZlYXR1cmVzLCBvdmVycmlkZVN0YXRlXSk7XG5cbiAgY29uc3Qgc3RyU3RhdGUgPVxuICAgIE9iamVjdC5rZXlzKG92ZXJyaWRlcykubGVuZ3RoID09PSAwIHx8IHN0b3JhZ2UgPT0gbnVsbFxuICAgICAgPyAne30nXG4gICAgICA6IEpTT04uc3RyaW5naWZ5KHsgb3ZlcnJpZGVzIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzdG9yYWdlICE9IG51bGwgJiYgb3ZlcnJpZGVTdGF0ZS52YWx1ZSA9PT0gJ3JlYWR5Jykge1xuICAgICAgICBzdG9yYWdlLnNldEl0ZW0oS0VZLCBzdHJTdGF0ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gQ2FuJ3Qgc2V0IGZvciBzb21lIHJlYXNvblxuICAgIH1cbiAgfSwgW292ZXJyaWRlU3RhdGUsIHN0b3JhZ2UsIHN0clN0YXRlXSk7XG59XG4iLCAiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgRmVhdHVyZXNTdGF0ZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5pbXBvcnQgdGVzdEZlYXR1cmUgZnJvbSAnLi90ZXN0RmVhdHVyZSc7XG5cbi8vLyBBIGNhbGxiYWNrIHRoYXQgY2FuIGJlIGNhbGxlZCB0byB0ZXN0IGlmIGEgZmVhdHVyZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB1c2VUZXN0Q2FsbGJhY2soXG4gIGRlZmF1bHRzU3RhdGU6IEZlYXR1cmVzU3RhdGUsXG4gIG92ZXJyaWRlc1N0YXRlOiBGZWF0dXJlc1N0YXRlLFxuKTogKGZlYXR1cmU6IHN0cmluZykgPT4gYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB1c2VDYWxsYmFjayhcbiAgICAoZjogc3RyaW5nKSA9PiB0ZXN0RmVhdHVyZShmLCBbZGVmYXVsdHNTdGF0ZSwgb3ZlcnJpZGVzU3RhdGVdKSxcbiAgICBbZGVmYXVsdHNTdGF0ZSwgb3ZlcnJpZGVzU3RhdGVdLFxuICApO1xufVxuIiwgImltcG9ydCB0eXBlIHsgRmVhdHVyZVZhbHVlIH0gZnJvbSAnLi9GZWF0dXJlU3RhdGUnO1xuaW1wb3J0IHsgdHlwZSBGZWF0dXJlc1N0YXRlLCB2YWx1ZU9mRmVhdHVyZSB9IGZyb20gJy4vRmVhdHVyZXNTdGF0ZSc7XG5cbi8qKiBEZXRlcm1pbmUgaWYgdGhlIGZlYXR1cmUgaXMgZW5hYmxlZCBpbiBvbmUgb2YgdGhlIHN0YXRlIG1hY2hpbmVzLCBpbiBvcmRlclxuICpcbiAqIEBwYXJhbSBzdGF0ZSBUaGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFjaGluZVxuICogQHBhcmFtIGZlYXR1cmUgVGhlIGZlYXR1cmUgdG8gY2hlY2tcbiAqL1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB0ZXN0RmVhdHVyZShcbiAgZmVhdHVyZTogc3RyaW5nLFxuICBzdGF0ZXM6IEZlYXR1cmVzU3RhdGVbXSxcbik6IEZlYXR1cmVWYWx1ZSB7XG4gIGNvbnN0IHZhbHVlcyA9IHN0YXRlcy5tYXAoKHN0YXRlKSA9PiB2YWx1ZU9mRmVhdHVyZShzdGF0ZSwgZmVhdHVyZSkpO1xuXG4gIC8vIGxvb2sgZm9yIGJlc3QgZm9yY2VkIG9wdGlvbiwgaW4gb3JkZXJcbiAgZm9yIChjb25zdCBbZmVhdHVyZVZhbHVlLCBmZWF0dXJlRm9yY2VkXSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoZmVhdHVyZVZhbHVlICE9IG51bGwgJiYgZmVhdHVyZUZvcmNlZCkge1xuICAgICAgcmV0dXJuIGZlYXR1cmVWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBsb29rIGZvciBiZXN0IG5vbi1mb3JjZWQgb3B0aW9uLCBpbiBvcmRlclxuICBmb3IgKGNvbnN0IFtmZWF0dXJlVmFsdWVdIG9mIHZhbHVlcykge1xuICAgIGlmIChmZWF0dXJlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZlYXR1cmVWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB1bnNldCBpZiBub3RoaW5nIGhpdFxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwgImltcG9ydCB7IFJhZGlvR3JvdXAgfSBmcm9tICdAaGVhZGxlc3N1aS9yZWFjdCc7XG5pbXBvcnQgUmVhY3QsIHtcbiAgdHlwZSBSZWFjdE5vZGUsXG4gIHVzZUNhbGxiYWNrLFxuICB1c2VDb250ZXh0LFxuICB1c2VTdGF0ZSxcbn0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5cbmltcG9ydCB7IEZlYXR1cmVDb250ZXh0IH0gZnJvbSAnLi9GZWF0dXJlQ29udGV4dCc7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmVEZXNjcmlwdGlvbiB9IGZyb20gJy4vRmVhdHVyZVN0YXRlJztcbmltcG9ydCB7IHZhbHVlT2ZGZWF0dXJlIH0gZnJvbSAnLi9GZWF0dXJlc1N0YXRlJztcbi8vIEB0cy1leHBlY3QtZXJyb3IgYnVuZGxlciB3aWxsIHRha2UgY2FyZSBvZiB0aGlzXG5pbXBvcnQgc3R5bGVzIGZyb20gJy4vdGFpbHdpbmQuY3NzJztcblxuZnVuY3Rpb24gY2xhc3NOYW1lcyguLi5jbGFzc2VzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiBjbGFzc2VzLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyk7XG59XG5cbmZ1bmN0aW9uIFRvZ2dsZUZlYXR1cmUoe1xuICBmZWF0dXJlLFxufToge1xuICBmZWF0dXJlOiBGZWF0dXJlRGVzY3JpcHRpb247XG59KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRmVhdHVyZUNvbnRleHQpO1xuICBjb25zdCBoYW5kbGVDaGFuZ2VTZWxlY3Rpb24gPSB1c2VDYWxsYmFjayhcbiAgICAodmFsdWU6ICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnKSA9PiB7XG4gICAgICBpZiAoY29udGV4dD8ub3ZlcnJpZGVzU2VuZCAhPSBudWxsKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICBjYXNlICd0cnVlJzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ0VOQUJMRScsIG5hbWU6IGZlYXR1cmUubmFtZSB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdmYWxzZSc6IHtcbiAgICAgICAgICAgIGNvbnRleHQub3ZlcnJpZGVzU2VuZCh7IHR5cGU6ICdESVNBQkxFJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Vuc2V0Jzoge1xuICAgICAgICAgICAgY29udGV4dC5vdmVycmlkZXNTZW5kKHsgdHlwZTogJ1VOU0VUJywgbmFtZTogZmVhdHVyZS5uYW1lIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmVhdHVyZS5uYW1lLCBjb250ZXh0XSxcbiAgKTtcblxuICBpZiAoY29udGV4dCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IG92ZXJyaWRlc1N0YXRlLCB0ZXN0OiB0ZXN0RmVhdHVyZSwgZGVmYXVsdHNTdGF0ZSB9ID0gY29udGV4dDtcblxuICBjb25zdCB2YWx1ZUluRGVmYXVsdHMgPSAoXG4gICAgdmFsdWVPZkZlYXR1cmUoZGVmYXVsdHNTdGF0ZSwgZmVhdHVyZS5uYW1lKVswXSA/PyAndW5zZXQnXG4gICkudG9TdHJpbmcoKSBhcyAnZmFsc2UnIHwgJ3RydWUnIHwgJ3Vuc2V0JztcblxuICBjb25zdCB2YWx1ZUluT3ZlcnJpZGVzID0gKFxuICAgIHZhbHVlT2ZGZWF0dXJlKG92ZXJyaWRlc1N0YXRlLCBmZWF0dXJlLm5hbWUpWzBdID8/ICd1bnNldCdcbiAgKS50b1N0cmluZygpIGFzICdmYWxzZScgfCAndHJ1ZScgfCAndW5zZXQnO1xuXG4gIGNvbnN0IGFjdHVhbENoZWNrZWQgPSB0ZXN0RmVhdHVyZShmZWF0dXJlLm5hbWUpO1xuXG4gIHJldHVybiAoXG4gICAgPFJhZGlvR3JvdXBcbiAgICAgIGRpc2FibGVkPXtmZWF0dXJlLm5vT3ZlcnJpZGV9XG4gICAgICBvbkNoYW5nZT17aGFuZGxlQ2hhbmdlU2VsZWN0aW9ufVxuICAgICAgdmFsdWU9e3ZhbHVlSW5PdmVycmlkZXN9XG4gICAgPlxuICAgICAgPFJhZGlvR3JvdXAuTGFiZWw+XG4gICAgICAgIDxoNiBjbGFzc05hbWU9XCJ0ZXh0LWdyYXktOTAwIGFsaWduLWNlbnRlciBmbGV4IGZsZXgtcm93IGZsZXgtbm93cmFwIGl0ZW1zLWNlbnRlciBnYXAtMiBsZzpnYXAtNCBoLTdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgRmVhdHVyZTogPGNvZGU+e2ZlYXR1cmUubmFtZX08L2NvZGU+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtmZWF0dXJlLm5vT3ZlcnJpZGUgPT09IHRydWUgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1vcmFuZ2UtNTAwIHRleHQtb3JhbmdlLTUwMCBmbGV4IGZsZXgtbm93cmFwIHRleHQteHMgZmxleC1yb3cgZ2FwLTEgcm91bmRlZC1zbSBib3JkZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTQgdy00IG1pbi13LTRcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICBkPVwiTTUgOVY3YTUgNSAwIDAxMTAgMHYyYTIgMiAwIDAxMiAydjVhMiAyIDAgMDEtMiAySDVhMiAyIDAgMDEtMi0ydi01YTIgMiAwIDAxMi0yem04LTJ2Mkg3VjdhMyAzIDAgMDE2IDB6XCJcbiAgICAgICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIDxkaXY+Tm8gT3ZlcnJpZGVzPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICB7YWN0dWFsQ2hlY2tlZCA9PT0gdHJ1ZSA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIHRleHQtZ3JlZW4tNTAwIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXItZ3JlZW4tNTAwIHB4LTIgcHktMVwiPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTQgdy00IG1pbi13LTRcIlxuICAgICAgICAgICAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIlxuICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgICAgICBkPVwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuNzA3LTkuMjkzYTEgMSAwIDAwLTEuNDE0LTEuNDE0TDkgMTAuNTg2IDcuNzA3IDkuMjkzYTEgMSAwIDAwLTEuNDE0IDEuNDE0bDIgMmExIDEgMCAwMDEuNDE0IDBsNC00elwiXG4gICAgICAgICAgICAgICAgICBmaWxsUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICA8ZGl2PnthY3R1YWxDaGVja2VkID8gJ0VuYWJsZWQnIDogJ0Rpc2FibGVkJ308L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICA8L2g2PlxuICAgICAgICB7ZmVhdHVyZS5kZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgdGV4dC1ncmF5LTUwMCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICB7ZmVhdHVyZS5kZXNjcmlwdGlvbn1cbiAgICAgICAgICA8L3A+XG4gICAgICAgICl9XG4gICAgICA8L1JhZGlvR3JvdXAuTGFiZWw+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgZ3JpZCBncmlkLWNvbHMtMSBnYXAteS02IHNtOmdyaWQtY29scy0zIHNtOmdhcC14LTRcIj5cbiAgICAgICAge1tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIHRpdGxlOiBgRGlzYWJsZSAke2ZlYXR1cmUubmFtZX1gLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPdmVycmlkZSB0aGUgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ3Vuc2V0JyxcbiAgICAgICAgICAgIHRpdGxlOiAnRGVmYXVsdCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0luaGVyaXQgZW5hYmxlZCBzdGF0ZSBmcm9tIGRlZmF1bHRzJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoZmVhdHVyZS5ub092ZXJyaWRlID8/IGZhbHNlKSB8fCBmZWF0dXJlLmZvcmNlLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOlxuICAgICAgICAgICAgICB2YWx1ZUluRGVmYXVsdHMgPT09ICd0cnVlJyA/IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtZ3JlZW4tNTAwIGJvcmRlci1ncmVlbi01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkVuYWJsZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXJlZC01MDAgYm9yZGVyLXJlZC01MDAgZmxleCBmbGV4LW5vd3JhcCB0ZXh0LXhzIGZsZXgtcm93IGdhcC0xIHJvdW5kZWQtc20gYm9yZGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweC0yIHB5LTFcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkRpc2FibGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0cnVlJyxcbiAgICAgICAgICAgIHRpdGxlOiBgRW5hYmxlICR7ZmVhdHVyZS5uYW1lfWAsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ092ZXJyaWRlIHRoZSBmZWF0dXJlIHRvIGJlIGVuYWJsZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0ubWFwKChvcHRpb24pID0+IChcbiAgICAgICAgICA8UmFkaW9Hcm91cC5PcHRpb25cbiAgICAgICAgICAgIGNsYXNzTmFtZT17KHsgY2hlY2tlZCwgYWN0aXZlLCBkaXNhYmxlZCB9KSA9PlxuICAgICAgICAgICAgICBjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgIGNoZWNrZWQgPyAnYm9yZGVyLXRyYW5zcGFyZW50JyA6ICdib3JkZXItZ3JheS0zMDAnLFxuICAgICAgICAgICAgICAgICFkaXNhYmxlZCAmJiBhY3RpdmVcbiAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci1ibHVlLTUwMCByaW5nLTIgcmluZy1ibHVlLTUwMCdcbiAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgID8gJ2JvcmRlci10cmFuc3BhcmVudCByaW5nLWdyYXktNTAwIGN1cnNvci1ub3QtYWxsb3dlZCdcbiAgICAgICAgICAgICAgICAgIDogJ2N1cnNvci1wb2ludGVyJyxcbiAgICAgICAgICAgICAgICAncmVsYXRpdmUgYmctd2hpdGUgYm9yZGVyIHJvdW5kZWQtbGcgc2hhZG93LXNtIHAtMyBmbGV4IGZvY3VzOm91dGxpbmUtbm9uZScsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc2FibGVkPXtvcHRpb24uZGlzYWJsZWR9XG4gICAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgICAgIHZhbHVlPXtvcHRpb24uaWR9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgeyh7IGNoZWNrZWQsIGFjdGl2ZSwgZGlzYWJsZWQgfSkgPT4gKFxuICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBncm93XCI+XG4gICAgICAgICAgICAgICAgICA8UmFkaW9Hcm91cC5MYWJlbFxuICAgICAgICAgICAgICAgICAgICBhcz1cInNwYW5cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtbm93cmFwIGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlciBzcGFjZS1iZXR3ZWVuXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwIGdyb3cgc2hyaW5rXCI+XG4gICAgICAgICAgICAgICAgICAgICAge29wdGlvbi50aXRsZX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICB7b3B0aW9uLmRlZmF1bHRWYWx1ZSAhPSBudWxsID8gb3B0aW9uLmRlZmF1bHRWYWx1ZSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICFjaGVja2VkID8gJ2ludmlzaWJsZScgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdoLTUgdy01IHRleHQtYmx1ZS01MDAgbWluLXctNCcsXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwUnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xMCAxOGE4IDggMCAxMDAtMTYgOCA4IDAgMDAwIDE2em0zLjcwNy05LjI5M2ExIDEgMCAwMC0xLjQxNC0xLjQxNEw5IDEwLjU4NiA3LjcwNyA5LjI5M2ExIDEgMCAwMC0xLjQxNCAxLjQxNGwyIDJhMSAxIDAgMDAxLjQxNCAwbDQtNHpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxSYWRpb0dyb3VwLkRlc2NyaXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIGFzPVwic3BhblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTEgZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge29wdGlvbi5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgIDwvUmFkaW9Hcm91cC5EZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKFxuICAgICAgICAgICAgICAgICAgICAhZGlzYWJsZWQgJiYgYWN0aXZlID8gJ2JvcmRlcicgOiAnYm9yZGVyLTInLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkXG4gICAgICAgICAgICAgICAgICAgICAgPyBkaXNhYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnYm9yZGVyLWdyYXktNTAwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYm9yZGVyLWJsdWUtNTAwJ1xuICAgICAgICAgICAgICAgICAgICAgIDogJ2JvcmRlci10cmFuc3BhcmVudCcsXG4gICAgICAgICAgICAgICAgICAgICdhYnNvbHV0ZSAtaW5zZXQtcHggcm91bmRlZC1sZyBwb2ludGVyLWV2ZW50cy1ub25lJyxcbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvUmFkaW9Hcm91cC5PcHRpb24+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9SYWRpb0dyb3VwPlxuICApO1xufVxuXG5mdW5jdGlvbiBTaGFkb3dDb250ZW50KHtcbiAgcm9vdCxcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIHJvb3Q6IEVsZW1lbnQ7XG59KSB7XG4gIHJldHVybiBSZWFjdERPTS5jcmVhdGVQb3J0YWwoY2hpbGRyZW4sIHJvb3QpO1xufVxuXG4vLy8gUGVybWl0IHVzZXJzIHRvIG92ZXJyaWRlIGZlYXR1cmUgZmxhZ3MgdmlhIGEgR1VJLlxuLy8vIFJlbmRlcnMgYSBzbWFsbCBmbG9hdGluZyBidXR0b24gaW4gbG93ZXIgbGVmdCBvciByaWdodCwgcHJlc3NpbmcgaXQgYnJpbmdzIHVwXG4vLy8gYSBsaXN0IG9mIGZlYXR1cmVzIHRvIHRvZ2dsZSBhbmQgdGhlaXIgY3VycmVudCBvdmVycmlkZSBzdGF0ZS4geW91IGNhbiBvdmVycmlkZSBvbiBvciBvdmVycmlkZSBvZmYsXG4vLy8gb3IgdW5zZXQgdGhlIG92ZXJyaWRlIGFuZCBnbyBiYWNrIHRvIGRlZmF1bHQgdmFsdWUuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbmV4cG9ydCBmdW5jdGlvbiBUb2dnbGVGZWF0dXJlcyh7XG4gIGRlZmF1bHRPcGVuID0gZmFsc2UsXG4gIGhpZGRlbiA9IGZhbHNlLFxufToge1xuICBkZWZhdWx0T3Blbj86IGJvb2xlYW47XG4gIGhpZGRlbj86IGJvb2xlYW47XG59KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW3Jvb3QsIHNldENvcmVSb290XSA9IHVzZVN0YXRlPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3Qgc2V0Um9vdCA9IChob3N0OiBIVE1MRGl2RWxlbWVudCB8IG51bGwpID0+IHtcbiAgICBpZiAoaG9zdCA9PSBudWxsIHx8IHJvb3QgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaGFkb3dSb290ID0gaG9zdD8uYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pO1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBjb25zdCByZW5kZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlcztcbiAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBzaGFkb3dSb290LmFwcGVuZENoaWxkKHJlbmRlckRpdik7XG4gICAgc2V0Q29yZVJvb3QocmVuZGVyRGl2KTtcbiAgfTtcblxuICBpZiAoaGlkZGVuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17c2V0Um9vdH1cbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIHpJbmRleDogOTk5OTksXG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB3aWR0aDogJzAnLFxuICAgICAgICBoZWlnaHQ6ICcwJyxcbiAgICAgICAgYm90dG9tOiAwLFxuICAgICAgfX1cbiAgICA+XG4gICAgICB7cm9vdCAhPSBudWxsID8gKFxuICAgICAgICA8U2hhZG93Q29udGVudCByb290PXtyb290fT5cbiAgICAgICAgICA8VG9nZ2xlRmVhdHVyZVVud3JhcHBlZCBkZWZhdWx0T3Blbj17ZGVmYXVsdE9wZW59IC8+XG4gICAgICAgIDwvU2hhZG93Q29udGVudD5cbiAgICAgICkgOiBudWxsfVxuICAgIDwvZGl2PlxuICApO1xufVxuXG4vLy8gTGlrZSBUb2dnbGVGZWF0dXJlcywgYnV0IGRvZXMgbm90IGluamVjdCBzdHlsZXMgaW50byBhIHNoYWRvdyBET00gcm9vdCBub2RlLlxuLy8vIHVzZWZ1bCBpZiB5b3UncmUgdXNpbmcgdGFpbHdpbmQuXG5leHBvcnQgZnVuY3Rpb24gVG9nZ2xlRmVhdHVyZVVud3JhcHBlZCh7XG4gIGRlZmF1bHRPcGVuID0gZmFsc2UsXG4gIGhpZGRlbiA9IGZhbHNlLFxufToge1xuICBkZWZhdWx0T3Blbj86IGJvb2xlYW47XG4gIGhpZGRlbj86IGJvb2xlYW47XG59KTogSlNYLkVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZGVmYXVsdE9wZW4pO1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChGZWF0dXJlQ29udGV4dCk7XG5cbiAgaWYgKGNvbnRleHQgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGhpZGRlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gV2Ugd2FudDogUmVhbCB2YWx1ZSBhZnRlciBhbGwgbmVzdGluZ3MsIHZhbHVlIG9mIHRoZSBvdmVycmlkZS4gd2UgdG9nZ2xlIG92ZXJyaWRlXG4gIGNvbnN0IHsgZmVhdHVyZXNEZXNjcmlwdGlvbiB9ID0gY29udGV4dDtcblxuICBpZiAoZmVhdHVyZXNEZXNjcmlwdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgbXgtNCBteS00XCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgdGV4dC1zbSBmb250LW1lZGl1bSBwLTEgaC04IHctOCBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1mdWxsIGJnLWJsdWUtNjAwIHRleHQtd2hpdGUgIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4odHJ1ZSl9XG4gICAgICAgICAgdGl0bGU9XCJUb2dnbGUgZmVhdHVyZXNcIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgY2xhc3NOYW1lPVwidy02IGgtNiBtaW4taC02IG1pbi13LTZcIlxuICAgICAgICAgICAgZmlsbD1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIGNsaXBSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAgIGQ9XCJNMyA2YTMgMyAwIDAxMy0zaDEwYTEgMSAwIDAxLjggMS42TDE0LjI1IDhsMi41NSAzLjRBMSAxIDAgMDExNiAxM0g2YTEgMSAwIDAwLTEgMXYzYTEgMSAwIDExLTIgMFY2elwiXG4gICAgICAgICAgICAgIGZpbGxSdWxlPVwiZXZlbm9kZFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgeyFvcGVuID8gbnVsbCA6IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmaXhlZCB6LTEwIGluc2V0LTAgb3ZlcmZsb3cteS1hdXRvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWVuZCBqdXN0aWZ5LWZsZXgtc3RhcnQgbXgtOCBteS00IG1pbi1oLXNjcmVlbiBwdC00IHB4LTQgcGItMTAgc206YmxvY2sgc206cC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGlubGluZS1ibG9jayBhbGlnbi1ib3R0b20gYmctd2hpdGUgcm91bmRlZC1sZyBweC00IHB0LTUgcGItNCB0ZXh0LWxlZnQgb3ZlcmZsb3ctaGlkZGVuIHNoYWRvdy14bCB0cmFuc2Zvcm0gdHJhbnNpdGlvbi1hbGwgc206bXktOCBzbTphbGlnbi1taWRkbGUgc206cC02IGxnOm1heC13LVs4MCVdIG1heC13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgc206bXQtM1wiPlxuICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzTmFtZT1cImZsZXggZmxleC1yb3cgZ2FwLTQgZmxleC1ub3dyYXAgaXRlbXMtY2VudGVyIHNwYWNlLWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncm93IHRleHQtbGcgbGVhZGluZy02IGZvbnQtbWVkaXVtIHRleHQtZ3JheS05MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICBGZWF0dXJlIEZsYWcgT3ZlcnJpZGVzXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICBGZWF0dXJlcyBjYW4gYmUgZW5hYmxlZCBvciBkaXNhYmxlZCB1bmxlc3MgdGhleSBhcmUgZm9yY2VkXG4gICAgICAgICAgICAgICAgICAgIHVwc3RyZWFtLiBZb3UgY2FuIGFsc28gcmV2ZXJ0IHRvIGRlZmF1bHQuXG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGVnZW5kIGNsYXNzTmFtZT1cInNyLW9ubHlcIj5GZWF0dXJlIEZsYWdzPC9sZWdlbmQ+XG4gICAgICAgICAgICAgICAgICAgICAge2ZlYXR1cmVzRGVzY3JpcHRpb24ubWFwKChmZWF0dXJlKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8VG9nZ2xlRmVhdHVyZSBmZWF0dXJlPXtmZWF0dXJlfSBrZXk9e2ZlYXR1cmUubmFtZX0gLz5cbiAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciBtdC01IHNtOm10LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXNtIGZvbnQtbWVkaXVtIHB0LTAgcGItMCBwci00IHBsLTQgaC04IGxlYWRpbmctNyBhbGlnbi1taWRkbGUgY3Vyc29yLXBvaW50ZXIgcm91bmRlZC1zbSBiZy1ibHVlLTYwMCB0ZXh0LXdoaXRlIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQganVzdGlmeS1jZW50ZXIgdGV4dC1iYXNlIGZvbnQtbWVkaXVtIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWJsdWUtNjAwIHNtOnRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldE9wZW4oZmFsc2UpfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgRG9uZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQTs7O0FDREE7OztBQ0FBO0FBU08sSUFBTSxnQkFBZ0IsY0FBaUMsQ0FBQyxPQUFPLEtBQUs7OztBREhwRSwyQkFDTCxPQUMrQjtBQUMvQixRQUFNLE9BQU8sV0FBVyxhQUFhO0FBR3JDLFFBQU0sWUFBWSxRQUNoQixNQUFPLFNBQVMsT0FBTyxDQUFDLElBQUksTUFBTSxRQUFRLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxHQUNqRSxDQUFDLEtBQUssQ0FD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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 diff --git a/dist/esm/src/index.js.map b/dist/esm/src/index.js.map deleted file mode 100644 index 32db787..0000000 --- a/dist/esm/src/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/Disable.tsx", "../../../src/utils.ts", "../../../src/EnableContext.tsx", "../../../src/useAllDisabled.tsx", "../../../src/useDisabled.tsx", "../../../src/Enable.tsx", "../../../src/useAllEnabled.tsx", "../../../src/useEnabled.tsx", "../../../src/Features.tsx", "../../../src/FeatureContext.tsx", "../../../src/FeatureState.tsx", "../../../src/FeaturesState.tsx", "../../../src/useConsoleOverride.tsx", "../../../src/GlobalEnable.tsx", "../../../src/usePersist.tsx", "../../../src/useTestCallback.tsx", "../../../src/testFeature.tsx", "../../../src/ToggleFeatures.tsx"], - "sourcesContent": ["// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport type { EnableProps } from './Enable';\nimport { useAllDisabled } from './useAllDisabled';\nimport { useDisabled } from './useDisabled';\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children,\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n", "import { useContext, useMemo } from 'react';\n\nimport { EnableContext, type EnableContextType } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(\n input?: string[] | string | null,\n): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(\n () => (input == null ? [] : Array.isArray(input) ? input : [input]),\n [input],\n );\n\n return [test, converted];\n}\n", "import { createContext } from 'react';\n\nimport type { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return (\n withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false))\n );\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n", "// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({\n feature = [],\n allFeatures = [],\n children,\n}: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n", "import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n", "import React, {\n type ReactNode,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { featuresReducer, initialFeaturesState } from './FeaturesState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n const [defaultsState, defaultsDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n\n useEffect(() => {\n /// Load defaults\n defaultsDispatch({ type: 'INIT', features });\n return () => {\n defaultsDispatch({ type: 'DE_INIT' });\n };\n }, [features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesDispatch({\n type: 'INIT',\n features: featuresRef.current\n .filter((x) => x.noOverride !== true)\n .map((x) => ({\n name: x.name,\n description: x.description,\n defaultValue: f?.[x.name] ?? undefined,\n })),\n });\n\n return () => {\n overridesDispatch({ type: 'DE_INIT' });\n };\n }, [storage]);\n\n // Handle async operations for features with onChangeDefault\n useEffect(() => {\n if (defaultsState.value !== 'ready') {\n return;\n }\n\n // Check for features in async states and handle them\n Object.entries(defaultsState.context.features).forEach(\n ([name, feature]) => {\n if (\n feature.value === 'asyncEnabled' ||\n feature.value === 'asyncDisabled' ||\n feature.value === 'asyncUnspecified'\n ) {\n const targetValue =\n feature.value === 'asyncEnabled'\n ? true\n : feature.value === 'asyncDisabled'\n ? false\n : undefined;\n\n const onChangeDefault = feature.featureDesc?.onChangeDefault;\n if (onChangeDefault != null && feature.featureDesc != null) {\n onChangeDefault(feature.featureDesc.name, targetValue)\n .then((result) => {\n defaultsDispatch({ type: 'ASYNC_DONE', name, value: result });\n })\n .catch(() => {\n defaultsDispatch({\n type: 'ASYNC_DONE',\n name,\n value: undefined,\n });\n });\n }\n }\n },\n );\n }, [defaultsState]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(\n !disableConsole,\n featuresRef.current,\n testCallback,\n defaultsDispatch,\n );\n\n const featureValue = useMemo(\n () => ({\n overridesSend: overridesDispatch,\n defaultsSend: defaultsDispatch,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesState, defaultsState, testCallback],\n );\n\n return (\n \n \n {children}\n \n \n );\n}\n", "import { createContext } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch, FeaturesState } from './FeaturesState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n", "import type { Dispatch } from 'react';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureStateValue =\n | 'initial'\n | 'enabled'\n | 'disabled'\n | 'unspecified'\n | 'asyncEnabled'\n | 'asyncDisabled'\n | 'asyncUnspecified';\n\nexport interface FeatureState {\n value: FeatureStateValue;\n featureDesc?: FeatureDescription;\n}\n\nexport type FeatureDispatch = Dispatch;\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(\n featureState: FeatureState,\n): [FeatureValue, boolean] {\n return [\n featureState.value === 'enabled' || featureState.value === 'asyncEnabled'\n ? true\n : featureState.value === 'disabled' ||\n featureState.value === 'asyncDisabled'\n ? false\n : undefined,\n featureState.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (\n name: K,\n newValue: FeatureValue,\n ) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' }\n | { type: 'ASYNC_DONE'; value: FeatureValue };\n\nexport const initialFeatureState: FeatureState = {\n value: 'initial',\n};\n\n/**\n * Reducer for managing individual feature state\n */\nexport function featureReducer(\n state: FeatureState,\n action: FeatureAction,\n): FeatureState {\n switch (action.type) {\n case 'INIT': {\n const { feature } = action;\n const value =\n feature.defaultValue === true\n ? 'enabled'\n : feature.defaultValue === false\n ? 'disabled'\n : 'unspecified';\n return {\n value: value as FeatureStateValue,\n featureDesc: feature,\n };\n }\n\n case 'ENABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'DISABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'disabled' };\n }\n\n case 'TOGGLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'UNSET': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncUnspecified' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'SET': {\n const { value } = action;\n if (state.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n return { ...state, value: 'asyncEnabled' };\n }\n if (value === false) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'asyncUnspecified' };\n }\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'ASYNC_DONE': {\n const { value } = action;\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n default:\n return state;\n }\n}\n", "import type { Dispatch } from 'react';\n\nimport {\n type FeatureDescription,\n type FeatureState,\n type FeatureValue,\n valueForState,\n} from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: FeatureState };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string }\n | { type: 'ASYNC_DONE'; name: string; value: FeatureValue };\n\nexport interface FeaturesState {\n value: 'idle' | 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesDispatch = Dispatch;\n\nexport function valueOfFeature(\n featuresState: FeaturesState,\n feature: string,\n): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature];\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\nexport const initialFeaturesState: FeaturesState = {\n value: 'idle',\n context: {\n features: {},\n },\n};\n\n/**\n * Reducer for managing a collection of features\n */\nexport function featuresReducer(\n state: FeaturesState,\n action: FeaturesAction,\n): FeaturesState {\n switch (action.type) {\n case 'INIT': {\n if (action.features.length === 0) {\n return state;\n }\n\n const features: { [x: string]: FeatureState } = {};\n for (const feature of action.features) {\n // Initialize each feature\n const featureState = {\n value:\n feature.defaultValue === true\n ? ('enabled' as const)\n : feature.defaultValue === false\n ? ('disabled' as const)\n : ('unspecified' as const),\n featureDesc: feature,\n };\n features[feature.name] = featureState;\n }\n\n return {\n value: 'ready',\n context: { features },\n };\n }\n\n case 'DE_INIT': {\n return initialFeaturesState;\n }\n\n case 'SET_ALL': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const features = { ...state.context.features };\n Object.keys(features).forEach((name) => {\n const value = action.features[name] ?? undefined;\n const currentFeature = features[name];\n\n if (currentFeature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'asyncEnabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'asyncDisabled' };\n } else {\n features[name] = { ...currentFeature, value: 'asyncUnspecified' };\n }\n } else {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'enabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'disabled' };\n } else {\n features[name] = { ...currentFeature, value: 'unspecified' };\n }\n }\n });\n\n return {\n ...state,\n context: { features },\n };\n }\n\n case 'SET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n let newValue: FeatureState['value'];\n\n if (feature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n newValue = 'asyncEnabled';\n } else if (value === false) {\n newValue = 'asyncDisabled';\n } else {\n newValue = 'asyncUnspecified';\n }\n } else {\n if (value === true) {\n newValue = 'enabled';\n } else if (value === false) {\n newValue = 'disabled';\n } else {\n newValue = 'unspecified';\n }\n }\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'TOGGLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ENABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'DISABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncDisabled'\n : 'disabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'UNSET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncUnspecified'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ASYNC_DONE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n const newValue =\n value === true\n ? 'enabled'\n : value === false\n ? 'disabled'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n default:\n return state;\n }\n}\n", "import { useEffect } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch,\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n // Clean up window.feature immediately if consoleOverride is disabled\n if (window.feature != null) {\n window.feature = undefined;\n }\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n", "import type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[],\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n", "import { useEffect, useMemo } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState,\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.value === 'ready') {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState =\n Object.keys(overrides).length === 0 || storage == null\n ? '{}'\n : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.value === 'ready') {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n", "import { useCallback } from 'react';\n\nimport type { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState,\n): (feature: string) => boolean | undefined {\n return useCallback(\n (f: string) => testFeature(f, [defaultsState, overridesState]),\n [defaultsState, overridesState],\n );\n}\n", "import type { FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(\n feature: string,\n states: FeaturesState[],\n): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n", "import { RadioGroup } from '@headlessui/react';\nimport React, {\n type ReactNode,\n useCallback,\n useContext,\n useState,\n} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { valueOfFeature } from './FeaturesState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({\n feature,\n}: {\n feature: FeatureDescription;\n}): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context],\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (\n valueOfFeature(defaultsState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const valueInOverrides = (\n valueOfFeature(overridesState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null : (\n

\n {feature.description}\n

\n )}\n
\n
\n {[\n {\n id: 'false',\n title: `Disable ${feature.name}`,\n description: 'Override the feature to be disabled',\n },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n {\n id: 'true',\n title: `Enable ${feature.name}`,\n description: 'Override the feature to be enabled',\n },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active\n ? 'border-blue-500 ring-2 ring-blue-500'\n : '',\n disabled\n ? 'border-transparent ring-gray-500 cursor-not-allowed'\n : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none',\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n \n {option.title}\n \n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n \n );\n}\n\nfunction ShadowContent({\n root,\n children,\n}: {\n children: ReactNode;\n root: Element;\n}) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n \n {root != null ? (\n \n \n \n ) : null}\n \n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
\n Feature Flag Overrides\n
\n

\n

\n Features can be enabled or disabled unless they are forced\n upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n"], - "mappings": "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", - "names": [] -} diff --git a/dist/index.cjs b/dist/index.cjs new file mode 100644 index 0000000..0054cc2 --- /dev/null +++ b/dist/index.cjs @@ -0,0 +1,803 @@ +"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/utils.ts +var _react = require('react'); + +// src/EnableContext.tsx + +var EnableContext = _react.createContext.call(void 0, (_s) => false); + +// src/utils.ts +function useTestAndConvert(input) { + const test = _react.useContext.call(void 0, EnableContext); + const converted = _react.useMemo.call(void 0, + () => input == null ? [] : Array.isArray(input) ? input : [input], + [input] + ); + return [test, converted]; +} + +// src/useAllDisabled.tsx +function useAllDisabled(withoutAll) { + const [test, queryAllWithout] = useTestAndConvert(withoutAll); + return withoutAll.length > 0 && queryAllWithout.every((x) => !(_nullishCoalesce(test(x), () => ( false)))); +} + +// src/useDisabled.tsx +function useDisabled(without) { + const [test, queryAnyWithout] = useTestAndConvert(without); + return queryAnyWithout.some((x) => !(_nullishCoalesce(test(x), () => ( false)))); +} + +// src/Disable.tsx +var _jsxruntime = require('react/jsx-runtime'); +var Disable = ({ + feature = [], + allFeatures = [], + children +}) => { + const isAny = useDisabled(feature); + const isAll = useAllDisabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children }); + } + return null; +}; + +// src/useAllEnabled.tsx +function useAllEnabled(allFeatures) { + const [test, queryAllPresent] = useTestAndConvert(allFeatures); + return queryAllPresent.length > 0 && queryAllPresent.every(test); +} + +// src/useEnabled.tsx +function useEnabled(feature) { + const [test, queryAnyPresent] = useTestAndConvert(feature); + return queryAnyPresent.some(test); +} + +// src/Enable.tsx + +function Enable({ + feature = [], + allFeatures = [], + children +}) { + const isAny = useEnabled(feature); + const isAll = useAllEnabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children }); + } + return null; +} + +// src/Features.tsx + + +// src/FeatureContext.tsx + +var FeatureContext = _react.createContext.call(void 0, null); + +// src/FeatureState.tsx +function valueForState(featureState) { + return [ + featureState.value === "enabled" || featureState.value === "asyncEnabled" ? true : featureState.value === "disabled" || featureState.value === "asyncDisabled" ? false : void 0, + _nullishCoalesce(_optionalChain([featureState, 'access', _ => _.featureDesc, 'optionalAccess', _2 => _2.force]), () => ( false)) + ]; +} + +// src/FeaturesState.tsx +function valueOfFeature(featuresState, feature) { + if (featuresState.context.features[feature] == null) { + return [void 0, false]; + } + const featureState = featuresState.context.features[feature]; + if (featureState != null) { + return valueForState(featureState); + } + return [void 0, false]; +} +var initialFeaturesState = { + value: "idle", + context: { + features: {} + } +}; +function featuresReducer(state, action) { + switch (action.type) { + case "INIT": { + if (!action.features || action.features.length === 0) { + return state; + } + const features = {}; + for (const feature of action.features) { + const featureState = { + value: feature.defaultValue === true ? "enabled" : feature.defaultValue === false ? "disabled" : "unspecified", + featureDesc: feature + }; + features[feature.name] = featureState; + } + return { + value: "ready", + context: { features } + }; + } + case "DE_INIT": { + return initialFeaturesState; + } + case "SET_ALL": { + if (state.value !== "ready") { + return state; + } + const features = { ...state.context.features }; + Object.keys(features).forEach((name) => { + const value = _nullishCoalesce(action.features[name], () => ( void 0)); + const currentFeature = features[name]; + if (_optionalChain([currentFeature, 'access', _3 => _3.featureDesc, 'optionalAccess', _4 => _4.onChangeDefault]) != null) { + if (value === true) { + features[name] = { ...currentFeature, value: "asyncEnabled" }; + } else if (value === false) { + features[name] = { ...currentFeature, value: "asyncDisabled" }; + } else { + features[name] = { ...currentFeature, value: "asyncUnspecified" }; + } + } else { + if (value === true) { + features[name] = { ...currentFeature, value: "enabled" }; + } else if (value === false) { + features[name] = { ...currentFeature, value: "disabled" }; + } else { + features[name] = { ...currentFeature, value: "unspecified" }; + } + } + }); + return { + ...state, + context: { features } + }; + } + case "SET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + let newValue; + if (_optionalChain([feature, 'access', _5 => _5.featureDesc, 'optionalAccess', _6 => _6.onChangeDefault]) != null) { + if (value === true) { + newValue = "asyncEnabled"; + } else if (value === false) { + newValue = "asyncDisabled"; + } else { + newValue = "asyncUnspecified"; + } + } else { + if (value === true) { + newValue = "enabled"; + } else if (value === false) { + newValue = "disabled"; + } else { + newValue = "unspecified"; + } + } + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "TOGGLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = _optionalChain([feature, 'access', _7 => _7.featureDesc, 'optionalAccess', _8 => _8.onChangeDefault]) != null ? "asyncEnabled" : "enabled"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "ENABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = _optionalChain([feature, 'access', _9 => _9.featureDesc, 'optionalAccess', _10 => _10.onChangeDefault]) != null ? "asyncEnabled" : "enabled"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "DISABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = _optionalChain([feature, 'access', _11 => _11.featureDesc, 'optionalAccess', _12 => _12.onChangeDefault]) != null ? "asyncDisabled" : "disabled"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "UNSET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = _optionalChain([feature, 'access', _13 => _13.featureDesc, 'optionalAccess', _14 => _14.onChangeDefault]) != null ? "asyncUnspecified" : "unspecified"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "ASYNC_DONE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + const newValue = value === true ? "enabled" : value === false ? "disabled" : "unspecified"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + default: + return state; + } +} + +// src/useConsoleOverride.tsx + + +// src/GlobalEnable.tsx +var GlobalEnable = class { + constructor(dispatch, testFeature2, featureDesc) { + this.featureDesc = featureDesc; + this.dispatch = dispatch; + this.testFeature = testFeature2; + } + toggle(feature) { + this.dispatch({ type: "TOGGLE", name: feature }); + } + enable(feature) { + this.dispatch({ type: "ENABLE", name: feature }); + } + unset(feature) { + this.dispatch({ type: "UNSET", name: feature }); + } + disable(feature) { + this.dispatch({ type: "DISABLE", name: feature }); + } + setAll(features) { + this.dispatch({ type: "SET_ALL", features }); + } + listFeatures() { + return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]); + } +}; + +// src/useConsoleOverride.tsx +function useConsoleOverride(consoleOverride, features, testFeature2, dispatch) { + _react.useEffect.call(void 0, () => { + if (!consoleOverride) { + if (window.feature != null) { + window.feature = void 0; + } + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + } + window.feature = new GlobalEnable(dispatch, testFeature2, features); + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + }, [features, dispatch, consoleOverride, testFeature2]); +} + +// src/usePersist.tsx + +var KEY = "react-enable:feature-values"; +function usePersist(storage, features, overrideState) { + const overrides = _react.useMemo.call(void 0, () => { + const newOverrides = {}; + if (overrideState.value === "ready") { + for (const feature of features) { + const [value] = valueOfFeature(overrideState, feature.name); + if (value != null) { + newOverrides[feature.name] = value; + } + } + } + return newOverrides; + }, [features, overrideState]); + const strState = Object.keys(overrides).length === 0 || storage == null ? "{}" : JSON.stringify({ overrides }); + _react.useEffect.call(void 0, () => { + try { + if (storage != null && overrideState.value === "ready") { + storage.setItem(KEY, strState); + } + } catch (e) { + } + }, [overrideState, storage, strState]); +} + +// src/useTestCallback.tsx + + +// src/testFeature.tsx +function testFeature(feature, states) { + const values = states.map((state) => valueOfFeature(state, feature)); + for (const [featureValue, featureForced] of values) { + if (featureValue != null && featureForced) { + return featureValue; + } + } + for (const [featureValue] of values) { + if (featureValue != null) { + return featureValue; + } + } + return void 0; +} + +// src/useTestCallback.tsx +function useTestCallback(defaultsState, overridesState) { + return _react.useCallback.call(void 0, + (f) => testFeature(f, [defaultsState, overridesState]), + [defaultsState, overridesState] + ); +} + +// src/Features.tsx + +function Features({ + children, + features, + disableConsole = false, + storage = window.sessionStorage +}) { + const featuresRef = _react.useRef.call(void 0, features); + const [overridesState, overridesDispatch] = _react.useReducer.call(void 0, + featuresReducer, + initialFeaturesState + ); + const [defaultsState, defaultsDispatch] = _react.useReducer.call(void 0, + featuresReducer, + initialFeaturesState + ); + _react.useEffect.call(void 0, () => { + defaultsDispatch({ type: "INIT", features }); + return () => { + defaultsDispatch({ type: "DE_INIT" }); + }; + }, [features]); + _react.useEffect.call(void 0, () => { + let f = {}; + if (storage != null) { + try { + const featuresJson = storage.getItem(KEY); + if (featuresJson != null) { + const fh = JSON.parse(featuresJson); + f = fh.overrides; + } + } catch (e) { + console.error("error in localStorage", e); + } + } + overridesDispatch({ + type: "INIT", + features: (_nullishCoalesce(featuresRef.current, () => ( []))).filter((x) => x.noOverride !== true).map((x) => ({ + name: x.name, + description: x.description, + defaultValue: _nullishCoalesce(_optionalChain([f, 'optionalAccess', _15 => _15[x.name]]), () => ( void 0)) + })) + }); + return () => { + overridesDispatch({ type: "DE_INIT" }); + }; + }, [storage]); + _react.useEffect.call(void 0, () => { + if (defaultsState.value !== "ready") { + return; + } + Object.entries(defaultsState.context.features).forEach( + ([name, feature]) => { + if (feature.value === "asyncEnabled" || feature.value === "asyncDisabled" || feature.value === "asyncUnspecified") { + const targetValue = feature.value === "asyncEnabled" ? true : feature.value === "asyncDisabled" ? false : void 0; + const onChangeDefault = _optionalChain([feature, 'access', _16 => _16.featureDesc, 'optionalAccess', _17 => _17.onChangeDefault]); + if (onChangeDefault != null && feature.featureDesc != null) { + onChangeDefault(feature.featureDesc.name, targetValue).then((result) => { + defaultsDispatch({ type: "ASYNC_DONE", name, value: result }); + }).catch(() => { + defaultsDispatch({ + type: "ASYNC_DONE", + name, + value: void 0 + }); + }); + } + } + } + ); + }, [defaultsState]); + usePersist(storage, featuresRef.current, overridesState); + const testCallback = useTestCallback(overridesState, defaultsState); + useConsoleOverride( + !disableConsole, + featuresRef.current, + testCallback, + defaultsDispatch + ); + const featureValue = _react.useMemo.call(void 0, + () => ({ + overridesSend: overridesDispatch, + defaultsSend: defaultsDispatch, + featuresDescription: featuresRef.current, + overridesState, + defaultsState, + test: testCallback + }), + [overridesState, defaultsState, testCallback] + ); + return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, FeatureContext.Provider, { value: featureValue, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, EnableContext.Provider, { value: testCallback, children }) }); +} + +// src/ToggleFeatures.tsx +var _react3 = require('@headlessui/react'); + +var _reactdom = require('react-dom'); var _reactdom2 = _interopRequireDefault(_reactdom); + +// src/tailwind.css +var tailwind_default = "*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::-ms-backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n/*\n! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n /* 1 */\n border-width: 0;\n /* 2 */\n border-style: solid;\n /* 2 */\n border-color: #e5e7eb;\n /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5;\n /* 1 */\n -webkit-text-size-adjust: 100%;\n /* 2 */\n -moz-tab-size: 4;\n /* 3 */\n -o-tab-size: 4;\n tab-size: 4;\n /* 3 */\n font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n /* 4 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 5 */\n font-variation-settings: normal;\n /* 6 */\n -webkit-tap-highlight-color: transparent;\n /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0;\n /* 1 */\n line-height: inherit;\n /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0;\n /* 1 */\n color: inherit;\n /* 2 */\n border-top-width: 1px;\n /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted currentColor;\n text-decoration: underline dotted currentColor;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n /* 1 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 2 */\n font-variation-settings: normal;\n /* 3 */\n font-size: 1em;\n /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0;\n /* 1 */\n border-color: inherit;\n /* 2 */\n border-collapse: collapse;\n /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n /* 1 */\n -webkit-font-feature-settings: inherit;\n font-feature-settings: inherit;\n /* 1 */\n font-variation-settings: inherit;\n /* 1 */\n font-size: 100%;\n /* 1 */\n font-weight: inherit;\n /* 1 */\n line-height: inherit;\n /* 1 */\n letter-spacing: inherit;\n /* 1 */\n color: inherit;\n /* 1 */\n margin: 0;\n /* 2 */\n padding: 0;\n /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button;\n /* 1 */\n background-color: transparent;\n /* 2 */\n background-image: none;\n /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield;\n /* 1 */\n outline-offset: -2px;\n /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n /* 1 */\n font: inherit;\n /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n /* 1 */\n vertical-align: middle;\n /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n\n[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n border-radius: 0px;\n padding-top: 0.5rem;\n padding-right: 0.75rem;\n padding-bottom: 0.5rem;\n padding-left: 0.75rem;\n font-size: 1rem;\n line-height: 1.5rem;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n border-color: #2563eb;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::placeholder,textarea::placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\n::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n}\n\n::-webkit-date-and-time-value {\n min-height: 1.5em;\n text-align: inherit;\n}\n\n::-webkit-datetime-edit {\n display: -webkit-inline-box;\n display: inline-flex;\n}\n\n::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {\n padding-top: 0;\n padding-bottom: 0;\n}\n\nselect {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n padding-right: 2.5rem;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n}\n\n[multiple],[size]:where(select:not([size=\"1\"])) {\n background-image: none;\n background-image: initial;\n background-position: 0 0;\n background-position: initial;\n background-repeat: repeat;\n background-repeat: initial;\n background-size: auto auto;\n background-size: initial;\n padding-right: 0.75rem;\n -webkit-print-color-adjust: unset;\n print-color-adjust: inherit;\n}\n\n[type='checkbox'],[type='radio'] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n padding: 0;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n display: inline-block;\n vertical-align: middle;\n background-origin: border-box;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n height: 1rem;\n width: 1rem;\n color: #2563eb;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='checkbox'] {\n border-radius: 0px;\n}\n\n[type='radio'] {\n border-radius: 100%;\n}\n\n[type='checkbox']:focus,[type='radio']:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n\n[type='checkbox']:checked,[type='radio']:checked {\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n[type='checkbox']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='radio']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='radio']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='checkbox']:indeterminate {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e\");\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:indeterminate {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='file'] {\n background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;\n background: initial;\n border-color: inherit;\n border-width: 0;\n border-radius: 0;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n}\n\n[type='file']:focus {\n outline: 1px solid ButtonText;\n outline: 1px auto -webkit-focus-ring-color;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.pointer-events-none {\n pointer-events: none;\n}\n\n.invisible {\n visibility: hidden;\n}\n\n.fixed {\n position: fixed;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.-inset-px {\n top: -1px;\n right: -1px;\n bottom: -1px;\n left: -1px;\n}\n\n.inset-0 {\n top: 0px;\n right: 0px;\n bottom: 0px;\n left: 0px;\n}\n\n.bottom-0 {\n bottom: 0px;\n}\n\n.left-0 {\n left: 0px;\n}\n\n.z-10 {\n z-index: 10;\n}\n\n.mx-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n\n.mx-8 {\n margin-left: 2rem;\n margin-right: 2rem;\n}\n\n.my-4 {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n\n.mt-1 {\n margin-top: 0.25rem;\n}\n\n.mt-4 {\n margin-top: 1rem;\n}\n\n.mt-5 {\n margin-top: 1.25rem;\n}\n\n.mt-6 {\n margin-top: 1.5rem;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n\n.inline-flex {\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n}\n\n.grid {\n display: grid;\n}\n\n.hidden {\n display: none;\n}\n\n.h-4 {\n height: 1rem;\n}\n\n.h-5 {\n height: 1.25rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-7 {\n height: 1.75rem;\n}\n\n.h-8 {\n height: 2rem;\n}\n\n.min-h-6 {\n min-height: 1.5rem;\n}\n\n.min-h-screen {\n min-height: 100vh;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-5 {\n width: 1.25rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.min-w-4 {\n min-width: 1rem;\n}\n\n.min-w-6 {\n min-width: 1.5rem;\n}\n\n.max-w-full {\n max-width: 100%;\n}\n\n.shrink {\n -ms-flex-negative: 1;\n flex-shrink: 1;\n}\n\n.grow {\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n}\n\n.transform {\n -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n\n.flex-row {\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.flex-col {\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.items-end {\n -webkit-box-align: end;\n -ms-flex-align: end;\n align-items: flex-end;\n}\n\n.items-center {\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.justify-center {\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.gap-1 {\n gap: 0.25rem;\n}\n\n.gap-2 {\n gap: 0.5rem;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.gap-9 {\n gap: 2.25rem;\n}\n\n.gap-y-6 {\n row-gap: 1.5rem;\n}\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.rounded-lg {\n border-radius: 0.5rem;\n}\n\n.rounded-sm {\n border-radius: 0.125rem;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-2 {\n border-width: 2px;\n}\n\n.border-blue-500 {\n --tw-border-opacity: 1;\n border-color: rgba(59, 130, 246, 1);\n border-color: rgba(59, 130, 246, var(--tw-border-opacity, 1));\n}\n\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgba(209, 213, 219, 1);\n border-color: rgba(209, 213, 219, var(--tw-border-opacity, 1));\n}\n\n.border-gray-500 {\n --tw-border-opacity: 1;\n border-color: rgba(107, 114, 128, 1);\n border-color: rgba(107, 114, 128, var(--tw-border-opacity, 1));\n}\n\n.border-green-500 {\n --tw-border-opacity: 1;\n border-color: rgba(34, 197, 94, 1);\n border-color: rgba(34, 197, 94, var(--tw-border-opacity, 1));\n}\n\n.border-orange-500 {\n --tw-border-opacity: 1;\n border-color: rgba(249, 115, 22, 1);\n border-color: rgba(249, 115, 22, var(--tw-border-opacity, 1));\n}\n\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgba(239, 68, 68, 1);\n border-color: rgba(239, 68, 68, var(--tw-border-opacity, 1));\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgba(37, 99, 235, 1);\n background-color: rgba(37, 99, 235, var(--tw-bg-opacity, 1));\n}\n\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgba(255, 255, 255, 1);\n background-color: rgba(255, 255, 255, var(--tw-bg-opacity, 1));\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.pb-0 {\n padding-bottom: 0px;\n}\n\n.pb-10 {\n padding-bottom: 2.5rem;\n}\n\n.pb-4 {\n padding-bottom: 1rem;\n}\n\n.pl-4 {\n padding-left: 1rem;\n}\n\n.pr-4 {\n padding-right: 1rem;\n}\n\n.pt-0 {\n padding-top: 0px;\n}\n\n.pt-4 {\n padding-top: 1rem;\n}\n\n.pt-5 {\n padding-top: 1.25rem;\n}\n\n.text-left {\n text-align: left;\n}\n\n.align-middle {\n vertical-align: middle;\n}\n\n.align-bottom {\n vertical-align: bottom;\n}\n\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n\n.font-medium {\n font-weight: 500;\n}\n\n.leading-6 {\n line-height: 1.5rem;\n}\n\n.leading-7 {\n line-height: 1.75rem;\n}\n\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgba(59, 130, 246, 1);\n color: rgba(59, 130, 246, var(--tw-text-opacity, 1));\n}\n\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgba(107, 114, 128, 1);\n color: rgba(107, 114, 128, var(--tw-text-opacity, 1));\n}\n\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgba(17, 24, 39, 1);\n color: rgba(17, 24, 39, var(--tw-text-opacity, 1));\n}\n\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgba(34, 197, 94, 1);\n color: rgba(34, 197, 94, var(--tw-text-opacity, 1));\n}\n\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgba(249, 115, 22, 1);\n color: rgba(249, 115, 22, var(--tw-text-opacity, 1));\n}\n\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgba(239, 68, 68, 1);\n color: rgba(239, 68, 68, var(--tw-text-opacity, 1));\n}\n\n.text-white {\n --tw-text-opacity: 1;\n color: rgba(255, 255, 255, 1);\n color: rgba(255, 255, 255, var(--tw-text-opacity, 1));\n}\n\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.ring-blue-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(59, 130, 246, var(--tw-ring-opacity, 1));\n}\n\n.ring-gray-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(107, 114, 128, var(--tw-ring-opacity, 1));\n}\n\n.invert {\n --tw-invert: invert(100%);\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.filter {\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition-all {\n -webkit-transition-property: all;\n transition-property: all;\n -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n -webkit-transition-duration: 150ms;\n transition-duration: 150ms;\n}\n\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.focus\\:ring-blue-600:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(37, 99, 235, var(--tw-ring-opacity, 1));\n}\n\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n\n@media (min-width: 640px) {\n .sm\\:my-8 {\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n .sm\\:mt-3 {\n margin-top: 0.75rem;\n }\n\n .sm\\:mt-6 {\n margin-top: 1.5rem;\n }\n\n .sm\\:block {\n display: block;\n }\n\n .sm\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n .sm\\:gap-x-4 {\n -moz-column-gap: 1rem;\n -webkit-column-gap: 1rem;\n column-gap: 1rem;\n }\n\n .sm\\:p-0 {\n padding: 0px;\n }\n\n .sm\\:p-6 {\n padding: 1.5rem;\n }\n\n .sm\\:align-middle {\n vertical-align: middle;\n }\n\n .sm\\:text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n}\n\n@media (min-width: 1024px) {\n .lg\\:max-w-\\[80\\%\\] {\n max-width: 80%;\n }\n\n .lg\\:gap-4 {\n gap: 1rem;\n }\n}\n"; + +// src/ToggleFeatures.tsx + +function classNames(...classes) { + return classes.filter(Boolean).join(" "); +} +function ToggleFeature({ + feature +}) { + const context = _react.useContext.call(void 0, FeatureContext); + const handleChangeSelection = _react.useCallback.call(void 0, + (value) => { + if (_optionalChain([context, 'optionalAccess', _18 => _18.overridesSend]) != null) { + switch (value) { + case "true": { + context.overridesSend({ type: "ENABLE", name: feature.name }); + break; + } + case "false": { + context.overridesSend({ type: "DISABLE", name: feature.name }); + break; + } + case "unset": { + context.overridesSend({ type: "UNSET", name: feature.name }); + break; + } + } + } + }, + [feature.name, context] + ); + if (context == null) { + return null; + } + const { overridesState, test: testFeature2, defaultsState } = context; + const valueInDefaults = (_nullishCoalesce(valueOfFeature(defaultsState, feature.name)[0], () => ( "unset"))).toString(); + const valueInOverrides = (_nullishCoalesce(valueOfFeature(overridesState, feature.name)[0], () => ( "unset"))).toString(); + const actualChecked = testFeature2(feature.name); + return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, + _react3.RadioGroup, + { + disabled: feature.noOverride, + onChange: handleChangeSelection, + value: valueInOverrides, + children: [ + /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _react3.RadioGroup.Label, { children: [ + /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "h6", { className: "text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7", children: [ + /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "font-medium", children: [ + "Feature: ", + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "code", { children: feature.name }) + ] }), + feature.noOverride === true ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1", children: [ + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "svg", + { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "path", + { + clipRule: "evenodd", + d: "M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z", + fillRule: "evenodd" + } + ) + } + ), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children: "No Overrides" }) + ] }) : null, + actualChecked === true ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1", children: [ + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "svg", + { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "path", + { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + } + ) + } + ), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children: actualChecked ? "Enabled" : "Disabled" }) + ] }) : null + ] }), + feature.description == null ? null : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-base text-gray-500 text-sm", children: feature.description }) + ] }), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4", children: [ + { + id: "false", + title: `Disable ${feature.name}`, + description: "Override the feature to be disabled" + }, + { + id: "unset", + title: "Default", + description: "Inherit enabled state from defaults", + disabled: (_nullishCoalesce(feature.noOverride, () => ( false))) || feature.force, + defaultValue: valueInDefaults === "true" ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: "Enabled" }) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: "Disabled" }) }) + }, + { + id: "true", + title: `Enable ${feature.name}`, + description: "Override the feature to be enabled" + } + ].map((option) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + _react3.RadioGroup.Option, + { + className: ({ checked, active, disabled }) => classNames( + checked ? "border-transparent" : "border-gray-300", + !disabled && active ? "border-blue-500 ring-2 ring-blue-500" : "", + disabled ? "border-transparent ring-gray-500 cursor-not-allowed" : "cursor-pointer", + "relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none" + ), + disabled: option.disabled, + value: option.id, + children: ({ checked, active, disabled }) => /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [ + /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col grow", children: [ + /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, + _react3.RadioGroup.Label, + { + as: "span", + className: "flex flex-nowrap flex-row gap-1 items-center space-between", + children: [ + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-sm font-medium text-gray-900 grow shrink", children: option.title }), + option.defaultValue != null ? option.defaultValue : null, + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "svg", + { + "aria-hidden": "true", + className: classNames( + !checked ? "invisible" : "", + "h-5 w-5 text-blue-500 min-w-4" + ), + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "path", + { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + } + ) + } + ) + ] + } + ), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + _react3.RadioGroup.Description, + { + as: "span", + className: "mt-1 flex items-center text-sm text-gray-500", + children: option.description + } + ) + ] }), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "div", + { + "aria-hidden": "true", + className: classNames( + !disabled && active ? "border" : "border-2", + checked ? disabled ? "border-gray-500" : "border-blue-500" : "border-transparent", + "absolute -inset-px rounded-lg pointer-events-none" + ) + } + ) + ] }) + }, + option.id + )) }) + ] + } + ); +} +function ShadowContent({ + root, + children +}) { + return _reactdom2.default.createPortal(children, root); +} +function ToggleFeatures({ + defaultOpen = false, + hidden = false +}) { + const [root, setCoreRoot] = _react.useState.call(void 0, null); + const setRoot = (host) => { + if (host == null || root != null) { + return; + } + const shadowRoot = _optionalChain([host, 'optionalAccess', _19 => _19.attachShadow, 'call', _20 => _20({ mode: "open" })]); + const style = document.createElement("style"); + const renderDiv = document.createElement("div"); + style.textContent = tailwind_default; + shadowRoot.appendChild(style); + shadowRoot.appendChild(renderDiv); + setCoreRoot(renderDiv); + }; + if (hidden) { + return null; + } + return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "div", + { + ref: setRoot, + style: { + zIndex: 99999, + position: "fixed", + width: "0", + height: "0", + bottom: 0 + }, + children: root != null ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ShadowContent, { root, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ToggleFeatureUnwrapped, { defaultOpen }) }) : null + } + ); +} +function ToggleFeatureUnwrapped({ + defaultOpen = false, + hidden = false +}) { + const [open, setOpen] = _react.useState.call(void 0, defaultOpen); + const context = _react.useContext.call(void 0, FeatureContext); + if (context == null) { + return null; + } + if (hidden) { + return null; + } + const { featuresDescription } = context; + if (featuresDescription.length === 0) { + return null; + } + return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative", children: [ + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "absolute bottom-0 left-0 mx-4 my-4", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "button", + { + className: "inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(true), + title: "Toggle features", + type: "button", + children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "svg", + { + className: "w-6 h-6 min-h-6 min-w-6", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "path", + { + clipRule: "evenodd", + d: "M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z", + fillRule: "evenodd" + } + ) + } + ) + } + ) }), + !open ? null : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "fixed z-10 inset-0 overflow-y-auto", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-1 sm:mt-3", children: [ + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "flex flex-row gap-4 flex-nowrap items-center space-between", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "grow text-lg leading-6 font-medium text-gray-900", children: "Feature Flag Overrides" }) }), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "p", { className: "text-sm text-gray-500", children: "Features can be enabled or disabled unless they are forced upstream. You can also revert to default." }), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "mt-6", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "fieldset", { className: "flex flex-col gap-9", children: [ + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "legend", { className: "sr-only", children: "Feature Flags" }), + featuresDescription.map((feature) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ToggleFeature, { feature }, feature.name)) + ] }) }), + /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex justify-center items-center mt-5 sm:mt-6", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, + "button", + { + className: "inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(false), + type: "button", + children: "Done" + } + ) }) + ] }) }) }) }) }) + ] }); +} + + + + + + + + + + +exports.Disable = Disable; exports.Enable = Enable; exports.EnableContext = EnableContext; exports.Features = Features; exports.ToggleFeatures = ToggleFeatures; exports.useAllDisabled = useAllDisabled; exports.useAllEnabled = useAllEnabled; exports.useDisabled = useDisabled; exports.useEnabled = useEnabled; +//# sourceMappingURL=index.cjs.map \ No newline at end of file diff --git a/dist/index.cjs.map b/dist/index.cjs.map new file mode 100644 index 0000000..8c8d9b9 --- /dev/null +++ b/dist/index.cjs.map @@ -0,0 +1 @@ +{"version":3,"sources":["/home/user/react-enable/dist/index.cjs","../src/utils.ts","../src/EnableContext.tsx","../src/useAllDisabled.tsx","../src/useDisabled.tsx","../src/Disable.tsx","../src/useAllEnabled.tsx","../src/useEnabled.tsx","../src/Enable.tsx","../src/Features.tsx","../src/FeatureContext.tsx","../src/FeatureState.tsx","../src/FeaturesState.tsx","../src/useConsoleOverride.tsx","../src/GlobalEnable.tsx","../src/usePersist.tsx","../src/useTestCallback.tsx","../src/testFeature.tsx","../src/ToggleFeatures.tsx","../src/tailwind.css"],"names":["jsx","Fragment","createContext","testFeature","useMemo","useEffect","useContext","useCallback"],"mappings":"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","file":"/home/user/react-enable/dist/index.cjs","sourcesContent":[null,"import { useContext, useMemo } from 'react';\n\nimport { EnableContext, type EnableContextType } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(\n input?: string[] | string | null,\n): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(\n () => (input == null ? [] : Array.isArray(input) ? input : [input]),\n [input],\n );\n\n return [test, converted];\n}\n","import { createContext } from 'react';\n\nimport type { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return (\n withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false))\n );\n}\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n","// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport type { EnableProps } from './Enable';\nimport { useAllDisabled } from './useAllDisabled';\nimport { useDisabled } from './useDisabled';\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children,\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n","// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({\n feature = [],\n allFeatures = [],\n children,\n}: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n","import { type ReactNode, useEffect, useMemo, useReducer, useRef } from 'react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { featuresReducer, initialFeaturesState } from './FeaturesState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n const [defaultsState, defaultsDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n\n useEffect(() => {\n /// Load defaults\n defaultsDispatch({ type: 'INIT', features });\n return () => {\n defaultsDispatch({ type: 'DE_INIT' });\n };\n }, [features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesDispatch({\n type: 'INIT',\n features: (featuresRef.current ?? [])\n .filter((x) => x.noOverride !== true)\n .map((x) => ({\n name: x.name,\n description: x.description,\n defaultValue: f?.[x.name] ?? undefined,\n })),\n });\n\n return () => {\n overridesDispatch({ type: 'DE_INIT' });\n };\n }, [storage]);\n\n // Handle async operations for features with onChangeDefault\n useEffect(() => {\n if (defaultsState.value !== 'ready') {\n return;\n }\n\n // Check for features in async states and handle them\n Object.entries(defaultsState.context.features).forEach(\n ([name, feature]) => {\n if (\n feature.value === 'asyncEnabled' ||\n feature.value === 'asyncDisabled' ||\n feature.value === 'asyncUnspecified'\n ) {\n const targetValue =\n feature.value === 'asyncEnabled'\n ? true\n : feature.value === 'asyncDisabled'\n ? false\n : undefined;\n\n const onChangeDefault = feature.featureDesc?.onChangeDefault;\n if (onChangeDefault != null && feature.featureDesc != null) {\n onChangeDefault(feature.featureDesc.name, targetValue)\n .then((result) => {\n defaultsDispatch({ type: 'ASYNC_DONE', name, value: result });\n })\n .catch(() => {\n defaultsDispatch({\n type: 'ASYNC_DONE',\n name,\n value: undefined,\n });\n });\n }\n }\n },\n );\n }, [defaultsState]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(\n !disableConsole,\n featuresRef.current,\n testCallback,\n defaultsDispatch,\n );\n\n const featureValue = useMemo(\n () => ({\n overridesSend: overridesDispatch,\n defaultsSend: defaultsDispatch,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesState, defaultsState, testCallback],\n );\n\n return (\n \n \n {children}\n \n \n );\n}\n","import { createContext } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch, FeaturesState } from './FeaturesState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n","import type { Dispatch } from 'react';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureStateValue =\n | 'initial'\n | 'enabled'\n | 'disabled'\n | 'unspecified'\n | 'asyncEnabled'\n | 'asyncDisabled'\n | 'asyncUnspecified';\n\nexport interface FeatureState {\n value: FeatureStateValue;\n featureDesc?: FeatureDescription;\n}\n\nexport type FeatureDispatch = Dispatch;\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(\n featureState: FeatureState,\n): [FeatureValue, boolean] {\n return [\n featureState.value === 'enabled' || featureState.value === 'asyncEnabled'\n ? true\n : featureState.value === 'disabled' ||\n featureState.value === 'asyncDisabled'\n ? false\n : undefined,\n featureState.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (\n name: K,\n newValue: FeatureValue,\n ) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' }\n | { type: 'ASYNC_DONE'; value: FeatureValue };\n\nexport const initialFeatureState: FeatureState = {\n value: 'initial',\n};\n\n/**\n * Reducer for managing individual feature state\n */\nexport function featureReducer(\n state: FeatureState,\n action: FeatureAction,\n): FeatureState {\n switch (action.type) {\n case 'INIT': {\n const { feature } = action;\n const value =\n feature.defaultValue === true\n ? 'enabled'\n : feature.defaultValue === false\n ? 'disabled'\n : 'unspecified';\n return {\n value: value as FeatureStateValue,\n featureDesc: feature,\n };\n }\n\n case 'ENABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'DISABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'disabled' };\n }\n\n case 'TOGGLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'UNSET': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncUnspecified' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'SET': {\n const { value } = action;\n if (state.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n return { ...state, value: 'asyncEnabled' };\n }\n if (value === false) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'asyncUnspecified' };\n }\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'ASYNC_DONE': {\n const { value } = action;\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n default:\n return state;\n }\n}\n","import type { Dispatch } from 'react';\n\nimport {\n type FeatureDescription,\n type FeatureState,\n type FeatureValue,\n valueForState,\n} from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: FeatureState };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string }\n | { type: 'ASYNC_DONE'; name: string; value: FeatureValue };\n\nexport interface FeaturesState {\n value: 'idle' | 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesDispatch = Dispatch;\n\nexport function valueOfFeature(\n featuresState: FeaturesState,\n feature: string,\n): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature];\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\nexport const initialFeaturesState: FeaturesState = {\n value: 'idle',\n context: {\n features: {},\n },\n};\n\n/**\n * Reducer for managing a collection of features\n */\nexport function featuresReducer(\n state: FeaturesState,\n action: FeaturesAction,\n): FeaturesState {\n switch (action.type) {\n case 'INIT': {\n if (!action.features || action.features.length === 0) {\n return state;\n }\n\n const features: { [x: string]: FeatureState } = {};\n for (const feature of action.features) {\n // Initialize each feature\n const featureState = {\n value:\n feature.defaultValue === true\n ? ('enabled' as const)\n : feature.defaultValue === false\n ? ('disabled' as const)\n : ('unspecified' as const),\n featureDesc: feature,\n };\n features[feature.name] = featureState;\n }\n\n return {\n value: 'ready',\n context: { features },\n };\n }\n\n case 'DE_INIT': {\n return initialFeaturesState;\n }\n\n case 'SET_ALL': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const features = { ...state.context.features };\n Object.keys(features).forEach((name) => {\n const value = action.features[name] ?? undefined;\n const currentFeature = features[name];\n\n if (currentFeature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'asyncEnabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'asyncDisabled' };\n } else {\n features[name] = { ...currentFeature, value: 'asyncUnspecified' };\n }\n } else {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'enabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'disabled' };\n } else {\n features[name] = { ...currentFeature, value: 'unspecified' };\n }\n }\n });\n\n return {\n ...state,\n context: { features },\n };\n }\n\n case 'SET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n let newValue: FeatureState['value'];\n\n if (feature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n newValue = 'asyncEnabled';\n } else if (value === false) {\n newValue = 'asyncDisabled';\n } else {\n newValue = 'asyncUnspecified';\n }\n } else {\n if (value === true) {\n newValue = 'enabled';\n } else if (value === false) {\n newValue = 'disabled';\n } else {\n newValue = 'unspecified';\n }\n }\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'TOGGLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ENABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'DISABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncDisabled'\n : 'disabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'UNSET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncUnspecified'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ASYNC_DONE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n const newValue =\n value === true\n ? 'enabled'\n : value === false\n ? 'disabled'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n default:\n return state;\n }\n}\n","import { useEffect } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch,\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n // Clean up window.feature immediately if consoleOverride is disabled\n if (window.feature != null) {\n window.feature = undefined;\n }\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n","import type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[],\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n","import { useEffect, useMemo } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState,\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.value === 'ready') {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState =\n Object.keys(overrides).length === 0 || storage == null\n ? '{}'\n : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.value === 'ready') {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n","import { useCallback } from 'react';\n\nimport type { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState,\n): (feature: string) => boolean | undefined {\n return useCallback(\n (f: string) => testFeature(f, [defaultsState, overridesState]),\n [defaultsState, overridesState],\n );\n}\n","import type { FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(\n feature: string,\n states: FeaturesState[],\n): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n","import { RadioGroup } from '@headlessui/react';\nimport { type ReactNode, useCallback, useContext, useState } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { valueOfFeature } from './FeaturesState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({\n feature,\n}: {\n feature: FeatureDescription;\n}): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context],\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (\n valueOfFeature(defaultsState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const valueInOverrides = (\n valueOfFeature(overridesState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null : (\n

\n {feature.description}\n

\n )}\n
\n
\n {[\n {\n id: 'false',\n title: `Disable ${feature.name}`,\n description: 'Override the feature to be disabled',\n },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n {\n id: 'true',\n title: `Enable ${feature.name}`,\n description: 'Override the feature to be enabled',\n },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active\n ? 'border-blue-500 ring-2 ring-blue-500'\n : '',\n disabled\n ? 'border-transparent ring-gray-500 cursor-not-allowed'\n : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none',\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n \n {option.title}\n \n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n \n );\n}\n\nfunction ShadowContent({\n root,\n children,\n}: {\n children: ReactNode;\n root: Element;\n}) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n \n {root != null ? (\n \n \n \n ) : null}\n \n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
\n Feature Flag Overrides\n
\n

\n

\n Features can be enabled or disabled unless they are forced\n upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n","*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::-ms-backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n/*\n! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n /* 1 */\n border-width: 0;\n /* 2 */\n border-style: solid;\n /* 2 */\n border-color: #e5e7eb;\n /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5;\n /* 1 */\n -webkit-text-size-adjust: 100%;\n /* 2 */\n -moz-tab-size: 4;\n /* 3 */\n -o-tab-size: 4;\n tab-size: 4;\n /* 3 */\n font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n /* 4 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 5 */\n font-variation-settings: normal;\n /* 6 */\n -webkit-tap-highlight-color: transparent;\n /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0;\n /* 1 */\n line-height: inherit;\n /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0;\n /* 1 */\n color: inherit;\n /* 2 */\n border-top-width: 1px;\n /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted currentColor;\n text-decoration: underline dotted currentColor;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n /* 1 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 2 */\n font-variation-settings: normal;\n /* 3 */\n font-size: 1em;\n /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0;\n /* 1 */\n border-color: inherit;\n /* 2 */\n border-collapse: collapse;\n /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n /* 1 */\n -webkit-font-feature-settings: inherit;\n font-feature-settings: inherit;\n /* 1 */\n font-variation-settings: inherit;\n /* 1 */\n font-size: 100%;\n /* 1 */\n font-weight: inherit;\n /* 1 */\n line-height: inherit;\n /* 1 */\n letter-spacing: inherit;\n /* 1 */\n color: inherit;\n /* 1 */\n margin: 0;\n /* 2 */\n padding: 0;\n /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button;\n /* 1 */\n background-color: transparent;\n /* 2 */\n background-image: none;\n /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield;\n /* 1 */\n outline-offset: -2px;\n /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n /* 1 */\n font: inherit;\n /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n /* 1 */\n vertical-align: middle;\n /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n\n[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n border-radius: 0px;\n padding-top: 0.5rem;\n padding-right: 0.75rem;\n padding-bottom: 0.5rem;\n padding-left: 0.75rem;\n font-size: 1rem;\n line-height: 1.5rem;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n border-color: #2563eb;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::placeholder,textarea::placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\n::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n}\n\n::-webkit-date-and-time-value {\n min-height: 1.5em;\n text-align: inherit;\n}\n\n::-webkit-datetime-edit {\n display: -webkit-inline-box;\n display: inline-flex;\n}\n\n::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {\n padding-top: 0;\n padding-bottom: 0;\n}\n\nselect {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n padding-right: 2.5rem;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n}\n\n[multiple],[size]:where(select:not([size=\"1\"])) {\n background-image: none;\n background-image: initial;\n background-position: 0 0;\n background-position: initial;\n background-repeat: repeat;\n background-repeat: initial;\n background-size: auto auto;\n background-size: initial;\n padding-right: 0.75rem;\n -webkit-print-color-adjust: unset;\n print-color-adjust: inherit;\n}\n\n[type='checkbox'],[type='radio'] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n padding: 0;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n display: inline-block;\n vertical-align: middle;\n background-origin: border-box;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n height: 1rem;\n width: 1rem;\n color: #2563eb;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='checkbox'] {\n border-radius: 0px;\n}\n\n[type='radio'] {\n border-radius: 100%;\n}\n\n[type='checkbox']:focus,[type='radio']:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n\n[type='checkbox']:checked,[type='radio']:checked {\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n[type='checkbox']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='radio']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='radio']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='checkbox']:indeterminate {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e\");\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:indeterminate {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='file'] {\n background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;\n background: initial;\n border-color: inherit;\n border-width: 0;\n border-radius: 0;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n}\n\n[type='file']:focus {\n outline: 1px solid ButtonText;\n outline: 1px auto -webkit-focus-ring-color;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.pointer-events-none {\n pointer-events: none;\n}\n\n.invisible {\n visibility: hidden;\n}\n\n.fixed {\n position: fixed;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.-inset-px {\n top: -1px;\n right: -1px;\n bottom: -1px;\n left: -1px;\n}\n\n.inset-0 {\n top: 0px;\n right: 0px;\n bottom: 0px;\n left: 0px;\n}\n\n.bottom-0 {\n bottom: 0px;\n}\n\n.left-0 {\n left: 0px;\n}\n\n.z-10 {\n z-index: 10;\n}\n\n.mx-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n\n.mx-8 {\n margin-left: 2rem;\n margin-right: 2rem;\n}\n\n.my-4 {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n\n.mt-1 {\n margin-top: 0.25rem;\n}\n\n.mt-4 {\n margin-top: 1rem;\n}\n\n.mt-5 {\n margin-top: 1.25rem;\n}\n\n.mt-6 {\n margin-top: 1.5rem;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n\n.inline-flex {\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n}\n\n.grid {\n display: grid;\n}\n\n.hidden {\n display: none;\n}\n\n.h-4 {\n height: 1rem;\n}\n\n.h-5 {\n height: 1.25rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-7 {\n height: 1.75rem;\n}\n\n.h-8 {\n height: 2rem;\n}\n\n.min-h-6 {\n min-height: 1.5rem;\n}\n\n.min-h-screen {\n min-height: 100vh;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-5 {\n width: 1.25rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.min-w-4 {\n min-width: 1rem;\n}\n\n.min-w-6 {\n min-width: 1.5rem;\n}\n\n.max-w-full {\n max-width: 100%;\n}\n\n.shrink {\n -ms-flex-negative: 1;\n flex-shrink: 1;\n}\n\n.grow {\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n}\n\n.transform {\n -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n\n.flex-row {\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.flex-col {\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.items-end {\n -webkit-box-align: end;\n -ms-flex-align: end;\n align-items: flex-end;\n}\n\n.items-center {\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.justify-center {\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.gap-1 {\n gap: 0.25rem;\n}\n\n.gap-2 {\n gap: 0.5rem;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.gap-9 {\n gap: 2.25rem;\n}\n\n.gap-y-6 {\n row-gap: 1.5rem;\n}\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.rounded-lg {\n border-radius: 0.5rem;\n}\n\n.rounded-sm {\n border-radius: 0.125rem;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-2 {\n border-width: 2px;\n}\n\n.border-blue-500 {\n --tw-border-opacity: 1;\n border-color: rgba(59, 130, 246, 1);\n border-color: rgba(59, 130, 246, var(--tw-border-opacity, 1));\n}\n\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgba(209, 213, 219, 1);\n border-color: rgba(209, 213, 219, var(--tw-border-opacity, 1));\n}\n\n.border-gray-500 {\n --tw-border-opacity: 1;\n border-color: rgba(107, 114, 128, 1);\n border-color: rgba(107, 114, 128, var(--tw-border-opacity, 1));\n}\n\n.border-green-500 {\n --tw-border-opacity: 1;\n border-color: rgba(34, 197, 94, 1);\n border-color: rgba(34, 197, 94, var(--tw-border-opacity, 1));\n}\n\n.border-orange-500 {\n --tw-border-opacity: 1;\n border-color: rgba(249, 115, 22, 1);\n border-color: rgba(249, 115, 22, var(--tw-border-opacity, 1));\n}\n\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgba(239, 68, 68, 1);\n border-color: rgba(239, 68, 68, var(--tw-border-opacity, 1));\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgba(37, 99, 235, 1);\n background-color: rgba(37, 99, 235, var(--tw-bg-opacity, 1));\n}\n\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgba(255, 255, 255, 1);\n background-color: rgba(255, 255, 255, var(--tw-bg-opacity, 1));\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.pb-0 {\n padding-bottom: 0px;\n}\n\n.pb-10 {\n padding-bottom: 2.5rem;\n}\n\n.pb-4 {\n padding-bottom: 1rem;\n}\n\n.pl-4 {\n padding-left: 1rem;\n}\n\n.pr-4 {\n padding-right: 1rem;\n}\n\n.pt-0 {\n padding-top: 0px;\n}\n\n.pt-4 {\n padding-top: 1rem;\n}\n\n.pt-5 {\n padding-top: 1.25rem;\n}\n\n.text-left {\n text-align: left;\n}\n\n.align-middle {\n vertical-align: middle;\n}\n\n.align-bottom {\n vertical-align: bottom;\n}\n\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n\n.font-medium {\n font-weight: 500;\n}\n\n.leading-6 {\n line-height: 1.5rem;\n}\n\n.leading-7 {\n line-height: 1.75rem;\n}\n\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgba(59, 130, 246, 1);\n color: rgba(59, 130, 246, var(--tw-text-opacity, 1));\n}\n\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgba(107, 114, 128, 1);\n color: rgba(107, 114, 128, var(--tw-text-opacity, 1));\n}\n\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgba(17, 24, 39, 1);\n color: rgba(17, 24, 39, var(--tw-text-opacity, 1));\n}\n\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgba(34, 197, 94, 1);\n color: rgba(34, 197, 94, var(--tw-text-opacity, 1));\n}\n\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgba(249, 115, 22, 1);\n color: rgba(249, 115, 22, var(--tw-text-opacity, 1));\n}\n\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgba(239, 68, 68, 1);\n color: rgba(239, 68, 68, var(--tw-text-opacity, 1));\n}\n\n.text-white {\n --tw-text-opacity: 1;\n color: rgba(255, 255, 255, 1);\n color: rgba(255, 255, 255, var(--tw-text-opacity, 1));\n}\n\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.ring-blue-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(59, 130, 246, var(--tw-ring-opacity, 1));\n}\n\n.ring-gray-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(107, 114, 128, var(--tw-ring-opacity, 1));\n}\n\n.invert {\n --tw-invert: invert(100%);\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.filter {\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition-all {\n -webkit-transition-property: all;\n transition-property: all;\n -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n -webkit-transition-duration: 150ms;\n transition-duration: 150ms;\n}\n\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.focus\\:ring-blue-600:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(37, 99, 235, var(--tw-ring-opacity, 1));\n}\n\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n\n@media (min-width: 640px) {\n .sm\\:my-8 {\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n .sm\\:mt-3 {\n margin-top: 0.75rem;\n }\n\n .sm\\:mt-6 {\n margin-top: 1.5rem;\n }\n\n .sm\\:block {\n display: block;\n }\n\n .sm\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n .sm\\:gap-x-4 {\n -moz-column-gap: 1rem;\n -webkit-column-gap: 1rem;\n column-gap: 1rem;\n }\n\n .sm\\:p-0 {\n padding: 0px;\n }\n\n .sm\\:p-6 {\n padding: 1.5rem;\n }\n\n .sm\\:align-middle {\n vertical-align: middle;\n }\n\n .sm\\:text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n}\n\n@media (min-width: 1024px) {\n .lg\\:max-w-\\[80\\%\\] {\n max-width: 80%;\n }\n\n .lg\\:gap-4 {\n gap: 1rem;\n }\n}\n"]} \ No newline at end of file diff --git a/dist/index.d.cts b/dist/index.d.cts new file mode 100644 index 0000000..d3a6d08 --- /dev/null +++ b/dist/index.d.cts @@ -0,0 +1,160 @@ +import * as React from 'react'; +import { Dispatch, ReactNode } from 'react'; + +interface EnableProps { + readonly feature?: string[] | string; + readonly allFeatures?: string[]; + children: React.ReactNode; +} +/** + * Feature will be enabled if any feature in the list are enabled, + */ +declare function Enable({ feature, allFeatures, children, }: EnableProps): JSX.Element | null; + +/** + * Feature will be disabled if any in the list are enabled + */ +declare const Disable: React.FC; + +/** + * Feature is either on, off, or 'unset', + * which means it will go to the default value or the less specific value. + */ +type FeatureValue = false | true | undefined; +type FeatureStateValue = 'initial' | 'enabled' | 'disabled' | 'unspecified' | 'asyncEnabled' | 'asyncDisabled' | 'asyncUnspecified'; +interface FeatureState { + value: FeatureStateValue; + featureDesc?: FeatureDescription; +} +type FeatureDispatch = Dispatch; +/** + * Definition of a feature that can be enabled or disabled. + * K is the type of the key that is used to identify the feature. + */ +interface FeatureDescription { + readonly name: K; + readonly description?: string; + readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise; + readonly force?: boolean; + readonly noOverride?: boolean; + readonly defaultValue?: FeatureValue; +} +/** + * Actions that can be performed on a feature. + */ +type FeatureAction = { + type: 'DISABLE'; +} | { + type: 'ENABLE'; +} | { + type: 'INIT'; + feature: FeatureDescription; +} | { + type: 'SET'; + value: FeatureValue; +} | { + type: 'TOGGLE'; +} | { + type: 'UNSET'; +} | { + type: 'ASYNC_DONE'; + value: FeatureValue; +}; + +type EnableContextType = (feature: string) => FeatureValue; +/** + * Contained function can check whether a given feature is enabled. + */ +declare const EnableContext: React.Context; + +interface FeaturesContext { + features: { + [x: string]: FeatureState; + }; +} +type FeaturesAction = { + type: 'DE_INIT'; +} | { + type: 'DISABLE'; + name: string; +} | { + type: 'ENABLE'; + name: string; +} | { + type: 'INIT'; + features: readonly FeatureDescription[]; +} | { + type: 'SET_ALL'; + features: { + [key: string]: FeatureValue; + }; +} | { + type: 'SET'; + name: string; + value: FeatureValue; +} | { + type: 'TOGGLE'; + name: string; +} | { + type: 'UNSET'; + name: string; +} | { + type: 'ASYNC_DONE'; + name: string; + value: FeatureValue; +}; +interface FeaturesState { + value: 'idle' | 'ready'; + context: FeaturesContext; +} +type FeaturesDispatch = Dispatch; + +interface FeatureContextType { + overridesSend: FeaturesDispatch; + defaultsSend: FeaturesDispatch; + featuresDescription: readonly FeatureDescription[]; + overridesState: FeaturesState; + defaultsState: FeaturesState; + test: (flag: string) => FeatureValue; +} + +interface FeatureProps { + readonly features: readonly FeatureDescription[]; + readonly children?: ReactNode; + readonly disableConsole?: boolean; + readonly storage?: Storage; +} +/** + * A more batteries-enabled parent component that keeps track of feature state + * internally, and creates window.feature.enable("f") and window.feature.disable("f"). + * Keeps track of overrides and defaults, with defaults potentially coming from your props + * and overrides being persisted to your choice of storage layer. + */ +declare function Features({ children, features, disableConsole, storage, }: FeatureProps): JSX.Element; + +declare function ToggleFeatures({ defaultOpen, hidden, }: { + defaultOpen?: boolean; + hidden?: boolean; +}): JSX.Element | null; + +/** + * returns true iff all specified features are disabled + */ +declare function useAllDisabled(withoutAll: string[] | string): boolean; + +/** + * returns true iff all specified features are enabled + */ +declare function useAllEnabled(allFeatures: string[] | string): boolean; + +/** + * returns true iff any specified feature is disabled + */ +declare function useDisabled(without: string[] | string): boolean; + +/** + * returns true iff any specified feature is enabled + */ +declare function useEnabled(feature: string[] | string): boolean; + +export { Disable, Enable, EnableContext, type EnableContextType, type FeatureContextType, type FeatureDescription, type FeatureDispatch, type FeatureState, type FeatureValue, Features, ToggleFeatures, useAllDisabled, useAllEnabled, useDisabled, useEnabled }; diff --git a/dist/index.d.ts b/dist/index.d.ts index f56ffe3..d3a6d08 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,12 +1,160 @@ -export { Disable } from './Disable'; -export { Enable } from './Enable'; -export type { EnableContextType } from './EnableContext'; -export { EnableContext } from './EnableContext'; -export type { FeatureContextType } from './FeatureContext'; -export type { FeatureDescription, FeatureDispatch, FeatureState, FeatureValue, } from './FeatureState'; -export { Features } from './Features'; -export { ToggleFeatures } from './ToggleFeatures'; -export { useAllDisabled } from './useAllDisabled'; -export { useAllEnabled } from './useAllEnabled'; -export { useDisabled } from './useDisabled'; -export { useEnabled } from './useEnabled'; +import * as React from 'react'; +import { Dispatch, ReactNode } from 'react'; + +interface EnableProps { + readonly feature?: string[] | string; + readonly allFeatures?: string[]; + children: React.ReactNode; +} +/** + * Feature will be enabled if any feature in the list are enabled, + */ +declare function Enable({ feature, allFeatures, children, }: EnableProps): JSX.Element | null; + +/** + * Feature will be disabled if any in the list are enabled + */ +declare const Disable: React.FC; + +/** + * Feature is either on, off, or 'unset', + * which means it will go to the default value or the less specific value. + */ +type FeatureValue = false | true | undefined; +type FeatureStateValue = 'initial' | 'enabled' | 'disabled' | 'unspecified' | 'asyncEnabled' | 'asyncDisabled' | 'asyncUnspecified'; +interface FeatureState { + value: FeatureStateValue; + featureDesc?: FeatureDescription; +} +type FeatureDispatch = Dispatch; +/** + * Definition of a feature that can be enabled or disabled. + * K is the type of the key that is used to identify the feature. + */ +interface FeatureDescription { + readonly name: K; + readonly description?: string; + readonly onChangeDefault?: (name: K, newValue: FeatureValue) => Promise; + readonly force?: boolean; + readonly noOverride?: boolean; + readonly defaultValue?: FeatureValue; +} +/** + * Actions that can be performed on a feature. + */ +type FeatureAction = { + type: 'DISABLE'; +} | { + type: 'ENABLE'; +} | { + type: 'INIT'; + feature: FeatureDescription; +} | { + type: 'SET'; + value: FeatureValue; +} | { + type: 'TOGGLE'; +} | { + type: 'UNSET'; +} | { + type: 'ASYNC_DONE'; + value: FeatureValue; +}; + +type EnableContextType = (feature: string) => FeatureValue; +/** + * Contained function can check whether a given feature is enabled. + */ +declare const EnableContext: React.Context; + +interface FeaturesContext { + features: { + [x: string]: FeatureState; + }; +} +type FeaturesAction = { + type: 'DE_INIT'; +} | { + type: 'DISABLE'; + name: string; +} | { + type: 'ENABLE'; + name: string; +} | { + type: 'INIT'; + features: readonly FeatureDescription[]; +} | { + type: 'SET_ALL'; + features: { + [key: string]: FeatureValue; + }; +} | { + type: 'SET'; + name: string; + value: FeatureValue; +} | { + type: 'TOGGLE'; + name: string; +} | { + type: 'UNSET'; + name: string; +} | { + type: 'ASYNC_DONE'; + name: string; + value: FeatureValue; +}; +interface FeaturesState { + value: 'idle' | 'ready'; + context: FeaturesContext; +} +type FeaturesDispatch = Dispatch; + +interface FeatureContextType { + overridesSend: FeaturesDispatch; + defaultsSend: FeaturesDispatch; + featuresDescription: readonly FeatureDescription[]; + overridesState: FeaturesState; + defaultsState: FeaturesState; + test: (flag: string) => FeatureValue; +} + +interface FeatureProps { + readonly features: readonly FeatureDescription[]; + readonly children?: ReactNode; + readonly disableConsole?: boolean; + readonly storage?: Storage; +} +/** + * A more batteries-enabled parent component that keeps track of feature state + * internally, and creates window.feature.enable("f") and window.feature.disable("f"). + * Keeps track of overrides and defaults, with defaults potentially coming from your props + * and overrides being persisted to your choice of storage layer. + */ +declare function Features({ children, features, disableConsole, storage, }: FeatureProps): JSX.Element; + +declare function ToggleFeatures({ defaultOpen, hidden, }: { + defaultOpen?: boolean; + hidden?: boolean; +}): JSX.Element | null; + +/** + * returns true iff all specified features are disabled + */ +declare function useAllDisabled(withoutAll: string[] | string): boolean; + +/** + * returns true iff all specified features are enabled + */ +declare function useAllEnabled(allFeatures: string[] | string): boolean; + +/** + * returns true iff any specified feature is disabled + */ +declare function useDisabled(without: string[] | string): boolean; + +/** + * returns true iff any specified feature is enabled + */ +declare function useEnabled(feature: string[] | string): boolean; + +export { Disable, Enable, EnableContext, type EnableContextType, type FeatureContextType, type FeatureDescription, type FeatureDispatch, type FeatureState, type FeatureValue, Features, ToggleFeatures, useAllDisabled, useAllEnabled, useDisabled, useEnabled }; diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..c9d6e71 --- /dev/null +++ b/dist/index.js @@ -0,0 +1,803 @@ +// src/utils.ts +import { useContext, useMemo } from "react"; + +// src/EnableContext.tsx +import { createContext } from "react"; +var EnableContext = createContext((_s) => false); + +// src/utils.ts +function useTestAndConvert(input) { + const test = useContext(EnableContext); + const converted = useMemo( + () => input == null ? [] : Array.isArray(input) ? input : [input], + [input] + ); + return [test, converted]; +} + +// src/useAllDisabled.tsx +function useAllDisabled(withoutAll) { + const [test, queryAllWithout] = useTestAndConvert(withoutAll); + return withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false)); +} + +// src/useDisabled.tsx +function useDisabled(without) { + const [test, queryAnyWithout] = useTestAndConvert(without); + return queryAnyWithout.some((x) => !(test(x) ?? false)); +} + +// src/Disable.tsx +import { Fragment, jsx } from "react/jsx-runtime"; +var Disable = ({ + feature = [], + allFeatures = [], + children +}) => { + const isAny = useDisabled(feature); + const isAll = useAllDisabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ jsx(Fragment, { children }); + } + return null; +}; + +// src/useAllEnabled.tsx +function useAllEnabled(allFeatures) { + const [test, queryAllPresent] = useTestAndConvert(allFeatures); + return queryAllPresent.length > 0 && queryAllPresent.every(test); +} + +// src/useEnabled.tsx +function useEnabled(feature) { + const [test, queryAnyPresent] = useTestAndConvert(feature); + return queryAnyPresent.some(test); +} + +// src/Enable.tsx +import { Fragment as Fragment2, jsx as jsx2 } from "react/jsx-runtime"; +function Enable({ + feature = [], + allFeatures = [], + children +}) { + const isAny = useEnabled(feature); + const isAll = useAllEnabled(allFeatures); + if (isAny || isAll) { + return /* @__PURE__ */ jsx2(Fragment2, { children }); + } + return null; +} + +// src/Features.tsx +import { useEffect as useEffect3, useMemo as useMemo3, useReducer, useRef } from "react"; + +// src/FeatureContext.tsx +import { createContext as createContext2 } from "react"; +var FeatureContext = createContext2(null); + +// src/FeatureState.tsx +function valueForState(featureState) { + return [ + featureState.value === "enabled" || featureState.value === "asyncEnabled" ? true : featureState.value === "disabled" || featureState.value === "asyncDisabled" ? false : void 0, + featureState.featureDesc?.force ?? false + ]; +} + +// src/FeaturesState.tsx +function valueOfFeature(featuresState, feature) { + if (featuresState.context.features[feature] == null) { + return [void 0, false]; + } + const featureState = featuresState.context.features[feature]; + if (featureState != null) { + return valueForState(featureState); + } + return [void 0, false]; +} +var initialFeaturesState = { + value: "idle", + context: { + features: {} + } +}; +function featuresReducer(state, action) { + switch (action.type) { + case "INIT": { + if (!action.features || action.features.length === 0) { + return state; + } + const features = {}; + for (const feature of action.features) { + const featureState = { + value: feature.defaultValue === true ? "enabled" : feature.defaultValue === false ? "disabled" : "unspecified", + featureDesc: feature + }; + features[feature.name] = featureState; + } + return { + value: "ready", + context: { features } + }; + } + case "DE_INIT": { + return initialFeaturesState; + } + case "SET_ALL": { + if (state.value !== "ready") { + return state; + } + const features = { ...state.context.features }; + Object.keys(features).forEach((name) => { + const value = action.features[name] ?? void 0; + const currentFeature = features[name]; + if (currentFeature.featureDesc?.onChangeDefault != null) { + if (value === true) { + features[name] = { ...currentFeature, value: "asyncEnabled" }; + } else if (value === false) { + features[name] = { ...currentFeature, value: "asyncDisabled" }; + } else { + features[name] = { ...currentFeature, value: "asyncUnspecified" }; + } + } else { + if (value === true) { + features[name] = { ...currentFeature, value: "enabled" }; + } else if (value === false) { + features[name] = { ...currentFeature, value: "disabled" }; + } else { + features[name] = { ...currentFeature, value: "unspecified" }; + } + } + }); + return { + ...state, + context: { features } + }; + } + case "SET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + let newValue; + if (feature.featureDesc?.onChangeDefault != null) { + if (value === true) { + newValue = "asyncEnabled"; + } else if (value === false) { + newValue = "asyncDisabled"; + } else { + newValue = "asyncUnspecified"; + } + } else { + if (value === true) { + newValue = "enabled"; + } else if (value === false) { + newValue = "disabled"; + } else { + newValue = "unspecified"; + } + } + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "TOGGLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = feature.featureDesc?.onChangeDefault != null ? "asyncEnabled" : "enabled"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "ENABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = feature.featureDesc?.onChangeDefault != null ? "asyncEnabled" : "enabled"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "DISABLE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = feature.featureDesc?.onChangeDefault != null ? "asyncDisabled" : "disabled"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "UNSET": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const newValue = feature.featureDesc?.onChangeDefault != null ? "asyncUnspecified" : "unspecified"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + case "ASYNC_DONE": { + if (state.value !== "ready") { + return state; + } + const feature = state.context.features[action.name]; + if (feature == null) { + return state; + } + const { value } = action; + const newValue = value === true ? "enabled" : value === false ? "disabled" : "unspecified"; + return { + ...state, + context: { + features: { + ...state.context.features, + [action.name]: { ...feature, value: newValue } + } + } + }; + } + default: + return state; + } +} + +// src/useConsoleOverride.tsx +import { useEffect } from "react"; + +// src/GlobalEnable.tsx +var GlobalEnable = class { + constructor(dispatch, testFeature2, featureDesc) { + this.featureDesc = featureDesc; + this.dispatch = dispatch; + this.testFeature = testFeature2; + } + toggle(feature) { + this.dispatch({ type: "TOGGLE", name: feature }); + } + enable(feature) { + this.dispatch({ type: "ENABLE", name: feature }); + } + unset(feature) { + this.dispatch({ type: "UNSET", name: feature }); + } + disable(feature) { + this.dispatch({ type: "DISABLE", name: feature }); + } + setAll(features) { + this.dispatch({ type: "SET_ALL", features }); + } + listFeatures() { + return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]); + } +}; + +// src/useConsoleOverride.tsx +function useConsoleOverride(consoleOverride, features, testFeature2, dispatch) { + useEffect(() => { + if (!consoleOverride) { + if (window.feature != null) { + window.feature = void 0; + } + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + } + window.feature = new GlobalEnable(dispatch, testFeature2, features); + return () => { + if (window.feature != null) { + window.feature = void 0; + } + }; + }, [features, dispatch, consoleOverride, testFeature2]); +} + +// src/usePersist.tsx +import { useEffect as useEffect2, useMemo as useMemo2 } from "react"; +var KEY = "react-enable:feature-values"; +function usePersist(storage, features, overrideState) { + const overrides = useMemo2(() => { + const newOverrides = {}; + if (overrideState.value === "ready") { + for (const feature of features) { + const [value] = valueOfFeature(overrideState, feature.name); + if (value != null) { + newOverrides[feature.name] = value; + } + } + } + return newOverrides; + }, [features, overrideState]); + const strState = Object.keys(overrides).length === 0 || storage == null ? "{}" : JSON.stringify({ overrides }); + useEffect2(() => { + try { + if (storage != null && overrideState.value === "ready") { + storage.setItem(KEY, strState); + } + } catch (e) { + } + }, [overrideState, storage, strState]); +} + +// src/useTestCallback.tsx +import { useCallback } from "react"; + +// src/testFeature.tsx +function testFeature(feature, states) { + const values = states.map((state) => valueOfFeature(state, feature)); + for (const [featureValue, featureForced] of values) { + if (featureValue != null && featureForced) { + return featureValue; + } + } + for (const [featureValue] of values) { + if (featureValue != null) { + return featureValue; + } + } + return void 0; +} + +// src/useTestCallback.tsx +function useTestCallback(defaultsState, overridesState) { + return useCallback( + (f) => testFeature(f, [defaultsState, overridesState]), + [defaultsState, overridesState] + ); +} + +// src/Features.tsx +import { jsx as jsx3 } from "react/jsx-runtime"; +function Features({ + children, + features, + disableConsole = false, + storage = window.sessionStorage +}) { + const featuresRef = useRef(features); + const [overridesState, overridesDispatch] = useReducer( + featuresReducer, + initialFeaturesState + ); + const [defaultsState, defaultsDispatch] = useReducer( + featuresReducer, + initialFeaturesState + ); + useEffect3(() => { + defaultsDispatch({ type: "INIT", features }); + return () => { + defaultsDispatch({ type: "DE_INIT" }); + }; + }, [features]); + useEffect3(() => { + let f = {}; + if (storage != null) { + try { + const featuresJson = storage.getItem(KEY); + if (featuresJson != null) { + const fh = JSON.parse(featuresJson); + f = fh.overrides; + } + } catch (e) { + console.error("error in localStorage", e); + } + } + overridesDispatch({ + type: "INIT", + features: (featuresRef.current ?? []).filter((x) => x.noOverride !== true).map((x) => ({ + name: x.name, + description: x.description, + defaultValue: f?.[x.name] ?? void 0 + })) + }); + return () => { + overridesDispatch({ type: "DE_INIT" }); + }; + }, [storage]); + useEffect3(() => { + if (defaultsState.value !== "ready") { + return; + } + Object.entries(defaultsState.context.features).forEach( + ([name, feature]) => { + if (feature.value === "asyncEnabled" || feature.value === "asyncDisabled" || feature.value === "asyncUnspecified") { + const targetValue = feature.value === "asyncEnabled" ? true : feature.value === "asyncDisabled" ? false : void 0; + const onChangeDefault = feature.featureDesc?.onChangeDefault; + if (onChangeDefault != null && feature.featureDesc != null) { + onChangeDefault(feature.featureDesc.name, targetValue).then((result) => { + defaultsDispatch({ type: "ASYNC_DONE", name, value: result }); + }).catch(() => { + defaultsDispatch({ + type: "ASYNC_DONE", + name, + value: void 0 + }); + }); + } + } + } + ); + }, [defaultsState]); + usePersist(storage, featuresRef.current, overridesState); + const testCallback = useTestCallback(overridesState, defaultsState); + useConsoleOverride( + !disableConsole, + featuresRef.current, + testCallback, + defaultsDispatch + ); + const featureValue = useMemo3( + () => ({ + overridesSend: overridesDispatch, + defaultsSend: defaultsDispatch, + featuresDescription: featuresRef.current, + overridesState, + defaultsState, + test: testCallback + }), + [overridesState, defaultsState, testCallback] + ); + return /* @__PURE__ */ jsx3(FeatureContext.Provider, { value: featureValue, children: /* @__PURE__ */ jsx3(EnableContext.Provider, { value: testCallback, children }) }); +} + +// src/ToggleFeatures.tsx +import { RadioGroup } from "@headlessui/react"; +import { useCallback as useCallback2, useContext as useContext2, useState } from "react"; +import ReactDOM from "react-dom"; + +// src/tailwind.css +var tailwind_default = "*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::-ms-backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n/*\n! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n /* 1 */\n border-width: 0;\n /* 2 */\n border-style: solid;\n /* 2 */\n border-color: #e5e7eb;\n /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5;\n /* 1 */\n -webkit-text-size-adjust: 100%;\n /* 2 */\n -moz-tab-size: 4;\n /* 3 */\n -o-tab-size: 4;\n tab-size: 4;\n /* 3 */\n font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n /* 4 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 5 */\n font-variation-settings: normal;\n /* 6 */\n -webkit-tap-highlight-color: transparent;\n /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0;\n /* 1 */\n line-height: inherit;\n /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0;\n /* 1 */\n color: inherit;\n /* 2 */\n border-top-width: 1px;\n /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted currentColor;\n text-decoration: underline dotted currentColor;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n /* 1 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 2 */\n font-variation-settings: normal;\n /* 3 */\n font-size: 1em;\n /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0;\n /* 1 */\n border-color: inherit;\n /* 2 */\n border-collapse: collapse;\n /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n /* 1 */\n -webkit-font-feature-settings: inherit;\n font-feature-settings: inherit;\n /* 1 */\n font-variation-settings: inherit;\n /* 1 */\n font-size: 100%;\n /* 1 */\n font-weight: inherit;\n /* 1 */\n line-height: inherit;\n /* 1 */\n letter-spacing: inherit;\n /* 1 */\n color: inherit;\n /* 1 */\n margin: 0;\n /* 2 */\n padding: 0;\n /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button;\n /* 1 */\n background-color: transparent;\n /* 2 */\n background-image: none;\n /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield;\n /* 1 */\n outline-offset: -2px;\n /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n /* 1 */\n font: inherit;\n /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n /* 1 */\n vertical-align: middle;\n /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n\n[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n border-radius: 0px;\n padding-top: 0.5rem;\n padding-right: 0.75rem;\n padding-bottom: 0.5rem;\n padding-left: 0.75rem;\n font-size: 1rem;\n line-height: 1.5rem;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n border-color: #2563eb;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::placeholder,textarea::placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\n::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n}\n\n::-webkit-date-and-time-value {\n min-height: 1.5em;\n text-align: inherit;\n}\n\n::-webkit-datetime-edit {\n display: -webkit-inline-box;\n display: inline-flex;\n}\n\n::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {\n padding-top: 0;\n padding-bottom: 0;\n}\n\nselect {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n padding-right: 2.5rem;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n}\n\n[multiple],[size]:where(select:not([size=\"1\"])) {\n background-image: none;\n background-image: initial;\n background-position: 0 0;\n background-position: initial;\n background-repeat: repeat;\n background-repeat: initial;\n background-size: auto auto;\n background-size: initial;\n padding-right: 0.75rem;\n -webkit-print-color-adjust: unset;\n print-color-adjust: inherit;\n}\n\n[type='checkbox'],[type='radio'] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n padding: 0;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n display: inline-block;\n vertical-align: middle;\n background-origin: border-box;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n height: 1rem;\n width: 1rem;\n color: #2563eb;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='checkbox'] {\n border-radius: 0px;\n}\n\n[type='radio'] {\n border-radius: 100%;\n}\n\n[type='checkbox']:focus,[type='radio']:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n\n[type='checkbox']:checked,[type='radio']:checked {\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n[type='checkbox']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='radio']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='radio']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='checkbox']:indeterminate {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e\");\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:indeterminate {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='file'] {\n background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;\n background: initial;\n border-color: inherit;\n border-width: 0;\n border-radius: 0;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n}\n\n[type='file']:focus {\n outline: 1px solid ButtonText;\n outline: 1px auto -webkit-focus-ring-color;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.pointer-events-none {\n pointer-events: none;\n}\n\n.invisible {\n visibility: hidden;\n}\n\n.fixed {\n position: fixed;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.-inset-px {\n top: -1px;\n right: -1px;\n bottom: -1px;\n left: -1px;\n}\n\n.inset-0 {\n top: 0px;\n right: 0px;\n bottom: 0px;\n left: 0px;\n}\n\n.bottom-0 {\n bottom: 0px;\n}\n\n.left-0 {\n left: 0px;\n}\n\n.z-10 {\n z-index: 10;\n}\n\n.mx-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n\n.mx-8 {\n margin-left: 2rem;\n margin-right: 2rem;\n}\n\n.my-4 {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n\n.mt-1 {\n margin-top: 0.25rem;\n}\n\n.mt-4 {\n margin-top: 1rem;\n}\n\n.mt-5 {\n margin-top: 1.25rem;\n}\n\n.mt-6 {\n margin-top: 1.5rem;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n\n.inline-flex {\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n}\n\n.grid {\n display: grid;\n}\n\n.hidden {\n display: none;\n}\n\n.h-4 {\n height: 1rem;\n}\n\n.h-5 {\n height: 1.25rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-7 {\n height: 1.75rem;\n}\n\n.h-8 {\n height: 2rem;\n}\n\n.min-h-6 {\n min-height: 1.5rem;\n}\n\n.min-h-screen {\n min-height: 100vh;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-5 {\n width: 1.25rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.min-w-4 {\n min-width: 1rem;\n}\n\n.min-w-6 {\n min-width: 1.5rem;\n}\n\n.max-w-full {\n max-width: 100%;\n}\n\n.shrink {\n -ms-flex-negative: 1;\n flex-shrink: 1;\n}\n\n.grow {\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n}\n\n.transform {\n -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n\n.flex-row {\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.flex-col {\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.items-end {\n -webkit-box-align: end;\n -ms-flex-align: end;\n align-items: flex-end;\n}\n\n.items-center {\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.justify-center {\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.gap-1 {\n gap: 0.25rem;\n}\n\n.gap-2 {\n gap: 0.5rem;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.gap-9 {\n gap: 2.25rem;\n}\n\n.gap-y-6 {\n row-gap: 1.5rem;\n}\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.rounded-lg {\n border-radius: 0.5rem;\n}\n\n.rounded-sm {\n border-radius: 0.125rem;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-2 {\n border-width: 2px;\n}\n\n.border-blue-500 {\n --tw-border-opacity: 1;\n border-color: rgba(59, 130, 246, 1);\n border-color: rgba(59, 130, 246, var(--tw-border-opacity, 1));\n}\n\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgba(209, 213, 219, 1);\n border-color: rgba(209, 213, 219, var(--tw-border-opacity, 1));\n}\n\n.border-gray-500 {\n --tw-border-opacity: 1;\n border-color: rgba(107, 114, 128, 1);\n border-color: rgba(107, 114, 128, var(--tw-border-opacity, 1));\n}\n\n.border-green-500 {\n --tw-border-opacity: 1;\n border-color: rgba(34, 197, 94, 1);\n border-color: rgba(34, 197, 94, var(--tw-border-opacity, 1));\n}\n\n.border-orange-500 {\n --tw-border-opacity: 1;\n border-color: rgba(249, 115, 22, 1);\n border-color: rgba(249, 115, 22, var(--tw-border-opacity, 1));\n}\n\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgba(239, 68, 68, 1);\n border-color: rgba(239, 68, 68, var(--tw-border-opacity, 1));\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgba(37, 99, 235, 1);\n background-color: rgba(37, 99, 235, var(--tw-bg-opacity, 1));\n}\n\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgba(255, 255, 255, 1);\n background-color: rgba(255, 255, 255, var(--tw-bg-opacity, 1));\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.pb-0 {\n padding-bottom: 0px;\n}\n\n.pb-10 {\n padding-bottom: 2.5rem;\n}\n\n.pb-4 {\n padding-bottom: 1rem;\n}\n\n.pl-4 {\n padding-left: 1rem;\n}\n\n.pr-4 {\n padding-right: 1rem;\n}\n\n.pt-0 {\n padding-top: 0px;\n}\n\n.pt-4 {\n padding-top: 1rem;\n}\n\n.pt-5 {\n padding-top: 1.25rem;\n}\n\n.text-left {\n text-align: left;\n}\n\n.align-middle {\n vertical-align: middle;\n}\n\n.align-bottom {\n vertical-align: bottom;\n}\n\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n\n.font-medium {\n font-weight: 500;\n}\n\n.leading-6 {\n line-height: 1.5rem;\n}\n\n.leading-7 {\n line-height: 1.75rem;\n}\n\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgba(59, 130, 246, 1);\n color: rgba(59, 130, 246, var(--tw-text-opacity, 1));\n}\n\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgba(107, 114, 128, 1);\n color: rgba(107, 114, 128, var(--tw-text-opacity, 1));\n}\n\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgba(17, 24, 39, 1);\n color: rgba(17, 24, 39, var(--tw-text-opacity, 1));\n}\n\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgba(34, 197, 94, 1);\n color: rgba(34, 197, 94, var(--tw-text-opacity, 1));\n}\n\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgba(249, 115, 22, 1);\n color: rgba(249, 115, 22, var(--tw-text-opacity, 1));\n}\n\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgba(239, 68, 68, 1);\n color: rgba(239, 68, 68, var(--tw-text-opacity, 1));\n}\n\n.text-white {\n --tw-text-opacity: 1;\n color: rgba(255, 255, 255, 1);\n color: rgba(255, 255, 255, var(--tw-text-opacity, 1));\n}\n\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.ring-blue-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(59, 130, 246, var(--tw-ring-opacity, 1));\n}\n\n.ring-gray-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(107, 114, 128, var(--tw-ring-opacity, 1));\n}\n\n.invert {\n --tw-invert: invert(100%);\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.filter {\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition-all {\n -webkit-transition-property: all;\n transition-property: all;\n -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n -webkit-transition-duration: 150ms;\n transition-duration: 150ms;\n}\n\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.focus\\:ring-blue-600:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(37, 99, 235, var(--tw-ring-opacity, 1));\n}\n\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n\n@media (min-width: 640px) {\n .sm\\:my-8 {\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n .sm\\:mt-3 {\n margin-top: 0.75rem;\n }\n\n .sm\\:mt-6 {\n margin-top: 1.5rem;\n }\n\n .sm\\:block {\n display: block;\n }\n\n .sm\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n .sm\\:gap-x-4 {\n -moz-column-gap: 1rem;\n -webkit-column-gap: 1rem;\n column-gap: 1rem;\n }\n\n .sm\\:p-0 {\n padding: 0px;\n }\n\n .sm\\:p-6 {\n padding: 1.5rem;\n }\n\n .sm\\:align-middle {\n vertical-align: middle;\n }\n\n .sm\\:text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n}\n\n@media (min-width: 1024px) {\n .lg\\:max-w-\\[80\\%\\] {\n max-width: 80%;\n }\n\n .lg\\:gap-4 {\n gap: 1rem;\n }\n}\n"; + +// src/ToggleFeatures.tsx +import { Fragment as Fragment3, jsx as jsx4, jsxs } from "react/jsx-runtime"; +function classNames(...classes) { + return classes.filter(Boolean).join(" "); +} +function ToggleFeature({ + feature +}) { + const context = useContext2(FeatureContext); + const handleChangeSelection = useCallback2( + (value) => { + if (context?.overridesSend != null) { + switch (value) { + case "true": { + context.overridesSend({ type: "ENABLE", name: feature.name }); + break; + } + case "false": { + context.overridesSend({ type: "DISABLE", name: feature.name }); + break; + } + case "unset": { + context.overridesSend({ type: "UNSET", name: feature.name }); + break; + } + } + } + }, + [feature.name, context] + ); + if (context == null) { + return null; + } + const { overridesState, test: testFeature2, defaultsState } = context; + const valueInDefaults = (valueOfFeature(defaultsState, feature.name)[0] ?? "unset").toString(); + const valueInOverrides = (valueOfFeature(overridesState, feature.name)[0] ?? "unset").toString(); + const actualChecked = testFeature2(feature.name); + return /* @__PURE__ */ jsxs( + RadioGroup, + { + disabled: feature.noOverride, + onChange: handleChangeSelection, + value: valueInOverrides, + children: [ + /* @__PURE__ */ jsxs(RadioGroup.Label, { children: [ + /* @__PURE__ */ jsxs("h6", { className: "text-gray-900 align-center flex flex-row flex-nowrap items-center gap-2 lg:gap-4 h-7", children: [ + /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [ + "Feature: ", + /* @__PURE__ */ jsx4("code", { children: feature.name }) + ] }), + feature.noOverride === true ? /* @__PURE__ */ jsxs("div", { className: "border-orange-500 text-orange-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1", children: [ + /* @__PURE__ */ jsx4( + "svg", + { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ jsx4( + "path", + { + clipRule: "evenodd", + d: "M5 9V7a5 5 0 0110 0v2a2 2 0 012 2v5a2 2 0 01-2 2H5a2 2 0 01-2-2v-5a2 2 0 012-2zm8-2v2H7V7a3 3 0 016 0z", + fillRule: "evenodd" + } + ) + } + ), + /* @__PURE__ */ jsx4("div", { children: "No Overrides" }) + ] }) : null, + actualChecked === true ? /* @__PURE__ */ jsxs("div", { className: "flex flex-nowrap text-xs text-green-500 flex-row gap-1 rounded-sm border items-center justify-center border-green-500 px-2 py-1", children: [ + /* @__PURE__ */ jsx4( + "svg", + { + "aria-hidden": "true", + className: "h-4 w-4 min-w-4", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ jsx4( + "path", + { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + } + ) + } + ), + /* @__PURE__ */ jsx4("div", { children: actualChecked ? "Enabled" : "Disabled" }) + ] }) : null + ] }), + feature.description == null ? null : /* @__PURE__ */ jsx4("p", { className: "text-base text-gray-500 text-sm", children: feature.description }) + ] }), + /* @__PURE__ */ jsx4("div", { className: "mt-4 grid grid-cols-1 gap-y-6 sm:grid-cols-3 sm:gap-x-4", children: [ + { + id: "false", + title: `Disable ${feature.name}`, + description: "Override the feature to be disabled" + }, + { + id: "unset", + title: "Default", + description: "Inherit enabled state from defaults", + disabled: (feature.noOverride ?? false) || feature.force, + defaultValue: valueInDefaults === "true" ? /* @__PURE__ */ jsx4("div", { className: "text-green-500 border-green-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1", children: /* @__PURE__ */ jsx4("span", { children: "Enabled" }) }) : /* @__PURE__ */ jsx4("div", { className: "text-red-500 border-red-500 flex flex-nowrap text-xs flex-row gap-1 rounded-sm border items-center justify-center px-2 py-1", children: /* @__PURE__ */ jsx4("span", { children: "Disabled" }) }) + }, + { + id: "true", + title: `Enable ${feature.name}`, + description: "Override the feature to be enabled" + } + ].map((option) => /* @__PURE__ */ jsx4( + RadioGroup.Option, + { + className: ({ checked, active, disabled }) => classNames( + checked ? "border-transparent" : "border-gray-300", + !disabled && active ? "border-blue-500 ring-2 ring-blue-500" : "", + disabled ? "border-transparent ring-gray-500 cursor-not-allowed" : "cursor-pointer", + "relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none" + ), + disabled: option.disabled, + value: option.id, + children: ({ checked, active, disabled }) => /* @__PURE__ */ jsxs(Fragment3, { children: [ + /* @__PURE__ */ jsxs("div", { className: "flex flex-col grow", children: [ + /* @__PURE__ */ jsxs( + RadioGroup.Label, + { + as: "span", + className: "flex flex-nowrap flex-row gap-1 items-center space-between", + children: [ + /* @__PURE__ */ jsx4("span", { className: "text-sm font-medium text-gray-900 grow shrink", children: option.title }), + option.defaultValue != null ? option.defaultValue : null, + /* @__PURE__ */ jsx4( + "svg", + { + "aria-hidden": "true", + className: classNames( + !checked ? "invisible" : "", + "h-5 w-5 text-blue-500 min-w-4" + ), + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ jsx4( + "path", + { + clipRule: "evenodd", + d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", + fillRule: "evenodd" + } + ) + } + ) + ] + } + ), + /* @__PURE__ */ jsx4( + RadioGroup.Description, + { + as: "span", + className: "mt-1 flex items-center text-sm text-gray-500", + children: option.description + } + ) + ] }), + /* @__PURE__ */ jsx4( + "div", + { + "aria-hidden": "true", + className: classNames( + !disabled && active ? "border" : "border-2", + checked ? disabled ? "border-gray-500" : "border-blue-500" : "border-transparent", + "absolute -inset-px rounded-lg pointer-events-none" + ) + } + ) + ] }) + }, + option.id + )) }) + ] + } + ); +} +function ShadowContent({ + root, + children +}) { + return ReactDOM.createPortal(children, root); +} +function ToggleFeatures({ + defaultOpen = false, + hidden = false +}) { + const [root, setCoreRoot] = useState(null); + const setRoot = (host) => { + if (host == null || root != null) { + return; + } + const shadowRoot = host?.attachShadow({ mode: "open" }); + const style = document.createElement("style"); + const renderDiv = document.createElement("div"); + style.textContent = tailwind_default; + shadowRoot.appendChild(style); + shadowRoot.appendChild(renderDiv); + setCoreRoot(renderDiv); + }; + if (hidden) { + return null; + } + return /* @__PURE__ */ jsx4( + "div", + { + ref: setRoot, + style: { + zIndex: 99999, + position: "fixed", + width: "0", + height: "0", + bottom: 0 + }, + children: root != null ? /* @__PURE__ */ jsx4(ShadowContent, { root, children: /* @__PURE__ */ jsx4(ToggleFeatureUnwrapped, { defaultOpen }) }) : null + } + ); +} +function ToggleFeatureUnwrapped({ + defaultOpen = false, + hidden = false +}) { + const [open, setOpen] = useState(defaultOpen); + const context = useContext2(FeatureContext); + if (context == null) { + return null; + } + if (hidden) { + return null; + } + const { featuresDescription } = context; + if (featuresDescription.length === 0) { + return null; + } + return /* @__PURE__ */ jsxs("div", { className: "relative", children: [ + /* @__PURE__ */ jsx4("div", { className: "absolute bottom-0 left-0 mx-4 my-4", children: /* @__PURE__ */ jsx4( + "button", + { + className: "inline-flex items-center text-sm font-medium p-1 h-8 w-8 align-middle cursor-pointer rounded-full bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(true), + title: "Toggle features", + type: "button", + children: /* @__PURE__ */ jsx4( + "svg", + { + className: "w-6 h-6 min-h-6 min-w-6", + fill: "currentColor", + viewBox: "0 0 20 20", + xmlns: "http://www.w3.org/2000/svg", + children: /* @__PURE__ */ jsx4( + "path", + { + clipRule: "evenodd", + d: "M3 6a3 3 0 013-3h10a1 1 0 01.8 1.6L14.25 8l2.55 3.4A1 1 0 0116 13H6a1 1 0 00-1 1v3a1 1 0 11-2 0V6z", + fillRule: "evenodd" + } + ) + } + ) + } + ) }), + !open ? null : /* @__PURE__ */ jsx4("div", { className: "fixed z-10 inset-0 overflow-y-auto", children: /* @__PURE__ */ jsx4("div", { className: "flex items-end justify-flex-start mx-8 my-4 min-h-screen pt-4 px-4 pb-10 sm:block sm:p-0", children: /* @__PURE__ */ jsx4("div", { className: "relative inline-block align-bottom bg-white rounded-lg px-4 pt-5 pb-4 text-left overflow-hidden shadow-xl transform transition-all sm:my-8 sm:align-middle sm:p-6 lg:max-w-[80%] max-w-full", children: /* @__PURE__ */ jsx4("div", { children: /* @__PURE__ */ jsxs("div", { className: "mt-1 sm:mt-3", children: [ + /* @__PURE__ */ jsx4("h3", { className: "flex flex-row gap-4 flex-nowrap items-center space-between", children: /* @__PURE__ */ jsx4("div", { className: "grow text-lg leading-6 font-medium text-gray-900", children: "Feature Flag Overrides" }) }), + /* @__PURE__ */ jsx4("p", { className: "text-sm text-gray-500", children: "Features can be enabled or disabled unless they are forced upstream. You can also revert to default." }), + /* @__PURE__ */ jsx4("div", { className: "mt-6", children: /* @__PURE__ */ jsxs("fieldset", { className: "flex flex-col gap-9", children: [ + /* @__PURE__ */ jsx4("legend", { className: "sr-only", children: "Feature Flags" }), + featuresDescription.map((feature) => /* @__PURE__ */ jsx4(ToggleFeature, { feature }, feature.name)) + ] }) }), + /* @__PURE__ */ jsx4("div", { className: "flex justify-center items-center mt-5 sm:mt-6", children: /* @__PURE__ */ jsx4( + "button", + { + className: "inline-flex items-center text-sm font-medium pt-0 pb-0 pr-4 pl-4 h-8 leading-7 align-middle cursor-pointer rounded-sm bg-blue-600 text-white border border-transparent justify-center text-base font-medium focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-600 sm:text-sm", + onClick: () => setOpen(false), + type: "button", + children: "Done" + } + ) }) + ] }) }) }) }) }) + ] }); +} +export { + Disable, + Enable, + EnableContext, + Features, + ToggleFeatures, + useAllDisabled, + useAllEnabled, + useDisabled, + useEnabled +}; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map new file mode 100644 index 0000000..6d8122a --- /dev/null +++ b/dist/index.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/utils.ts","../src/EnableContext.tsx","../src/useAllDisabled.tsx","../src/useDisabled.tsx","../src/Disable.tsx","../src/useAllEnabled.tsx","../src/useEnabled.tsx","../src/Enable.tsx","../src/Features.tsx","../src/FeatureContext.tsx","../src/FeatureState.tsx","../src/FeaturesState.tsx","../src/useConsoleOverride.tsx","../src/GlobalEnable.tsx","../src/usePersist.tsx","../src/useTestCallback.tsx","../src/testFeature.tsx","../src/ToggleFeatures.tsx","../src/tailwind.css"],"sourcesContent":["import { useContext, useMemo } from 'react';\n\nimport { EnableContext, type EnableContextType } from './EnableContext';\n\n// Helper: get rid of some boilerplate.\n// just input mashing and sanitation, removing extra renders, and getting test function\nexport function useTestAndConvert(\n input?: string[] | string | null,\n): [EnableContextType, string[]] {\n const test = useContext(EnableContext);\n\n // We memoize just to prevent re-renders since this could be at the leaf of a tree\n const converted = useMemo(\n () => (input == null ? [] : Array.isArray(input) ? input : [input]),\n [input],\n );\n\n return [test, converted];\n}\n","import { createContext } from 'react';\n\nimport type { FeatureValue } from './FeatureState';\n\nexport type EnableContextType = (feature: string) => FeatureValue;\n\n/**\n * Contained function can check whether a given feature is enabled.\n */\nexport const EnableContext = createContext((_s) => false);\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are disabled\n */\nexport function useAllDisabled(withoutAll: string[] | string): boolean {\n const [test, queryAllWithout] = useTestAndConvert(withoutAll);\n return (\n withoutAll.length > 0 && queryAllWithout.every((x) => !(test(x) ?? false))\n );\n}\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is disabled\n */\nexport function useDisabled(without: string[] | string): boolean {\n const [test, queryAnyWithout] = useTestAndConvert(without);\n return queryAnyWithout.some((x) => !(test(x) ?? false));\n}\n","// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport type { EnableProps } from './Enable';\nimport { useAllDisabled } from './useAllDisabled';\nimport { useDisabled } from './useDisabled';\n\n/**\n * Feature will be disabled if any in the list are enabled\n */\nexport const Disable: React.FC = ({\n feature = [],\n allFeatures = [],\n children,\n}) => {\n const isAny = useDisabled(feature);\n const isAll = useAllDisabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n};\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff all specified features are enabled\n */\nexport function useAllEnabled(allFeatures: string[] | string): boolean {\n const [test, queryAllPresent] = useTestAndConvert(allFeatures);\n return queryAllPresent.length > 0 && queryAllPresent.every(test);\n}\n","import { useTestAndConvert } from './utils';\n\n/**\n * returns true iff any specified feature is enabled\n */\nexport function useEnabled(feature: string[] | string): boolean {\n const [test, queryAnyPresent] = useTestAndConvert(feature);\n return queryAnyPresent.some(test);\n}\n","// biome-ignore lint/style/useImportType: JSX requires React at runtime\nimport * as React from 'react';\n\nimport { useAllEnabled } from './useAllEnabled';\nimport { useEnabled } from './useEnabled';\n\nexport interface EnableProps {\n readonly feature?: string[] | string;\n readonly allFeatures?: string[];\n children: React.ReactNode;\n}\n\n/**\n * Feature will be enabled if any feature in the list are enabled,\n */\nexport function Enable({\n feature = [],\n allFeatures = [],\n children,\n}: EnableProps): JSX.Element | null {\n const isAny = useEnabled(feature);\n const isAll = useAllEnabled(allFeatures);\n\n if (isAny || isAll) {\n return <>{children};\n }\n\n return null;\n}\n","import { type ReactNode, useEffect, useMemo, useReducer, useRef } from 'react';\n\nimport { EnableContext } from './EnableContext';\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { featuresReducer, initialFeaturesState } from './FeaturesState';\nimport useConsoleOverride from './useConsoleOverride';\nimport usePersist, { KEY } from './usePersist';\nimport useTestCallback from './useTestCallback';\n\ninterface FeatureProps {\n readonly features: readonly FeatureDescription[];\n readonly children?: ReactNode;\n readonly disableConsole?: boolean;\n readonly storage?: Storage;\n}\n\n/**\n * A more batteries-enabled parent component that keeps track of feature state\n * internally, and creates window.feature.enable(\"f\") and window.feature.disable(\"f\").\n * Keeps track of overrides and defaults, with defaults potentially coming from your props\n * and overrides being persisted to your choice of storage layer.\n */\nexport function Features({\n children,\n features,\n disableConsole = false,\n storage = window.sessionStorage,\n}: FeatureProps): JSX.Element {\n // Capture only first value; we don't care about future updates\n const featuresRef = useRef(features);\n const [overridesState, overridesDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n const [defaultsState, defaultsDispatch] = useReducer(\n featuresReducer,\n initialFeaturesState,\n );\n\n useEffect(() => {\n /// Load defaults\n defaultsDispatch({ type: 'INIT', features });\n return () => {\n defaultsDispatch({ type: 'DE_INIT' });\n };\n }, [features]);\n\n useEffect(() => {\n let f: Record = {};\n if (storage != null) {\n try {\n const featuresJson = storage.getItem(KEY);\n if (featuresJson != null) {\n const fh = JSON.parse(featuresJson);\n f = fh.overrides;\n }\n } catch (e) {\n // Can't parse or get or otherwise; ignore\n console.error('error in localStorage', e);\n }\n }\n\n overridesDispatch({\n type: 'INIT',\n features: (featuresRef.current ?? [])\n .filter((x) => x.noOverride !== true)\n .map((x) => ({\n name: x.name,\n description: x.description,\n defaultValue: f?.[x.name] ?? undefined,\n })),\n });\n\n return () => {\n overridesDispatch({ type: 'DE_INIT' });\n };\n }, [storage]);\n\n // Handle async operations for features with onChangeDefault\n useEffect(() => {\n if (defaultsState.value !== 'ready') {\n return;\n }\n\n // Check for features in async states and handle them\n Object.entries(defaultsState.context.features).forEach(\n ([name, feature]) => {\n if (\n feature.value === 'asyncEnabled' ||\n feature.value === 'asyncDisabled' ||\n feature.value === 'asyncUnspecified'\n ) {\n const targetValue =\n feature.value === 'asyncEnabled'\n ? true\n : feature.value === 'asyncDisabled'\n ? false\n : undefined;\n\n const onChangeDefault = feature.featureDesc?.onChangeDefault;\n if (onChangeDefault != null && feature.featureDesc != null) {\n onChangeDefault(feature.featureDesc.name, targetValue)\n .then((result) => {\n defaultsDispatch({ type: 'ASYNC_DONE', name, value: result });\n })\n .catch(() => {\n defaultsDispatch({\n type: 'ASYNC_DONE',\n name,\n value: undefined,\n });\n });\n }\n }\n },\n );\n }, [defaultsState]);\n\n usePersist(storage, featuresRef.current, overridesState);\n\n const testCallback = useTestCallback(overridesState, defaultsState);\n useConsoleOverride(\n !disableConsole,\n featuresRef.current,\n testCallback,\n defaultsDispatch,\n );\n\n const featureValue = useMemo(\n () => ({\n overridesSend: overridesDispatch,\n defaultsSend: defaultsDispatch,\n featuresDescription: featuresRef.current,\n overridesState,\n defaultsState,\n test: testCallback,\n }),\n [overridesState, defaultsState, testCallback],\n );\n\n return (\n \n \n {children}\n \n \n );\n}\n","import { createContext } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch, FeaturesState } from './FeaturesState';\n\nexport const FeatureContext = createContext(null);\n\n/// Give access to the overrides layer\nexport interface FeatureContextType {\n // Make changes to the overrides\n overridesSend: FeaturesDispatch;\n\n // Make changes to defaults\n defaultsSend: FeaturesDispatch;\n\n featuresDescription: readonly FeatureDescription[];\n\n // State is in layers; overrides and defaults\n overridesState: FeaturesState;\n defaultsState: FeaturesState;\n\n /// Test with proper fallback and respecting the user's force preference\n test: (flag: string) => FeatureValue;\n}\n","import type { Dispatch } from 'react';\n\n/**\n * Feature is either on, off, or 'unset',\n * which means it will go to the default value or the less specific value.\n */\nexport type FeatureValue = false | true | undefined;\n\nexport type FeatureStateValue =\n | 'initial'\n | 'enabled'\n | 'disabled'\n | 'unspecified'\n | 'asyncEnabled'\n | 'asyncDisabled'\n | 'asyncUnspecified';\n\nexport interface FeatureState {\n value: FeatureStateValue;\n featureDesc?: FeatureDescription;\n}\n\nexport type FeatureDispatch = Dispatch;\n\n/// Given a featurestate, determine the value (on, off, or unset)\nexport function valueForState(\n featureState: FeatureState,\n): [FeatureValue, boolean] {\n return [\n featureState.value === 'enabled' || featureState.value === 'asyncEnabled'\n ? true\n : featureState.value === 'disabled' ||\n featureState.value === 'asyncDisabled'\n ? false\n : undefined,\n featureState.featureDesc?.force ?? false,\n ];\n}\n\n/**\n * Definition of a feature that can be enabled or disabled.\n * K is the type of the key that is used to identify the feature.\n */\nexport interface FeatureDescription {\n readonly name: K;\n readonly description?: string;\n\n /// If set, will be used to update the feature default state instead of simply overriding.\n /// For example, you might use this to update a feature flag on a backend server.\n /// when set, the feature will be updated on the backend server, and the result of the async\n /// will be used for the final state after the change. while changing, the feature will be\n /// in the 'changing' state. Also note that the feature will be changed at the \"default\" layer.\n readonly onChangeDefault?: (\n name: K,\n newValue: FeatureValue,\n ) => Promise;\n\n /// if set true, will force the field to what it is set here through layers of states.\n /// useful to invert the layers, similar to !important in CSS.\n readonly force?: boolean;\n\n /// If set to true, the feature will not be overridable by the user.\n readonly noOverride?: boolean;\n\n /// can be used to specify what should happen if the feature is not set to a particular value.\n readonly defaultValue?: FeatureValue;\n}\n\n/**\n * Actions that can be performed on a feature.\n */\nexport type FeatureAction =\n | { type: 'DISABLE' }\n | { type: 'ENABLE' }\n | { type: 'INIT'; feature: FeatureDescription }\n | { type: 'SET'; value: FeatureValue }\n | { type: 'TOGGLE' }\n | { type: 'UNSET' }\n | { type: 'ASYNC_DONE'; value: FeatureValue };\n\nexport const initialFeatureState: FeatureState = {\n value: 'initial',\n};\n\n/**\n * Reducer for managing individual feature state\n */\nexport function featureReducer(\n state: FeatureState,\n action: FeatureAction,\n): FeatureState {\n switch (action.type) {\n case 'INIT': {\n const { feature } = action;\n const value =\n feature.defaultValue === true\n ? 'enabled'\n : feature.defaultValue === false\n ? 'disabled'\n : 'unspecified';\n return {\n value: value as FeatureStateValue,\n featureDesc: feature,\n };\n }\n\n case 'ENABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'DISABLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'disabled' };\n }\n\n case 'TOGGLE': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncEnabled' };\n }\n return { ...state, value: 'enabled' };\n }\n\n case 'UNSET': {\n if (state.featureDesc?.onChangeDefault != null) {\n return { ...state, value: 'asyncUnspecified' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'SET': {\n const { value } = action;\n if (state.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n return { ...state, value: 'asyncEnabled' };\n }\n if (value === false) {\n return { ...state, value: 'asyncDisabled' };\n }\n return { ...state, value: 'asyncUnspecified' };\n }\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n case 'ASYNC_DONE': {\n const { value } = action;\n if (value === true) {\n return { ...state, value: 'enabled' };\n }\n if (value === false) {\n return { ...state, value: 'disabled' };\n }\n return { ...state, value: 'unspecified' };\n }\n\n default:\n return state;\n }\n}\n","import type { Dispatch } from 'react';\n\nimport {\n type FeatureDescription,\n type FeatureState,\n type FeatureValue,\n valueForState,\n} from './FeatureState';\n\nexport interface FeaturesContext {\n // features are layered:\n // - defaults: if nothing else matches, provided a value for feature\n // - browser: browser-local values for features (kept in local storage, etc)\n // - user: values from the user's profile, if any\n // - org: value from the org's profile, if any\n features: { [x: string]: FeatureState };\n}\n\nexport type FeaturesAction =\n | { type: 'DE_INIT' }\n | { type: 'DISABLE'; name: string }\n | { type: 'ENABLE'; name: string }\n | { type: 'INIT'; features: readonly FeatureDescription[] }\n | { type: 'SET_ALL'; features: { [key: string]: FeatureValue } }\n | { type: 'SET'; name: string; value: FeatureValue }\n | { type: 'TOGGLE'; name: string }\n | { type: 'UNSET'; name: string }\n | { type: 'ASYNC_DONE'; name: string; value: FeatureValue };\n\nexport interface FeaturesState {\n value: 'idle' | 'ready';\n context: FeaturesContext;\n}\n\nexport type FeaturesDispatch = Dispatch;\n\nexport function valueOfFeature(\n featuresState: FeaturesState,\n feature: string,\n): [FeatureValue, boolean] {\n if (featuresState.context.features[feature] == null) {\n return [undefined, false];\n }\n const featureState = featuresState.context.features[feature];\n if (featureState != null) {\n return valueForState(featureState);\n }\n return [undefined, false];\n}\n\nexport const initialFeaturesState: FeaturesState = {\n value: 'idle',\n context: {\n features: {},\n },\n};\n\n/**\n * Reducer for managing a collection of features\n */\nexport function featuresReducer(\n state: FeaturesState,\n action: FeaturesAction,\n): FeaturesState {\n switch (action.type) {\n case 'INIT': {\n if (!action.features || action.features.length === 0) {\n return state;\n }\n\n const features: { [x: string]: FeatureState } = {};\n for (const feature of action.features) {\n // Initialize each feature\n const featureState = {\n value:\n feature.defaultValue === true\n ? ('enabled' as const)\n : feature.defaultValue === false\n ? ('disabled' as const)\n : ('unspecified' as const),\n featureDesc: feature,\n };\n features[feature.name] = featureState;\n }\n\n return {\n value: 'ready',\n context: { features },\n };\n }\n\n case 'DE_INIT': {\n return initialFeaturesState;\n }\n\n case 'SET_ALL': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const features = { ...state.context.features };\n Object.keys(features).forEach((name) => {\n const value = action.features[name] ?? undefined;\n const currentFeature = features[name];\n\n if (currentFeature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'asyncEnabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'asyncDisabled' };\n } else {\n features[name] = { ...currentFeature, value: 'asyncUnspecified' };\n }\n } else {\n if (value === true) {\n features[name] = { ...currentFeature, value: 'enabled' };\n } else if (value === false) {\n features[name] = { ...currentFeature, value: 'disabled' };\n } else {\n features[name] = { ...currentFeature, value: 'unspecified' };\n }\n }\n });\n\n return {\n ...state,\n context: { features },\n };\n }\n\n case 'SET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n let newValue: FeatureState['value'];\n\n if (feature.featureDesc?.onChangeDefault != null) {\n if (value === true) {\n newValue = 'asyncEnabled';\n } else if (value === false) {\n newValue = 'asyncDisabled';\n } else {\n newValue = 'asyncUnspecified';\n }\n } else {\n if (value === true) {\n newValue = 'enabled';\n } else if (value === false) {\n newValue = 'disabled';\n } else {\n newValue = 'unspecified';\n }\n }\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'TOGGLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ENABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncEnabled'\n : 'enabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'DISABLE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncDisabled'\n : 'disabled';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'UNSET': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const newValue =\n feature.featureDesc?.onChangeDefault != null\n ? 'asyncUnspecified'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n case 'ASYNC_DONE': {\n if (state.value !== 'ready') {\n return state;\n }\n\n const feature = state.context.features[action.name];\n if (feature == null) {\n return state;\n }\n\n const { value } = action;\n const newValue =\n value === true\n ? 'enabled'\n : value === false\n ? 'disabled'\n : 'unspecified';\n\n return {\n ...state,\n context: {\n features: {\n ...state.context.features,\n [action.name]: { ...feature, value: newValue },\n },\n },\n };\n }\n\n default:\n return state;\n }\n}\n","import { useEffect } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\nimport { GlobalEnable } from './GlobalEnable';\n\nexport default function useConsoleOverride(\n consoleOverride: boolean,\n features: readonly FeatureDescription[],\n testFeature: (_: string) => FeatureValue,\n dispatch: FeaturesDispatch,\n): void {\n useEffect(() => {\n if (!consoleOverride) {\n // Clean up window.feature immediately if consoleOverride is disabled\n if (window.feature != null) {\n window.feature = undefined;\n }\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }\n window.feature = new GlobalEnable(dispatch, testFeature, features);\n return () => {\n if (window.feature != null) {\n window.feature = undefined;\n }\n };\n }, [features, dispatch, consoleOverride, testFeature]);\n}\n","import type { FeatureDescription, FeatureValue } from './FeatureState';\nimport type { FeaturesDispatch } from './FeaturesState';\n\nexport class GlobalEnable {\n private readonly featureDesc: readonly FeatureDescription[];\n private readonly dispatch: FeaturesDispatch;\n private readonly testFeature: (value: string) => FeatureValue;\n\n constructor(\n dispatch: FeaturesDispatch,\n testFeature: (_: string) => FeatureValue,\n featureDesc: readonly FeatureDescription[],\n ) {\n this.featureDesc = featureDesc;\n this.dispatch = dispatch;\n this.testFeature = testFeature;\n }\n\n public toggle(feature: string): void {\n this.dispatch({ type: 'TOGGLE', name: feature });\n }\n\n public enable(feature: string): void {\n this.dispatch({ type: 'ENABLE', name: feature });\n }\n\n public unset(feature: string): void {\n this.dispatch({ type: 'UNSET', name: feature });\n }\n\n public disable(feature: string): void {\n this.dispatch({ type: 'DISABLE', name: feature });\n }\n\n public setAll(features: { [key: string]: FeatureValue }): void {\n this.dispatch({ type: 'SET_ALL', features });\n }\n\n public listFeatures(): readonly [string, FeatureValue][] {\n return this.featureDesc.map((f) => [f.name, this.testFeature(f.name)]);\n }\n}\ndeclare global {\n interface Window {\n feature?: GlobalEnable;\n }\n}\n","import { useEffect, useMemo } from 'react';\nimport type { FeatureDescription, FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\nexport const KEY = 'react-enable:feature-values';\n\nexport default function usePersist(\n storage: Storage | undefined,\n features: readonly FeatureDescription[],\n overrideState: FeaturesState,\n): void {\n const overrides = useMemo(() => {\n const newOverrides: { [key: string]: FeatureValue } = {};\n if (overrideState.value === 'ready') {\n for (const feature of features) {\n const [value] = valueOfFeature(overrideState, feature.name);\n if (value != null) {\n newOverrides[feature.name] = value;\n }\n }\n }\n return newOverrides;\n }, [features, overrideState]);\n\n const strState =\n Object.keys(overrides).length === 0 || storage == null\n ? '{}'\n : JSON.stringify({ overrides });\n\n useEffect(() => {\n try {\n if (storage != null && overrideState.value === 'ready') {\n storage.setItem(KEY, strState);\n }\n } catch (e) {\n // Can't set for some reason\n }\n }, [overrideState, storage, strState]);\n}\n","import { useCallback } from 'react';\n\nimport type { FeaturesState } from './FeaturesState';\nimport testFeature from './testFeature';\n\n/// A callback that can be called to test if a feature is enabled or disabled\nexport default function useTestCallback(\n defaultsState: FeaturesState,\n overridesState: FeaturesState,\n): (feature: string) => boolean | undefined {\n return useCallback(\n (f: string) => testFeature(f, [defaultsState, overridesState]),\n [defaultsState, overridesState],\n );\n}\n","import type { FeatureValue } from './FeatureState';\nimport { type FeaturesState, valueOfFeature } from './FeaturesState';\n\n/** Determine if the feature is enabled in one of the state machines, in order\n *\n * @param state The current state of the machine\n * @param feature The feature to check\n */\n\nexport default function testFeature(\n feature: string,\n states: FeaturesState[],\n): FeatureValue {\n const values = states.map((state) => valueOfFeature(state, feature));\n\n // look for best forced option, in order\n for (const [featureValue, featureForced] of values) {\n if (featureValue != null && featureForced) {\n return featureValue;\n }\n }\n\n // look for best non-forced option, in order\n for (const [featureValue] of values) {\n if (featureValue != null) {\n return featureValue;\n }\n }\n\n // unset if nothing hit\n return undefined;\n}\n","import { RadioGroup } from '@headlessui/react';\nimport { type ReactNode, useCallback, useContext, useState } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { FeatureContext } from './FeatureContext';\nimport type { FeatureDescription } from './FeatureState';\nimport { valueOfFeature } from './FeaturesState';\n// @ts-expect-error bundler will take care of this\nimport styles from './tailwind.css';\n\nfunction classNames(...classes: string[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\nfunction ToggleFeature({\n feature,\n}: {\n feature: FeatureDescription;\n}): JSX.Element | null {\n const context = useContext(FeatureContext);\n const handleChangeSelection = useCallback(\n (value: 'false' | 'true' | 'unset') => {\n if (context?.overridesSend != null) {\n switch (value) {\n case 'true': {\n context.overridesSend({ type: 'ENABLE', name: feature.name });\n break;\n }\n case 'false': {\n context.overridesSend({ type: 'DISABLE', name: feature.name });\n break;\n }\n case 'unset': {\n context.overridesSend({ type: 'UNSET', name: feature.name });\n break;\n }\n }\n }\n },\n [feature.name, context],\n );\n\n if (context == null) {\n return null;\n }\n\n const { overridesState, test: testFeature, defaultsState } = context;\n\n const valueInDefaults = (\n valueOfFeature(defaultsState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const valueInOverrides = (\n valueOfFeature(overridesState, feature.name)[0] ?? 'unset'\n ).toString() as 'false' | 'true' | 'unset';\n\n const actualChecked = testFeature(feature.name);\n\n return (\n \n \n
\n \n Feature: {feature.name}\n \n {feature.noOverride === true ? (\n
\n \n \n \n
No Overrides
\n
\n ) : null}\n {actualChecked === true ? (\n
\n \n \n \n
{actualChecked ? 'Enabled' : 'Disabled'}
\n
\n ) : null}\n
\n {feature.description == null ? null : (\n

\n {feature.description}\n

\n )}\n
\n
\n {[\n {\n id: 'false',\n title: `Disable ${feature.name}`,\n description: 'Override the feature to be disabled',\n },\n {\n id: 'unset',\n title: 'Default',\n description: 'Inherit enabled state from defaults',\n disabled: (feature.noOverride ?? false) || feature.force,\n defaultValue:\n valueInDefaults === 'true' ? (\n
\n Enabled\n
\n ) : (\n
\n Disabled\n
\n ),\n },\n {\n id: 'true',\n title: `Enable ${feature.name}`,\n description: 'Override the feature to be enabled',\n },\n ].map((option) => (\n \n classNames(\n checked ? 'border-transparent' : 'border-gray-300',\n !disabled && active\n ? 'border-blue-500 ring-2 ring-blue-500'\n : '',\n disabled\n ? 'border-transparent ring-gray-500 cursor-not-allowed'\n : 'cursor-pointer',\n 'relative bg-white border rounded-lg shadow-sm p-3 flex focus:outline-none',\n )\n }\n disabled={option.disabled}\n key={option.id}\n value={option.id}\n >\n {({ checked, active, disabled }) => (\n <>\n
\n \n \n {option.title}\n \n {option.defaultValue != null ? option.defaultValue : null}\n \n \n \n \n \n {option.description}\n \n
\n \n \n )}\n \n ))}\n
\n \n );\n}\n\nfunction ShadowContent({\n root,\n children,\n}: {\n children: ReactNode;\n root: Element;\n}) {\n return ReactDOM.createPortal(children, root);\n}\n\n/// Permit users to override feature flags via a GUI.\n/// Renders a small floating button in lower left or right, pressing it brings up\n/// a list of features to toggle and their current override state. you can override on or override off,\n/// or unset the override and go back to default value.\n// eslint-disable-next-line no-undef\nexport function ToggleFeatures({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [root, setCoreRoot] = useState(null);\n\n const setRoot = (host: HTMLDivElement | null) => {\n if (host == null || root != null) {\n return;\n }\n const shadowRoot = host?.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n const renderDiv = document.createElement('div');\n style.textContent = styles;\n shadowRoot.appendChild(style);\n shadowRoot.appendChild(renderDiv);\n setCoreRoot(renderDiv);\n };\n\n if (hidden) {\n return null;\n }\n\n return (\n \n {root != null ? (\n \n \n \n ) : null}\n \n );\n}\n\n/// Like ToggleFeatures, but does not inject styles into a shadow DOM root node.\n/// useful if you're using tailwind.\nexport function ToggleFeatureUnwrapped({\n defaultOpen = false,\n hidden = false,\n}: {\n defaultOpen?: boolean;\n hidden?: boolean;\n}): JSX.Element | null {\n const [open, setOpen] = useState(defaultOpen);\n const context = useContext(FeatureContext);\n\n if (context == null) {\n return null;\n }\n\n if (hidden) {\n return null;\n }\n\n // We want: Real value after all nestings, value of the override. we toggle override\n const { featuresDescription } = context;\n\n if (featuresDescription.length === 0) {\n return null;\n }\n\n return (\n
\n
\n setOpen(true)}\n title=\"Toggle features\"\n type=\"button\"\n >\n \n \n \n \n
\n {!open ? null : (\n
\n
\n
\n
\n
\n

\n
\n Feature Flag Overrides\n
\n

\n

\n Features can be enabled or disabled unless they are forced\n upstream. You can also revert to default.\n

\n
\n
\n Feature Flags\n {featuresDescription.map((feature) => (\n \n ))}\n
\n
\n
\n setOpen(false)}\n type=\"button\"\n >\n Done\n \n
\n
\n
\n
\n
\n
\n )}\n
\n );\n}\n","*, ::before, ::after {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::-ms-backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n::backdrop {\n --tw-border-spacing-x: 0;\n --tw-border-spacing-y: 0;\n --tw-translate-x: 0;\n --tw-translate-y: 0;\n --tw-rotate: 0;\n --tw-skew-x: 0;\n --tw-skew-y: 0;\n --tw-scale-x: 1;\n --tw-scale-y: 1;\n --tw-pan-x: ;\n --tw-pan-y: ;\n --tw-pinch-zoom: ;\n --tw-scroll-snap-strictness: proximity;\n --tw-gradient-from-position: ;\n --tw-gradient-via-position: ;\n --tw-gradient-to-position: ;\n --tw-ordinal: ;\n --tw-slashed-zero: ;\n --tw-numeric-figure: ;\n --tw-numeric-spacing: ;\n --tw-numeric-fraction: ;\n --tw-ring-inset: ;\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: rgba(59, 130, 246, 0.5);\n --tw-ring-offset-shadow: 0 0 rgba(0,0,0,0);\n --tw-ring-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow: 0 0 rgba(0,0,0,0);\n --tw-shadow-colored: 0 0 rgba(0,0,0,0);\n --tw-blur: ;\n --tw-brightness: ;\n --tw-contrast: ;\n --tw-grayscale: ;\n --tw-hue-rotate: ;\n --tw-invert: ;\n --tw-saturate: ;\n --tw-sepia: ;\n --tw-drop-shadow: ;\n --tw-backdrop-blur: ;\n --tw-backdrop-brightness: ;\n --tw-backdrop-contrast: ;\n --tw-backdrop-grayscale: ;\n --tw-backdrop-hue-rotate: ;\n --tw-backdrop-invert: ;\n --tw-backdrop-opacity: ;\n --tw-backdrop-saturate: ;\n --tw-backdrop-sepia: ;\n --tw-contain-size: ;\n --tw-contain-layout: ;\n --tw-contain-paint: ;\n --tw-contain-style: ;\n}\n\n/*\n! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com\n*/\n\n/*\n1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)\n2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)\n*/\n\n*,\n::before,\n::after {\n -webkit-box-sizing: border-box;\n box-sizing: border-box;\n /* 1 */\n border-width: 0;\n /* 2 */\n border-style: solid;\n /* 2 */\n border-color: #e5e7eb;\n /* 2 */\n}\n\n::before,\n::after {\n --tw-content: '';\n}\n\n/*\n1. Use a consistent sensible line-height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n3. Use a more readable tab size.\n4. Use the user's configured `sans` font-family by default.\n5. Use the user's configured `sans` font-feature-settings by default.\n6. Use the user's configured `sans` font-variation-settings by default.\n7. Disable tap highlights on iOS\n*/\n\nhtml,\n:host {\n line-height: 1.5;\n /* 1 */\n -webkit-text-size-adjust: 100%;\n /* 2 */\n -moz-tab-size: 4;\n /* 3 */\n -o-tab-size: 4;\n tab-size: 4;\n /* 3 */\n font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n /* 4 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 5 */\n font-variation-settings: normal;\n /* 6 */\n -webkit-tap-highlight-color: transparent;\n /* 7 */\n}\n\n/*\n1. Remove the margin in all browsers.\n2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.\n*/\n\nbody {\n margin: 0;\n /* 1 */\n line-height: inherit;\n /* 2 */\n}\n\n/*\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n3. Ensure horizontal rules are visible by default.\n*/\n\nhr {\n height: 0;\n /* 1 */\n color: inherit;\n /* 2 */\n border-top-width: 1px;\n /* 3 */\n}\n\n/*\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr:where([title]) {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline;\n -webkit-text-decoration: underline dotted currentColor;\n text-decoration: underline dotted currentColor;\n}\n\n/*\nRemove the default font size and weight for headings.\n*/\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/*\nReset links to optimize for opt-in styling instead of opt-out.\n*/\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/*\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/*\n1. Use the user's configured `mono` font-family by default.\n2. Use the user's configured `mono` font-feature-settings by default.\n3. Use the user's configured `mono` font-variation-settings by default.\n4. Correct the odd `em` font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n /* 1 */\n -webkit-font-feature-settings: normal;\n font-feature-settings: normal;\n /* 2 */\n font-variation-settings: normal;\n /* 3 */\n font-size: 1em;\n /* 4 */\n}\n\n/*\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/*\nPrevent `sub` and `sup` elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n3. Remove gaps between table borders by default.\n*/\n\ntable {\n text-indent: 0;\n /* 1 */\n border-color: inherit;\n /* 2 */\n border-collapse: collapse;\n /* 3 */\n}\n\n/*\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n3. Remove default padding in all browsers.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit;\n /* 1 */\n -webkit-font-feature-settings: inherit;\n font-feature-settings: inherit;\n /* 1 */\n font-variation-settings: inherit;\n /* 1 */\n font-size: 100%;\n /* 1 */\n font-weight: inherit;\n /* 1 */\n line-height: inherit;\n /* 1 */\n letter-spacing: inherit;\n /* 1 */\n color: inherit;\n /* 1 */\n margin: 0;\n /* 2 */\n padding: 0;\n /* 3 */\n}\n\n/*\nRemove the inheritance of text transform in Edge and Firefox.\n*/\n\nbutton,\nselect {\n text-transform: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Remove default button styles.\n*/\n\nbutton,\ninput:where([type='button']),\ninput:where([type='reset']),\ninput:where([type='submit']) {\n -webkit-appearance: button;\n /* 1 */\n background-color: transparent;\n /* 2 */\n background-image: none;\n /* 2 */\n}\n\n/*\nUse the modern Firefox focus style for all focusable elements.\n*/\n\n:-moz-focusring {\n outline: auto;\n}\n\n/*\nRemove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/*\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/*\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/*\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield;\n /* 1 */\n outline-offset: -2px;\n /* 2 */\n}\n\n/*\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/*\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to `inherit` in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button;\n /* 1 */\n font: inherit;\n /* 2 */\n}\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n\n/*\nRemoves the default spacing and border for appropriate elements.\n*/\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nlegend {\n padding: 0;\n}\n\nol,\nul,\nmenu {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/*\nReset default styling for dialogs.\n*/\n\ndialog {\n padding: 0;\n}\n\n/*\nPrevent resizing textareas horizontally by default.\n*/\n\ntextarea {\n resize: vertical;\n}\n\n/*\n1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)\n2. Set the default placeholder color to the user's configured gray 400 color.\n*/\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n /* 1 */\n color: #9ca3af;\n /* 2 */\n}\n\n/*\nSet the default cursor for buttons.\n*/\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/*\nMake sure disabled buttons don't get the pointer cursor.\n*/\n\n:disabled {\n cursor: default;\n}\n\n/*\n1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)\n2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)\n This can trigger a poorly considered lint error in some tools but is included by design.\n*/\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n /* 1 */\n vertical-align: middle;\n /* 2 */\n}\n\n/*\nConstrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)\n*/\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/* Make elements with the HTML hidden attribute stay hidden by default */\n\n[hidden]:where(:not([hidden=\"until-found\"])) {\n display: none;\n}\n\n[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n border-radius: 0px;\n padding-top: 0.5rem;\n padding-right: 0.75rem;\n padding-bottom: 0.5rem;\n padding-left: 0.75rem;\n font-size: 1rem;\n line-height: 1.5rem;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 0px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n border-color: #2563eb;\n}\n\ninput::-moz-placeholder, textarea::-moz-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-webkit-input-placeholder, textarea::-webkit-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput:-ms-input-placeholder, textarea:-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::-ms-input-placeholder, textarea::-ms-input-placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\ninput::placeholder,textarea::placeholder {\n color: #6b7280;\n opacity: 1;\n}\n\n::-webkit-datetime-edit-fields-wrapper {\n padding: 0;\n}\n\n::-webkit-date-and-time-value {\n min-height: 1.5em;\n text-align: inherit;\n}\n\n::-webkit-datetime-edit {\n display: -webkit-inline-box;\n display: inline-flex;\n}\n\n::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field {\n padding-top: 0;\n padding-bottom: 0;\n}\n\nselect {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\");\n background-position: right 0.5rem center;\n background-repeat: no-repeat;\n background-size: 1.5em 1.5em;\n padding-right: 2.5rem;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n}\n\n[multiple],[size]:where(select:not([size=\"1\"])) {\n background-image: none;\n background-image: initial;\n background-position: 0 0;\n background-position: initial;\n background-repeat: repeat;\n background-repeat: initial;\n background-size: auto auto;\n background-size: initial;\n padding-right: 0.75rem;\n -webkit-print-color-adjust: unset;\n print-color-adjust: inherit;\n}\n\n[type='checkbox'],[type='radio'] {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n padding: 0;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n display: inline-block;\n vertical-align: middle;\n background-origin: border-box;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n height: 1rem;\n width: 1rem;\n color: #2563eb;\n background-color: #fff;\n border-color: #6b7280;\n border-width: 1px;\n --tw-shadow: 0 0 rgba(0,0,0,0);\n}\n\n[type='checkbox'] {\n border-radius: 0px;\n}\n\n[type='radio'] {\n border-radius: 100%;\n}\n\n[type='checkbox']:focus,[type='radio']:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/);\n --tw-ring-offset-width: 2px;\n --tw-ring-offset-color: #fff;\n --tw-ring-color: #2563eb;\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);\n}\n\n[type='checkbox']:checked,[type='radio']:checked {\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n[type='checkbox']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='radio']:checked {\n background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\");\n}\n\n@media (forced-colors: active) {\n [type='radio']:checked {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='checkbox']:indeterminate {\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e\");\n border-color: transparent;\n background-color: currentColor;\n background-size: 100% 100%;\n background-position: center;\n background-repeat: no-repeat;\n}\n\n@media (forced-colors: active) {\n [type='checkbox']:indeterminate {\n -webkit-appearance: auto;\n -moz-appearance: auto;\n appearance: auto;\n }\n}\n\n[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus {\n border-color: transparent;\n background-color: currentColor;\n}\n\n[type='file'] {\n background: transparent none repeat 0 0 / auto auto padding-box border-box scroll;\n background: initial;\n border-color: inherit;\n border-width: 0;\n border-radius: 0;\n padding: 0;\n font-size: inherit;\n line-height: inherit;\n}\n\n[type='file']:focus {\n outline: 1px solid ButtonText;\n outline: 1px auto -webkit-focus-ring-color;\n}\n\n.container {\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .container {\n max-width: 640px;\n }\n}\n\n@media (min-width: 768px) {\n .container {\n max-width: 768px;\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n max-width: 1024px;\n }\n}\n\n@media (min-width: 1280px) {\n .container {\n max-width: 1280px;\n }\n}\n\n@media (min-width: 1536px) {\n .container {\n max-width: 1536px;\n }\n}\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n.pointer-events-none {\n pointer-events: none;\n}\n\n.invisible {\n visibility: hidden;\n}\n\n.fixed {\n position: fixed;\n}\n\n.absolute {\n position: absolute;\n}\n\n.relative {\n position: relative;\n}\n\n.-inset-px {\n top: -1px;\n right: -1px;\n bottom: -1px;\n left: -1px;\n}\n\n.inset-0 {\n top: 0px;\n right: 0px;\n bottom: 0px;\n left: 0px;\n}\n\n.bottom-0 {\n bottom: 0px;\n}\n\n.left-0 {\n left: 0px;\n}\n\n.z-10 {\n z-index: 10;\n}\n\n.mx-4 {\n margin-left: 1rem;\n margin-right: 1rem;\n}\n\n.mx-8 {\n margin-left: 2rem;\n margin-right: 2rem;\n}\n\n.my-4 {\n margin-top: 1rem;\n margin-bottom: 1rem;\n}\n\n.mt-1 {\n margin-top: 0.25rem;\n}\n\n.mt-4 {\n margin-top: 1rem;\n}\n\n.mt-5 {\n margin-top: 1.25rem;\n}\n\n.mt-6 {\n margin-top: 1.5rem;\n}\n\n.inline-block {\n display: inline-block;\n}\n\n.flex {\n display: -webkit-box;\n display: -ms-flexbox;\n display: flex;\n}\n\n.inline-flex {\n display: -webkit-inline-box;\n display: -ms-inline-flexbox;\n display: inline-flex;\n}\n\n.grid {\n display: grid;\n}\n\n.hidden {\n display: none;\n}\n\n.h-4 {\n height: 1rem;\n}\n\n.h-5 {\n height: 1.25rem;\n}\n\n.h-6 {\n height: 1.5rem;\n}\n\n.h-7 {\n height: 1.75rem;\n}\n\n.h-8 {\n height: 2rem;\n}\n\n.min-h-6 {\n min-height: 1.5rem;\n}\n\n.min-h-screen {\n min-height: 100vh;\n}\n\n.w-4 {\n width: 1rem;\n}\n\n.w-5 {\n width: 1.25rem;\n}\n\n.w-6 {\n width: 1.5rem;\n}\n\n.w-8 {\n width: 2rem;\n}\n\n.min-w-4 {\n min-width: 1rem;\n}\n\n.min-w-6 {\n min-width: 1.5rem;\n}\n\n.max-w-full {\n max-width: 100%;\n}\n\n.shrink {\n -ms-flex-negative: 1;\n flex-shrink: 1;\n}\n\n.grow {\n -webkit-box-flex: 1;\n -ms-flex-positive: 1;\n flex-grow: 1;\n}\n\n.transform {\n -webkit-transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));\n}\n\n.cursor-not-allowed {\n cursor: not-allowed;\n}\n\n.cursor-pointer {\n cursor: pointer;\n}\n\n.grid-cols-1 {\n grid-template-columns: repeat(1, minmax(0, 1fr));\n}\n\n.flex-row {\n -webkit-box-orient: horizontal;\n -webkit-box-direction: normal;\n -ms-flex-direction: row;\n flex-direction: row;\n}\n\n.flex-col {\n -webkit-box-orient: vertical;\n -webkit-box-direction: normal;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n\n.flex-nowrap {\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.items-end {\n -webkit-box-align: end;\n -ms-flex-align: end;\n align-items: flex-end;\n}\n\n.items-center {\n -webkit-box-align: center;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.justify-center {\n -webkit-box-pack: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.gap-1 {\n gap: 0.25rem;\n}\n\n.gap-2 {\n gap: 0.5rem;\n}\n\n.gap-4 {\n gap: 1rem;\n}\n\n.gap-9 {\n gap: 2.25rem;\n}\n\n.gap-y-6 {\n row-gap: 1.5rem;\n}\n\n.overflow-hidden {\n overflow: hidden;\n}\n\n.overflow-y-auto {\n overflow-y: auto;\n}\n\n.rounded-full {\n border-radius: 9999px;\n}\n\n.rounded-lg {\n border-radius: 0.5rem;\n}\n\n.rounded-sm {\n border-radius: 0.125rem;\n}\n\n.border {\n border-width: 1px;\n}\n\n.border-2 {\n border-width: 2px;\n}\n\n.border-blue-500 {\n --tw-border-opacity: 1;\n border-color: rgba(59, 130, 246, 1);\n border-color: rgba(59, 130, 246, var(--tw-border-opacity, 1));\n}\n\n.border-gray-300 {\n --tw-border-opacity: 1;\n border-color: rgba(209, 213, 219, 1);\n border-color: rgba(209, 213, 219, var(--tw-border-opacity, 1));\n}\n\n.border-gray-500 {\n --tw-border-opacity: 1;\n border-color: rgba(107, 114, 128, 1);\n border-color: rgba(107, 114, 128, var(--tw-border-opacity, 1));\n}\n\n.border-green-500 {\n --tw-border-opacity: 1;\n border-color: rgba(34, 197, 94, 1);\n border-color: rgba(34, 197, 94, var(--tw-border-opacity, 1));\n}\n\n.border-orange-500 {\n --tw-border-opacity: 1;\n border-color: rgba(249, 115, 22, 1);\n border-color: rgba(249, 115, 22, var(--tw-border-opacity, 1));\n}\n\n.border-red-500 {\n --tw-border-opacity: 1;\n border-color: rgba(239, 68, 68, 1);\n border-color: rgba(239, 68, 68, var(--tw-border-opacity, 1));\n}\n\n.border-transparent {\n border-color: transparent;\n}\n\n.bg-blue-600 {\n --tw-bg-opacity: 1;\n background-color: rgba(37, 99, 235, 1);\n background-color: rgba(37, 99, 235, var(--tw-bg-opacity, 1));\n}\n\n.bg-white {\n --tw-bg-opacity: 1;\n background-color: rgba(255, 255, 255, 1);\n background-color: rgba(255, 255, 255, var(--tw-bg-opacity, 1));\n}\n\n.p-1 {\n padding: 0.25rem;\n}\n\n.p-3 {\n padding: 0.75rem;\n}\n\n.px-2 {\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n}\n\n.px-4 {\n padding-left: 1rem;\n padding-right: 1rem;\n}\n\n.py-1 {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n}\n\n.pb-0 {\n padding-bottom: 0px;\n}\n\n.pb-10 {\n padding-bottom: 2.5rem;\n}\n\n.pb-4 {\n padding-bottom: 1rem;\n}\n\n.pl-4 {\n padding-left: 1rem;\n}\n\n.pr-4 {\n padding-right: 1rem;\n}\n\n.pt-0 {\n padding-top: 0px;\n}\n\n.pt-4 {\n padding-top: 1rem;\n}\n\n.pt-5 {\n padding-top: 1.25rem;\n}\n\n.text-left {\n text-align: left;\n}\n\n.align-middle {\n vertical-align: middle;\n}\n\n.align-bottom {\n vertical-align: bottom;\n}\n\n.text-base {\n font-size: 1rem;\n line-height: 1.5rem;\n}\n\n.text-lg {\n font-size: 1.125rem;\n line-height: 1.75rem;\n}\n\n.text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n}\n\n.text-xs {\n font-size: 0.75rem;\n line-height: 1rem;\n}\n\n.font-medium {\n font-weight: 500;\n}\n\n.leading-6 {\n line-height: 1.5rem;\n}\n\n.leading-7 {\n line-height: 1.75rem;\n}\n\n.text-blue-500 {\n --tw-text-opacity: 1;\n color: rgba(59, 130, 246, 1);\n color: rgba(59, 130, 246, var(--tw-text-opacity, 1));\n}\n\n.text-gray-500 {\n --tw-text-opacity: 1;\n color: rgba(107, 114, 128, 1);\n color: rgba(107, 114, 128, var(--tw-text-opacity, 1));\n}\n\n.text-gray-900 {\n --tw-text-opacity: 1;\n color: rgba(17, 24, 39, 1);\n color: rgba(17, 24, 39, var(--tw-text-opacity, 1));\n}\n\n.text-green-500 {\n --tw-text-opacity: 1;\n color: rgba(34, 197, 94, 1);\n color: rgba(34, 197, 94, var(--tw-text-opacity, 1));\n}\n\n.text-orange-500 {\n --tw-text-opacity: 1;\n color: rgba(249, 115, 22, 1);\n color: rgba(249, 115, 22, var(--tw-text-opacity, 1));\n}\n\n.text-red-500 {\n --tw-text-opacity: 1;\n color: rgba(239, 68, 68, 1);\n color: rgba(239, 68, 68, var(--tw-text-opacity, 1));\n}\n\n.text-white {\n --tw-text-opacity: 1;\n color: rgba(255, 255, 255, 1);\n color: rgba(255, 255, 255, var(--tw-text-opacity, 1));\n}\n\n.shadow {\n --tw-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-sm {\n --tw-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.shadow-xl {\n --tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);\n --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);\n -webkit-box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n box-shadow: 0 0 rgba(0,0,0,0), 0 0 rgba(0,0,0,0), var(--tw-shadow);\n -webkit-box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n box-shadow: var(--tw-ring-offset-shadow, 0 0 rgba(0,0,0,0)), var(--tw-ring-shadow, 0 0 rgba(0,0,0,0)), var(--tw-shadow);\n}\n\n.ring-2 {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.ring-blue-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(59, 130, 246, var(--tw-ring-opacity, 1));\n}\n\n.ring-gray-500 {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(107, 114, 128, var(--tw-ring-opacity, 1));\n}\n\n.invert {\n --tw-invert: invert(100%);\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.filter {\n -webkit-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);\n}\n\n.transition-all {\n -webkit-transition-property: all;\n transition-property: all;\n -webkit-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n -webkit-transition-duration: 150ms;\n transition-duration: 150ms;\n}\n\n.focus\\:outline-none:focus {\n outline: 2px solid transparent;\n outline-offset: 2px;\n}\n\n.focus\\:ring-2:focus {\n --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);\n --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), 0 0 rgba(0,0,0,0);\n -webkit-box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 rgba(0,0,0,0));\n}\n\n.focus\\:ring-blue-600:focus {\n --tw-ring-opacity: 1;\n --tw-ring-color: rgba(37, 99, 235, var(--tw-ring-opacity, 1));\n}\n\n.focus\\:ring-offset-2:focus {\n --tw-ring-offset-width: 2px;\n}\n\n@media (min-width: 640px) {\n .sm\\:my-8 {\n margin-top: 2rem;\n margin-bottom: 2rem;\n }\n\n .sm\\:mt-3 {\n margin-top: 0.75rem;\n }\n\n .sm\\:mt-6 {\n margin-top: 1.5rem;\n }\n\n .sm\\:block {\n display: block;\n }\n\n .sm\\:grid-cols-3 {\n grid-template-columns: repeat(3, minmax(0, 1fr));\n }\n\n .sm\\:gap-x-4 {\n -moz-column-gap: 1rem;\n -webkit-column-gap: 1rem;\n column-gap: 1rem;\n }\n\n .sm\\:p-0 {\n padding: 0px;\n }\n\n .sm\\:p-6 {\n padding: 1.5rem;\n }\n\n .sm\\:align-middle {\n vertical-align: middle;\n }\n\n .sm\\:text-sm {\n font-size: 0.875rem;\n line-height: 1.25rem;\n }\n}\n\n@media (min-width: 1024px) {\n .lg\\:max-w-\\[80\\%\\] {\n max-width: 80%;\n }\n\n .lg\\:gap-4 {\n gap: 1rem;\n }\n}\n"],"mappings":"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","names":["Fragment","jsx","useEffect","useMemo","createContext","testFeature","testFeature","useEffect","useMemo","useMemo","useEffect","jsx","useEffect","useMemo","useCallback","useContext","Fragment","jsx","useContext","useCallback","testFeature"]} \ No newline at end of file diff --git a/dist/setupTests.d.ts b/dist/setupTests.d.ts deleted file mode 100644 index 7b0828b..0000000 --- a/dist/setupTests.d.ts +++ /dev/null @@ -1 +0,0 @@ -import '@testing-library/jest-dom'; diff --git a/dist/testFeature.d.ts b/dist/testFeature.d.ts deleted file mode 100644 index f2256d2..0000000 --- a/dist/testFeature.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { FeatureValue } from './FeatureState'; -import { type FeaturesState } from './FeaturesState'; -export default function testFeature(feature: string, states: FeaturesState[]): FeatureValue; diff --git a/dist/useAllDisabled.d.ts b/dist/useAllDisabled.d.ts deleted file mode 100644 index 7e05abb..0000000 --- a/dist/useAllDisabled.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function useAllDisabled(withoutAll: string[] | string): boolean; diff --git a/dist/useAllEnabled.d.ts b/dist/useAllEnabled.d.ts deleted file mode 100644 index 5f0968d..0000000 --- a/dist/useAllEnabled.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function useAllEnabled(allFeatures: string[] | string): boolean; diff --git a/dist/useConsoleOverride.d.ts b/dist/useConsoleOverride.d.ts deleted file mode 100644 index 908e966..0000000 --- a/dist/useConsoleOverride.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { FeatureDescription, FeatureValue } from './FeatureState'; -import type { FeaturesDispatch } from './FeaturesState'; -export default function useConsoleOverride(consoleOverride: boolean, features: readonly FeatureDescription[], testFeature: (_: string) => FeatureValue, dispatch: FeaturesDispatch): void; diff --git a/dist/useDisabled.d.ts b/dist/useDisabled.d.ts deleted file mode 100644 index b90183a..0000000 --- a/dist/useDisabled.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function useDisabled(without: string[] | string): boolean; diff --git a/dist/useEnabled.d.ts b/dist/useEnabled.d.ts deleted file mode 100644 index c1b5ee8..0000000 --- a/dist/useEnabled.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function useEnabled(feature: string[] | string): boolean; diff --git a/dist/usePersist.d.ts b/dist/usePersist.d.ts deleted file mode 100644 index b17e328..0000000 --- a/dist/usePersist.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import type { FeatureDescription } from './FeatureState'; -import { type FeaturesState } from './FeaturesState'; -export declare const KEY = "react-enable:feature-values"; -export default function usePersist(storage: Storage | undefined, features: readonly FeatureDescription[], overrideState: FeaturesState): void; diff --git a/dist/useTestCallback.d.ts b/dist/useTestCallback.d.ts deleted file mode 100644 index 3a16f36..0000000 --- a/dist/useTestCallback.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import type { FeaturesState } from './FeaturesState'; -export default function useTestCallback(defaultsState: FeaturesState, overridesState: FeaturesState): (feature: string) => boolean | undefined; diff --git a/dist/utils.d.ts b/dist/utils.d.ts deleted file mode 100644 index c9cff30..0000000 --- a/dist/utils.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { type EnableContextType } from './EnableContext'; -export declare function useTestAndConvert(input?: string[] | string | null): [EnableContextType, string[]]; diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 577220f..0000000 --- a/jest.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'jsdom', - roots: ['/src'], - setupFilesAfterEnv: ['/src/setupTests.ts'], - moduleNameMapper: { - '^@src/(.$)$': '/src/$1', - '\\.(css)$': 'identity-obj-proxy', - }, -}; diff --git a/package-lock.json b/package-lock.json index a5b4fe4..55ab871 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,38 +10,41 @@ "license": "ISC", "dependencies": { "@headlessui/react": "^1.5.0", - "tslib": "^1.14.1" + "tslib": "^2.8.1" }, "devDependencies": { + "@arethetypeswrong/cli": "^0.15.0", "@biomejs/biome": "^1.9.4", "@tailwindcss/forms": "^0.5.0", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.0", - "@types/jest": "^26", - "@types/react": "^17", - "@types/react-dom": "^18.0.0", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", "@types/tailwindcss": "^3.0.10", + "@vitejs/plugin-react": "^5.0.4", + "@vitest/coverage-v8": "^2.1.9", + "@vitest/ui": "^2.1.8", "concurrently": "^7.1.0", - "esbuild": "^0.14.36", - "esbuild-node-externals": "^1.4.1", "identity-obj-proxy": "^3.0.0", - "jest": "^26", + "jsdom": "^25.0.1", "postcss": "^8.4.12", "postcss-import": "^14.1.0", "postcss-nested": "^5.0.6", "postcss-preset-env": "^7.4.3", "postcss-reporter": "^7.0.5", "postcss-url": "^10.1.3", + "publint": "^0.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-hooks": "^1.0.1", - "rimraf": "^3.0.2", "tailwindcss": "^3.0.24", - "ts-jest": "^26", - "typescript": "^4.6.3" + "tsup": "^8.3.5", + "typescript": "^5.6.3", + "vitest": "^2.1.8" }, "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" } }, "node_modules/@adobe/css-tools": { @@ -51,18 +54,114 @@ "dev": true, "license": "MIT" }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", - "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", + "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/trace-mapping": "^0.3.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, + "node_modules/@andrewbranch/untar.js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@andrewbranch/untar.js/-/untar.js-1.0.3.tgz", + "integrity": "sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==", + "dev": true + }, + "node_modules/@arethetypeswrong/cli": { + "version": "0.15.4", + "resolved": "https://registry.npmjs.org/@arethetypeswrong/cli/-/cli-0.15.4.tgz", + "integrity": "sha512-YDbImAi1MGkouT7f2yAECpUMFhhA1J0EaXzIqoC5GGtK0xDgauLtcsZezm8tNq7d3wOFXH7OnY+IORYcG212rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@arethetypeswrong/core": "0.15.1", + "chalk": "^4.1.2", + "cli-table3": "^0.6.3", + "commander": "^10.0.1", + "marked": "^9.1.2", + "marked-terminal": "^7.1.0", + "semver": "^7.5.4" + }, + "bin": { + "attw": "dist/index.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@arethetypeswrong/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@arethetypeswrong/core/-/core-0.15.1.tgz", + "integrity": "sha512-FYp6GBAgsNz81BkfItRz8RLZO03w5+BaeiPma1uCfmxTnxbtuMrI/dbzGiOk8VghO108uFI0oJo0OkewdSHw7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@andrewbranch/untar.js": "^1.0.3", + "fflate": "^0.8.2", + "semver": "^7.5.4", + "ts-expose-internals-conditionally": "1.0.0-empty.0", + "typescript": "5.3.3", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@arethetypeswrong/core/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -79,35 +178,37 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", - "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", - "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.9", - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.9", - "@babel/parser": "^7.17.9", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0", - "convert-source-map": "^1.7.0", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -118,10 +219,11 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" } @@ -144,44 +246,32 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", - "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -193,65 +283,43 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.16.7" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", - "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.17.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" }, "engines": { "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", - "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.17.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -277,23 +345,24 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", - "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.9", - "@babel/types": "^7.17.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -315,145 +384,30 @@ "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, - "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, - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "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, - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.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, - "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, - "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, - "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, - "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==", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.27.1" }, - "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, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "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==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -463,13 +417,11 @@ } }, "node_modules/@babel/runtime": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", - "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.4" - }, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -526,7 +478,8 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@biomejs/biome": { "version": "1.9.4", @@ -692,77 +645,159 @@ "node": ">=14.21.3" } }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, + "license": "MIT", + "optional": true, "engines": { - "node": ">=0.1.95" + "node": ">=0.1.90" } }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz", - "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==", + "node_modules/@csstools/color-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz", - "integrity": "sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q==", + "node_modules/@csstools/css-color-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@csstools/color-helpers": "^5.1.0", + "@csstools/css-calc": "^2.1.4" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.3" + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz", - "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "dev": true, + "license": "CC0-1.0", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz", - "integrity": "sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA==", + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -770,17 +805,22 @@ "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz", - "integrity": "sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA==", + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" @@ -790,29 +830,35 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz", - "integrity": "sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ==", + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz", - "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==", + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -825,2889 +871,1960 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "postcss-value-parser": "^4.2.0" + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@headlessui/react": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.5.0.tgz", - "integrity": "sha512-aaRnYxBb3MU2FNJf3Ut9RMTUqqU3as0aI1lQhgo2n9Fa67wRu14iOGqx93xB+uMNVfNwZ5B3y/Ndm7qZGuFeMQ==", - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" + "postcss": "^8.2" } }, - "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==", + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", "dev": true, + "license": "CC0-1.0", "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" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "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==", + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "sprintf-js": "~1.0.2" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.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==", + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "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==", + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "postcss-value-parser": "^4.2.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" } }, - "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==", + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "p-locate": "^4.1.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "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==", + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "p-try": "^2.0.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=6" + "node": "^12 || ^14 || >=16" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "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==", + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "p-limit": "^2.2.0" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=8" + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", "dev": true, + "license": "CC0-1.0", "engines": { - "node": ">=6" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" } }, - "node_modules/@istanbuljs/load-nyc-config/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==", + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, + "license": "CC0-1.0", "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" } }, - "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==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.11.tgz", + "integrity": "sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/android-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.11.tgz", + "integrity": "sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/@jest/console": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-26.6.2.tgz", - "integrity": "sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==", + "node_modules/@esbuild/android-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.11.tgz", + "integrity": "sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^26.6.2", - "jest-util": "^26.6.2", - "slash": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/core": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-26.6.3.tgz", - "integrity": "sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==", + "node_modules/@esbuild/android-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.11.tgz", + "integrity": "sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/reporters": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-changed-files": "^26.6.2", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-resolve-dependencies": "^26.6.3", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "jest-watcher": "^26.6.2", - "micromatch": "^4.0.2", - "p-each-series": "^2.1.0", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/environment": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-26.6.2.tgz", - "integrity": "sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.11.tgz", + "integrity": "sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/fake-timers": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-26.6.2.tgz", - "integrity": "sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.11.tgz", + "integrity": "sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@sinonjs/fake-timers": "^6.0.1", - "@types/node": "*", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/globals": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-26.6.2.tgz", - "integrity": "sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.11.tgz", + "integrity": "sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/types": "^26.6.2", - "expect": "^26.6.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/reporters": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-26.6.2.tgz", - "integrity": "sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.11.tgz", + "integrity": "sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.4", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^4.0.3", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "jest-haste-map": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^7.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "optionalDependencies": { - "node-notifier": "^8.0.0" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@jest/source-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-26.6.2.tgz", - "integrity": "sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.11.tgz", + "integrity": "sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.4", - "source-map": "^0.6.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/test-result": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-26.6.2.tgz", - "integrity": "sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.11.tgz", + "integrity": "sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/test-sequencer": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz", - "integrity": "sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.11.tgz", + "integrity": "sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-runner": "^26.6.3", - "jest-runtime": "^26.6.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/transform": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-26.6.2.tgz", - "integrity": "sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.11.tgz", + "integrity": "sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^26.6.2", - "babel-plugin-istanbul": "^6.0.0", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-haste-map": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-util": "^26.6.2", - "micromatch": "^4.0.2", - "pirates": "^4.0.1", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.11.tgz", + "integrity": "sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.11.tgz", + "integrity": "sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.11.tgz", + "integrity": "sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.11.tgz", + "integrity": "sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/linux-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.11.tgz", + "integrity": "sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.11.tgz", + "integrity": "sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "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==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.11.tgz", + "integrity": "sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.11.tgz", + "integrity": "sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.11.tgz", + "integrity": "sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.0.tgz", - "integrity": "sha512-KzWugryEBFkmoaYcBE18rs6gthWCFHHO7cAZm2/hv3hwD67AzwP7udSCa22E7R1+CEJL/FfhYsJWrc0b1aeSzw==", + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.11.tgz", + "integrity": "sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.11.tgz", + "integrity": "sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@testing-library/dom/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==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.11.tgz", + "integrity": "sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.11.tgz", + "integrity": "sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "deep-equal": "^2.0.5" + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "node_modules/@esbuild/win32-x64": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.11.tgz", + "integrity": "sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + "node": ">=18" } }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "dev": true, + "node_modules/@headlessui/react": { + "version": "1.7.19", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz", + "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==", "license": "MIT", "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" + "@tanstack/react-virtual": "^3.0.0-beta.60", + "client-only": "^0.0.1" }, "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" } }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@testing-library/jest-dom/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==", + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@testing-library/react": { - "version": "12.1.5", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.5.tgz", - "integrity": "sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==", + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.0.0", - "@types/react-dom": "<18.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { "node": ">=12" }, - "peerDependencies": { - "react": "<18.0.0", - "react-dom": "<18.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@testing-library/react-hooks": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@testing-library/react-hooks/-/react-hooks-8.0.0.tgz", - "integrity": "sha512-uZqcgtcUUtw7Z9N32W13qQhVAD+Xki2hxbTR461MKax8T6Jr8nsUvZB+vcBTkzY2nFvsUet434CsgF0ncW2yFw==", + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "react-error-boundary": "^3.1.0" + "ansi-regex": "^6.0.1" }, "engines": { "node": ">=12" }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0", - "react": "^16.9.0 || ^17.0.0", - "react-dom": "^16.9.0 || ^17.0.0", - "react-test-renderer": "^16.9.0 || ^17.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-test-renderer": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@testing-library/react/node_modules/@types/react-dom": { - "version": "17.0.26", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", - "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "license": "MIT", - "peerDependencies": { - "@types/react": "^17.0.0" + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "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": ">= 6" + "node": ">=8" } }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.1.19", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz", - "integrity": "sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "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, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "license": "MIT", + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.0.tgz", - "integrity": "sha512-r8aveDbd+rzGP+ykSdF3oPuTVRWRfbBiHl0rVDM2yNEmSMXfkObQLV46b4RnCv3Lra51OlfnZhkkFaDl2MIRaA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } + "license": "MIT" }, - "node_modules/@types/graceful-fs": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", - "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "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": { - "@types/istanbul-lib-coverage": "*" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "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, - "dependencies": { - "@types/istanbul-lib-report": "*" + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "node_modules/@types/jest": { - "version": "26.0.24", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz", - "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==", + "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": { - "jest-diff": "^26.0.0", - "pretty-format": "^26.0.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@types/node": { - "version": "17.0.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz", - "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.0.tgz", - "integrity": "sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true - }, - "node_modules/@types/react": { - "version": "17.0.44", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.44.tgz", - "integrity": "sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" } }, - "node_modules/@types/react-dom": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.1.tgz", - "integrity": "sha512-jCwTXvHtRLiyVvKm9aEdHXs8rflVOGd5Sl913JZrPshfXjn8NYsTNZOz70bCsA31IR0TOqwi3ad+X4tSCBoMTw==", + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true + "license": "MIT" }, - "node_modules/@types/tailwindcss": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/tailwindcss/-/tailwindcss-3.0.10.tgz", - "integrity": "sha512-1UnZIHO0NOPyPlPFV0HuMjki2SHkvG9uBA1ZehWj/OQMSROk503nuNyyfmJSIT289yewxTbKoPG+KLxYRvfIIg==", - "dev": true + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.38", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz", + "integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==", + "dev": true, + "license": "MIT" }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/jest": "*" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@types/yargs": { - "version": "15.0.14", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz", - "integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/acorn-node/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "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==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/autoprefixer": { - "version": "10.4.4", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz", - "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==", + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - } - ], - "dependencies": { - "browserslist": "^4.20.2", - "caniuse-lite": "^1.0.30001317", - "fraction.js": "^4.2.0", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/@tailwindcss/forms": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", + "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", "dev": true, "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz", - "integrity": "sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==", - "dev": true, - "dependencies": { - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/babel__core": "^7.1.7", - "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "slash": "^3.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.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, - "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.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", - "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", - "dev": true, - "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.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz", - "integrity": "sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@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-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz", - "integrity": "sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^26.6.2", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": ">= 10.14.2" - }, - "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 - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.20.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz", - "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001317", - "electron-to-chromium": "^1.4.84", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" - }, - "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, - "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, - "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 - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001332", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz", - "integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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, - "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/chalk/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, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz", - "integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "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 - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/concurrently": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.1.0.tgz", - "integrity": "sha512-Bz0tMlYKZRUDqJlNiF/OImojMB9ruKUz6GCfmhFnSapXgPe+3xzY4byqoKG9tUZ7L2PGEUjfLPOLfIX3labnmw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "bin": { - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.0 || >=16.0.0" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssdb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz", - "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==", - "dev": true - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/csstype": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz", - "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==", - "dev": true - }, - "node_modules/cuint": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", - "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", - "dev": true - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dev": true, - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/date-fns": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz", - "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==", - "dev": true, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", - "dev": true - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "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 - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "engines": { - "node": ">=0.4.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, - "engines": { - "node": ">=8" + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" } }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz", + "integrity": "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==", + "license": "MIT", "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" + "@tanstack/virtual-core": "3.13.12" }, - "bin": { - "detective": "bin/detective.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" }, - "engines": { - "node": ">=0.8.0" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "node_modules/@tanstack/virtual-core": { + "version": "3.13.12", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz", + "integrity": "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } }, - "node_modules/diff-sequences": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz", - "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==", + "node_modules/@testing-library/dom": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", + "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, "engines": { - "node": ">= 10.14.2" + "node": ">=14" } }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } }, - "node_modules/dom-accessibility-api": { + "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, "license": "MIT" }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", "dev": true, + "license": "MIT", "dependencies": { - "webidl-conversions": "^5.0.0" + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/@testing-library/react": { + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-14.3.1.tgz", + "integrity": "sha512-H99XjUhWQw0lTgyMN05W3xQG1Nh4lq574D8keFf1dDoNTJgp66VbJozRaczoF+wsiaPJNt/TcnfpLGufGxSrZQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^9.0.0", + "@types/react-dom": "^18.0.0" }, "engines": { - "node": ">= 0.4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.113", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.113.tgz", - "integrity": "sha512-s30WKxp27F3bBH6fA07FYL2Xm/FYnYrKpMjHr3XVCTUb9anAyZn/BeZfPWgTZGAbJeT4NxNwISSbLcYZvggPMA==", - "dev": true - }, - "node_modules/emittery": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.7.2.tgz", - "integrity": "sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==", - "dev": true, - "engines": { - "node": ">=10" + "node": ">=14" }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" } }, - "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 + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "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": { - "once": "^1.4.0" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "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==", + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, + "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "@babel/types": "^7.0.0" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "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", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@babel/types": "^7.28.2" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "undici-types": "~7.16.0" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", "dev": true, "license": "MIT" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/@types/react": { + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" + "@types/prop-types": "*", + "csstype": "^3.0.2" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@types/react": "^18.0.0" } }, - "node_modules/esbuild": { - "version": "0.14.36", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.36.tgz", - "integrity": "sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw==", + "node_modules/@types/tailwindcss": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/tailwindcss/-/tailwindcss-3.0.11.tgz", + "integrity": "sha512-PR+BOIrI+rxteHwFvkfIOty+PDJwTG4ute3alxSSXpF/xKpryO1room265m46Auyae0VwqUYs3PuVEOF9Oil3w==", "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "esbuild-android-64": "0.14.36", - "esbuild-android-arm64": "0.14.36", - "esbuild-darwin-64": "0.14.36", - "esbuild-darwin-arm64": "0.14.36", - "esbuild-freebsd-64": "0.14.36", - "esbuild-freebsd-arm64": "0.14.36", - "esbuild-linux-32": "0.14.36", - "esbuild-linux-64": "0.14.36", - "esbuild-linux-arm": "0.14.36", - "esbuild-linux-arm64": "0.14.36", - "esbuild-linux-mips64le": "0.14.36", - "esbuild-linux-ppc64le": "0.14.36", - "esbuild-linux-riscv64": "0.14.36", - "esbuild-linux-s390x": "0.14.36", - "esbuild-netbsd-64": "0.14.36", - "esbuild-openbsd-64": "0.14.36", - "esbuild-sunos-64": "0.14.36", - "esbuild-windows-32": "0.14.36", - "esbuild-windows-64": "0.14.36", - "esbuild-windows-arm64": "0.14.36" - } - }, - "node_modules/esbuild-node-externals": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/esbuild-node-externals/-/esbuild-node-externals-1.4.1.tgz", - "integrity": "sha512-ZFNGa6w1kYzn4wx9ty4eaItaOTSe2hWQZ6WXa/8guKJCiXL3XpW2CZT4gkx2OhfBKxpqaqa7ZeGK54ScoLSUdw==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz", + "integrity": "sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "5.0.0", - "tslib": "2.3.1" + "@babel/core": "^7.28.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.38", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" }, "peerDependencies": { - "esbuild": "0.12 - 0.14" + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/esbuild-node-externals/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==", + "node_modules/@vitest/coverage-v8": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.1.9.tgz", + "integrity": "sha512-Z2cOr0ksM00MpEfyVE8KXIYPEcBFxdbLSs56L8PO0QQMxt/6bDj45uQfxoc96v05KW3clk7vvgP0qfDit9DmfQ==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.7", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.12", + "magicast": "^0.3.5", + "std-env": "^3.8.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "2.1.9", + "vitest": "2.1.9" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/esbuild-node-externals/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==", + "node_modules/@vitest/expect": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.9.tgz", + "integrity": "sha512-UJCIkTBenHeKT1TTlKMJWy1laZewsRIzYighyYiJKZreqtdxSos/S1t+ktRMQWu2CKqaarrkeszJx1cgC5tGZw==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/esbuild-node-externals/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==", + "node_modules/@vitest/mocker": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.9.tgz", + "integrity": "sha512-tVL6uJgoUdi6icpxmdrn5YNo3g3Dxv+IHJBr0GXHaEdTcw3F+cPKnsXFhli6nO+f/6SDKPHEK1UN+k+TQv0Ehg==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" + "@vitest/spy": "2.1.9", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/esbuild-node-externals/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==", + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.9.tgz", + "integrity": "sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" + "tinyrainbow": "^1.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/esbuild-node-externals/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==", + "node_modules/@vitest/runner": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.9.tgz", + "integrity": "sha512-ZXSSqTFIrzduD63btIfEyOmNcBmQvgOVsPNPe0jYtESiXkhd8u2erDLnMxmGrDCwHCCHE7hxwRDCT3pt0esT4g==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.9", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/esbuild-node-externals/node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/@vitest/runner/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "node_modules/@vitest/snapshot": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.9.tgz", + "integrity": "sha512-oBO82rEjsxLNJincVhLhaxxZdEtV0EFHMK5Kmx5sJ6H9L183dHECjiefOAdnqpIgT5eZwT04PoggUnW88vOBNQ==", "dev": true, + "license": "MIT", "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "@vitest/pretty-format": "2.1.9", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "node_modules/@vitest/snapshot/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/spy": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.9.tgz", + "integrity": "sha512-E1B35FwzXXTs9FHNK6bDszs7mtydNi5MIfUWpceJ8Xbfb1gBMscAnwLbEu+B44ed6W3XjL9/ehLPHR1fkf1KLQ==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "tinyspy": "^3.0.2" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/@vitest/ui": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.9.tgz", + "integrity": "sha512-izzd2zmnk8Nl5ECYkW27328RbQ1nKvkm6Bb5DAaz1Gk59EbLkiCMa6OLT0NoaAYTjOFS6N+SMYW1nh4/9ljPiw==", "dev": true, + "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "@vitest/utils": "2.1.9", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^3.0.0", + "tinyglobby": "^0.2.10", + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.1.9" } }, - "node_modules/escodegen/node_modules/prelude-ls": { + "node_modules/@vitest/ui/node_modules/pathe": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "license": "MIT" }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "node_modules/@vitest/utils": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.9.tgz", + "integrity": "sha512-v0psaMSkNJ3A2NMrUEHFRzJtDPFn+/VWZ5WxImB21T9fjucJRmS7xCS3ppEnARb9y11OAzaD+P2Ps+b+BGX5iQ==", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "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==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">= 14" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "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": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, - "engines": { - "node": ">= 0.8.0" - } + "license": "MIT" }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true, - "dependencies": { - "ms": "2.0.0" - } + "license": "MIT" }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, + "license": "Apache-2.0", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" + "node": ">= 0.4" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "possible-typed-array-names": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/baseline-browser-mapping": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.18.tgz", + "integrity": "sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/expect": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", - "integrity": "sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-styles": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-regex-util": "^26.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 10.14.2" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, + "license": "MIT", "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "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": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "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": { - "is-descriptor": "^1.0.0" + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" }, "engines": { - "node": ">=0.10.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", "dev": true, + "license": "MIT", "dependencies": { - "is-extendable": "^0.1.0" + "load-tsconfig": "^0.2.3" }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" } }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "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.4" + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" }, "engines": { - "node": ">=8.6.0" - } - }, - "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 - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", - "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", - "dev": true, - "dependencies": { - "bser": "2.1.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3716,811 +2833,966 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" - }, "engines": { "node": ">= 6" } }, - "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } + "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/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, + "license": "MIT", "dependencies": { - "map-cache": "^0.2.2" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "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==", + "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/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "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", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "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==", + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "license": "MIT", "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 16" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">= 0.4" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "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==", + "node_modules/chokidar/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": ">=8.0.0" + "node": ">= 6" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" }, "engines": { - "node": ">= 0.4" + "node": ">=8.0.0", + "npm": ">=5.0.0" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true, + "license": "MIT" + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "string-width": "^4.2.0" }, "engines": { - "node": "*" + "node": "10.* || >= 12.*" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "optionalDependencies": { + "@colors/colors": "1.5.0" } }, - "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==", + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "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": { - "is-glob": "^4.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">= 6" + "node": ">=12" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "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", - "engines": { - "node": ">= 0.4" + "dependencies": { + "color-name": "~1.1.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=7.0.0" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/growly": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", - "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "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, - "optional": true - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", - "dev": true + "license": "MIT" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "delayed-stream": "~1.0.0" }, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.8" } }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">=14" } }, - "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==", + "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, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/concurrently": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "chalk": "^4.1.0", + "date-fns": "^2.29.1", + "lodash": "^4.17.21", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", + "spawn-command": "^0.0.2-1", + "supports-color": "^8.1.0", + "tree-kill": "^1.2.2", + "yargs": "^17.3.1" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/concurrently/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": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "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/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": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "kind-of": "^3.0.2" + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" }, "engines": { - "node": ">=0.10.0" + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "dev": true, + "license": "MIT" }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==", "dev": true, + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "dev": true, + "license": "MIT", "dependencies": { - "whatwg-encoding": "^1.0.5" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "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 - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "dev": true, + "license": "MIT", "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">= 6" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "ms": "^2.1.3" }, "engines": { - "node": ">= 6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8.12.0" + "node": ">=6" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "license": "MIT", "dependencies": { - "harmony-reflect": "^1.4.6" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">=0.4.0" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "Apache-2.0" }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } + "license": "MIT" }, - "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 + "node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "gopd": "^1.2.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "node_modules/electron-to-chromium": { + "version": "1.5.237", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", + "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, + "license": "ISC" + }, + "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/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, + "license": "MIT", "dependencies": { - "ci-info": "^2.0.0" + "es-errors": "^1.3.0" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">= 0.4" } }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "node_modules/esbuild": { + "version": "0.25.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.11.tgz", + "integrity": "sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==", "dev": true, - "dependencies": { - "kind-of": "^6.0.0" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.11", + "@esbuild/android-arm": "0.25.11", + "@esbuild/android-arm64": "0.25.11", + "@esbuild/android-x64": "0.25.11", + "@esbuild/darwin-arm64": "0.25.11", + "@esbuild/darwin-x64": "0.25.11", + "@esbuild/freebsd-arm64": "0.25.11", + "@esbuild/freebsd-x64": "0.25.11", + "@esbuild/linux-arm": "0.25.11", + "@esbuild/linux-arm64": "0.25.11", + "@esbuild/linux-ia32": "0.25.11", + "@esbuild/linux-loong64": "0.25.11", + "@esbuild/linux-mips64el": "0.25.11", + "@esbuild/linux-ppc64": "0.25.11", + "@esbuild/linux-riscv64": "0.25.11", + "@esbuild/linux-s390x": "0.25.11", + "@esbuild/linux-x64": "0.25.11", + "@esbuild/netbsd-arm64": "0.25.11", + "@esbuild/netbsd-x64": "0.25.11", + "@esbuild/openbsd-arm64": "0.25.11", + "@esbuild/openbsd-x64": "0.25.11", + "@esbuild/openharmony-arm64": "0.25.11", + "@esbuild/sunos-x64": "0.25.11", + "@esbuild/win32-arm64": "0.25.11", + "@esbuild/win32-ia32": "0.25.11", + "@esbuild/win32-x64": "0.25.11" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "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, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" + "@types/estree": "^1.0.0" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", "dev": true, - "optional": true, - "bin": { - "is-docker": "cli.js" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12.0.0" } }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "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": { - "is-plain-object": "^2.0.4" + "@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": ">=0.10.0" + "node": ">=8.6.0" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "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": ">=0.10.0" + "node": ">= 6" } }, - "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==", + "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, - "engines": { - "node": ">=8" + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "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==", + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "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==", + "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": { - "is-extglob": "^2.1.1" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", + "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" } }, - "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==", + "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, - "engines": { - "node": ">=0.12.0" - } + "license": "ISC" }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -4529,135 +3801,146 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 6" } }, - "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==", + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "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, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "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": ">= 0.4" - }, + "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/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "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-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4666,1011 +3949,780 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, - "optional": true, + "license": "ISC", "dependencies": { - "is-docker": "^2.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=8" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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", + "dependencies": { + "is-glob": "^4.0.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } + "license": "(Apache-2.0 OR MPL-1.1)" }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "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, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/istanbul-lib-report/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==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "license": "MIT", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "has-symbols": "^1.0.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-26.6.3.tgz", - "integrity": "sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==", + "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": { - "@jest/core": "^26.6.3", - "import-local": "^3.0.2", - "jest-cli": "^26.6.3" - }, - "bin": { - "jest": "bin/jest.js" + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" } }, - "node_modules/jest-changed-files": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-26.6.2.tgz", - "integrity": "sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==", + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "execa": "^4.0.0", - "throat": "^5.0.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">= 10.14.2" + "node": "*" } }, - "node_modules/jest-cli": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-26.6.3.tgz", - "integrity": "sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==", + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/core": "^26.6.3", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "import-local": "^3.0.2", - "is-ci": "^2.0.0", - "jest-config": "^26.6.3", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "prompts": "^2.0.1", - "yargs": "^15.4.1" - }, - "bin": { - "jest": "bin/jest.js" + "whatwg-encoding": "^3.1.1" }, "engines": { - "node": ">= 10.14.2" + "node": ">=18" } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "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, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } + "license": "MIT" }, - "node_modules/jest-cli/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==", + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/jest-cli/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==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">=8" + "node": ">= 14" } }, - "node_modules/jest-cli/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==", + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/jest-cli/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==", + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "harmony-reflect": "^1.4.6" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/jest-cli/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==", + "node_modules/ignore-walk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^5.0.1" + }, "engines": { - "node": ">=6" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/jest-cli/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==", + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/jest-cli/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/ignore-walk/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": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/jest-cli/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/jest-cli/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "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": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/jest-config": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-26.6.3.tgz", - "integrity": "sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==", + "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, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^26.6.3", - "@jest/types": "^26.6.2", - "babel-jest": "^26.6.3", - "chalk": "^4.0.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.4", - "jest-environment-jsdom": "^26.6.2", - "jest-environment-node": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-jasmine2": "^26.6.3", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } + "license": "ISC" }, - "node_modules/jest-diff": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz", - "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==", + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" } }, - "node_modules/jest-docblock": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-26.0.0.tgz", - "integrity": "sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==", + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "dev": true, + "license": "MIT", "dependencies": { - "detect-newline": "^3.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-each": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-26.6.2.tgz", - "integrity": "sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-environment-jsdom": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz", - "integrity": "sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2", - "jsdom": "^16.4.0" + "has-bigints": "^1.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-environment-node": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-26.6.2.tgz", - "integrity": "sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "jest-mock": "^26.6.2", - "jest-util": "^26.6.2" + "binary-extensions": "^2.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=8" } }, - "node_modules/jest-get-type": { - "version": "26.3.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz", - "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-haste-map": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-26.6.2.tgz", - "integrity": "sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.4", - "jest-regex-util": "^26.0.0", - "jest-serializer": "^26.6.2", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "micromatch": "^4.0.2", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, + "license": "MIT", "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "^2.1.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-jasmine2": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz", - "integrity": "sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==", + "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": { - "@babel/traverse": "^7.1.0", - "@jest/environment": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^26.6.2", - "is-generator-fn": "^2.0.0", - "jest-each": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "pretty-format": "^26.6.2", - "throat": "^5.0.0" + "hasown": "^2.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-leak-detector": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", - "integrity": "sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-matcher-utils": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz", - "integrity": "sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==", + "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, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "pretty-format": "^26.6.2" - }, + "license": "MIT", "engines": { - "node": ">= 10.14.2" + "node": ">=0.10.0" } }, - "node_modules/jest-message-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-26.6.2.tgz", - "integrity": "sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==", + "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, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.2", - "pretty-format": "^26.6.2", - "slash": "^3.0.0", - "stack-utils": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": ">= 10.14.2" + "node": ">=8" } }, - "node_modules/jest-mock": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-26.6.2.tgz", - "integrity": "sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==", + "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": { - "@jest/types": "^26.6.2", - "@types/node": "*" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">= 10.14.2" + "node": ">=0.10.0" } }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-regex-util": { - "version": "26.0.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-26.0.0.tgz", - "integrity": "sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==", + "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": ">= 10.14.2" + "node": ">=0.12.0" } }, - "node_modules/jest-resolve": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-26.6.2.tgz", - "integrity": "sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==", + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^26.6.2", - "read-pkg-up": "^7.0.1", - "resolve": "^1.18.1", - "slash": "^3.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">= 10.14.2" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-resolve-dependencies": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz", - "integrity": "sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-snapshot": "^26.6.2" - }, - "engines": { - "node": ">= 10.14.2" - } + "license": "MIT" }, - "node_modules/jest-runner": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-26.6.3.tgz", - "integrity": "sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==", + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.7.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-docblock": "^26.0.0", - "jest-haste-map": "^26.6.2", - "jest-leak-detector": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "jest-runtime": "^26.6.3", - "jest-util": "^26.6.2", - "jest-worker": "^26.6.2", - "source-map-support": "^0.5.6", - "throat": "^5.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime": { - "version": "26.6.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-26.6.3.tgz", - "integrity": "sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==", - "dev": true, - "dependencies": { - "@jest/console": "^26.6.2", - "@jest/environment": "^26.6.2", - "@jest/fake-timers": "^26.6.2", - "@jest/globals": "^26.6.2", - "@jest/source-map": "^26.6.2", - "@jest/test-result": "^26.6.2", - "@jest/transform": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0", - "cjs-module-lexer": "^0.6.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.4", - "jest-config": "^26.6.3", - "jest-haste-map": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-mock": "^26.6.2", - "jest-regex-util": "^26.0.0", - "jest-resolve": "^26.6.2", - "jest-snapshot": "^26.6.2", - "jest-util": "^26.6.2", - "jest-validate": "^26.6.2", - "slash": "^3.0.0", - "strip-bom": "^4.0.0", - "yargs": "^15.4.1" - }, - "bin": { - "jest-runtime": "bin/jest-runtime.js" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/jest-runtime/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/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==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/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==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/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==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/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==", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/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, - "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/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==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runtime/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/jest-runtime/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/jest-runtime/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } + "license": "ISC" }, - "node_modules/jest-serializer": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-26.6.2.tgz", - "integrity": "sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==", + "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, - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.4" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">= 10.14.2" + "node": ">=8" } }, - "node_modules/jest-snapshot": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-26.6.2.tgz", - "integrity": "sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==", + "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": { - "@babel/types": "^7.0.0", - "@jest/types": "^26.6.2", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.0.0", - "chalk": "^4.0.0", - "expect": "^26.6.2", - "graceful-fs": "^4.2.4", - "jest-diff": "^26.6.2", - "jest-get-type": "^26.3.0", - "jest-haste-map": "^26.6.2", - "jest-matcher-utils": "^26.6.2", - "jest-message-util": "^26.6.2", - "jest-resolve": "^26.6.2", - "natural-compare": "^1.4.0", - "pretty-format": "^26.6.2", - "semver": "^7.3.2" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=10" } }, - "node_modules/jest-util": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-26.6.2.tgz", - "integrity": "sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@jest/types": "^26.6.2", - "@types/node": "*", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", - "is-ci": "^2.0.0", - "micromatch": "^4.0.2" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=10" } }, - "node_modules/jest-validate": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-26.6.2.tgz", - "integrity": "sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@jest/types": "^26.6.2", - "camelcase": "^6.0.0", - "chalk": "^4.0.0", - "jest-get-type": "^26.3.0", - "leven": "^3.1.0", - "pretty-format": "^26.6.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">= 10.14.2" + "node": ">=8" } }, - "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==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "engines": { - "node": ">=10" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-26.6.2.tgz", - "integrity": "sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==", - "dev": true, - "dependencies": { - "@jest/test-result": "^26.6.2", - "@jest/types": "^26.6.2", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^26.6.2", - "string-length": "^4.0.1" + "url": "https://github.com/sponsors/isaacs" }, - "engines": { - "node": ">= 10.14.2" + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" } }, - "node_modules/jest-worker/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==", + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" } }, "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" }, "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dev": true, - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-25.0.1.tgz", + "integrity": "sha512-8i7LzZj7BF8uplX+ZyOlIz86V6TAsSs+np6m1kpW9u0JWi4z/1t+FzcK1aek+ybTnAC4KhBL4uXCNT0wcUIeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.1.0", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" + "tough-cookie": "^5.0.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^2.11.2" }, "peerDependenciesMeta": { "canvas": { @@ -5689,19 +4741,14 @@ }, "engines": { "node": ">=6" - } - }, - "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 + } }, "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" }, @@ -5709,59 +4756,55 @@ "node": ">=6" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "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, - "engines": { - "node": ">=6" - } - }, "node_modules/lilconfig": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", - "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "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 + "dev": true, + "license": "MIT" + }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "peer": true, + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -5769,16 +4812,21 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "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": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/lz-string": { @@ -5791,64 +4839,106 @@ "lz-string": "bin/bin.js" } }, + "node_modules/magic-string": { + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "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": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/marked": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/marked/-/marked-9.1.6.tgz", + "integrity": "sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==", "dev": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 16" } }, - "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 - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "node_modules/marked-terminal": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", + "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", "dev": true, + "license": "MIT", "dependencies": { - "tmpl": "1.0.5" + "ansi-escapes": "^7.0.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.4.1", + "cli-highlight": "^2.1.11", + "cli-table3": "^0.6.5", + "node-emoji": "^2.2.0", + "supports-hyperlinks": "^3.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "marked": ">=1 <16" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "node_modules/marked-terminal/node_modules/ansi-escapes": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.1.1.tgz", + "integrity": "sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==", "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "node_modules/marked-terminal/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/math-intrinsics": { @@ -5861,28 +4951,24 @@ "node": ">= 0.4" } }, - "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 - }, "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.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "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.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -5894,6 +4980,7 @@ "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", "dev": true, + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -5906,6 +4993,7 @@ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -5915,6 +5003,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -5922,15 +5011,6 @@ "node": ">= 0.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, - "engines": { - "node": ">=6" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -5946,58 +5026,98 @@ "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", "dev": true, + "license": "MIT", "bin": { "mini-svg-data-uri": "cli.js" } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, + "license": "MIT", "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } }, "node_modules/nanoid": { "version": "3.3.11", @@ -6018,93 +5138,35 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "node_modules/node-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dev": true, + "license": "MIT", "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", - "dev": true - }, - "node_modules/node-notifier": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", - "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", - "dev": true, - "optional": true, - "dependencies": { - "growly": "^1.3.0", - "is-wsl": "^2.2.0", - "semver": "^7.3.2", - "shellwords": "^0.1.1", - "uuid": "^8.3.0", - "which": "^2.0.2" + "node": ">=18" } }, "node_modules/node-releases": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz", - "integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz", + "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==", "dev": true, - "bin": { - "semver": "bin/semver" - } + "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" } @@ -6112,120 +5174,112 @@ "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "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==", + "node_modules/npm-bundled": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "dev": true, + "license": "ISC", "dependencies": { - "path-key": "^3.0.0" + "npm-normalize-package-bin": "^2.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", - "dev": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "node_modules/npm-normalize-package-bin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/npm-packlist": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", "dev": true, + "license": "ISC", "dependencies": { - "is-descriptor": "^0.1.0" + "glob": "^8.0.1", + "ignore-walk": "^5.0.1", + "npm-bundled": "^2.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "bin": { + "npm-packlist": "bin/index.js" }, "engines": { - "node": ">=0.10.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/npm-packlist/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" + "balanced-match": "^1.0.0" } }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/npm-packlist/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { - "kind-of": "^3.0.2" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/npm-packlist/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": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/nwsapi": { + "version": "2.2.22", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.22.tgz", + "integrity": "sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6235,6 +5289,7 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -6274,20 +5329,9 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, "node_modules/object.assign": { @@ -6311,110 +5355,59 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "BlueOak-1.0.0" }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "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==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", "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" + "parse5": "^6.0.1" } }, - "node_modules/parse5": { + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "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" } @@ -6423,7 +5416,49 @@ "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 + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } }, "node_modules/picocolors": { "version": "1.1.1", @@ -6437,6 +5472,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -6447,110 +5483,33 @@ "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "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, - "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, - "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, - "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, - "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==", + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, "node_modules/possible-typed-array-names": { @@ -6593,15 +5552,23 @@ } }, "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", - "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.2" + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.0.2" + "postcss": "^8.2" } }, "node_modules/postcss-clamp": { @@ -6609,6 +5576,7 @@ "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6620,67 +5588,91 @@ } }, "node_modules/postcss-color-functional-notation": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", - "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-color-hex-alpha": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", - "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-color-rebeccapurple": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", - "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.3" + "postcss": "^8.2" } }, "node_modules/postcss-custom-media": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", - "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">=10.0.0" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.1.0" + "postcss": "^8.3" } }, "node_modules/postcss-custom-properties": { - "version": "12.1.7", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", - "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6692,44 +5684,55 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-custom-selectors": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", - "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">=10.0.0" + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.1.2" + "postcss": "^8.3" } }, "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", - "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", "dev": true, + "license": "CC0-1.0", "dependencies": { - "postcss-selector-parser": "^6.0.9" + "postcss-selector-parser": "^6.0.10" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-double-position-gradients": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", - "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -6737,8 +5740,12 @@ "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-env-function": { @@ -6746,6 +5753,7 @@ "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, @@ -6761,6 +5769,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -6776,6 +5785,7 @@ "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.9" }, @@ -6791,35 +5801,46 @@ "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-gap-properties": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", - "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-image-set-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", - "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-import": { @@ -6827,6 +5848,7 @@ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", "dev": true, + "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -6844,34 +5866,43 @@ "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.0.0" } }, "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, "engines": { "node": "^12 || ^14 || >= 16" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.21" } }, "node_modules/postcss-lab-function": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", - "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "@csstools/postcss-progressive-custom-properties": "^1.1.0", "postcss-value-parser": "^4.2.0" @@ -6884,34 +5915,48 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "lilconfig": "^3.1.1" }, "engines": { - "node": ">= 10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">= 18" }, "peerDependencies": { + "jiti": ">=1.21.0", "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { + "jiti": { + "optional": true + }, "postcss": { "optional": true }, - "ts-node": { + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } @@ -6921,6 +5966,7 @@ "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12 || ^14 || >=16" }, @@ -6933,6 +5979,7 @@ "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -6945,6 +5992,7 @@ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", "dev": true, + "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.0.6" }, @@ -6960,11 +6008,13 @@ } }, "node_modules/postcss-nesting": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", - "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", "dev": true, + "license": "CC0-1.0", "dependencies": { + "@csstools/selector-specificity": "^2.0.0", "postcss-selector-parser": "^6.0.10" }, "engines": { @@ -6975,13 +6025,13 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", "dev": true, "funding": [ { @@ -6993,20 +6043,32 @@ "url": "https://liberapay.com/mrcgrtz" } ], + "license": "MIT", "engines": { "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" } }, "node_modules/postcss-overflow-shorthand": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", - "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", "dev": true, + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-page-break": { @@ -7014,87 +6076,105 @@ "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8" } }, "node_modules/postcss-place": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", - "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz", - "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==", - "dev": true, - "dependencies": { - "@csstools/postcss-color-function": "^1.0.3", - "@csstools/postcss-font-format-keywords": "^1.0.0", - "@csstools/postcss-hwb-function": "^1.0.0", - "@csstools/postcss-ic-unit": "^1.0.0", - "@csstools/postcss-is-pseudo-class": "^2.0.1", - "@csstools/postcss-normalize-display-values": "^1.0.0", - "@csstools/postcss-oklab-function": "^1.0.2", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "autoprefixer": "^10.4.4", - "browserslist": "^4.20.2", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", "css-blank-pseudo": "^3.0.3", "css-has-pseudo": "^3.0.4", "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^6.5.0", - "postcss-attribute-case-insensitive": "^5.0.0", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.2", - "postcss-color-hex-alpha": "^8.0.3", - "postcss-color-rebeccapurple": "^7.0.2", - "postcss-custom-media": "^8.0.0", - "postcss-custom-properties": "^12.1.5", - "postcss-custom-selectors": "^6.0.0", - "postcss-dir-pseudo-class": "^6.0.4", - "postcss-double-position-gradients": "^3.1.1", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", "postcss-env-function": "^4.0.6", "postcss-focus-visible": "^6.0.4", "postcss-focus-within": "^5.0.4", "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.3", - "postcss-image-set-function": "^4.0.6", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.1.2", + "postcss-lab-function": "^4.2.1", "postcss-logical": "^5.0.4", "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.3", + "postcss-nesting": "^10.2.0", "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.3", + "postcss-overflow-shorthand": "^3.0.4", "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.4", - "postcss-pseudo-class-any-link": "^7.1.1", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^5.0.0", + "postcss-selector-not": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { "node": "^12 || ^14 || >=16" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", - "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", "dev": true, + "license": "CC0-1.0", "dependencies": { "postcss-selector-parser": "^6.0.10" }, @@ -7106,7 +6186,7 @@ "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.4" + "postcss": "^8.2" } }, "node_modules/postcss-replace-overflow-wrap": { @@ -7114,15 +6194,27 @@ "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", "dev": true, + "license": "MIT", "peerDependencies": { "postcss": "^8.0.3" } }, "node_modules/postcss-reporter": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.5.tgz", - "integrity": "sha512-glWg7VZBilooZGOFPhN9msJ3FQs19Hie7l5a/eE6WglzYqVeH3ong3ShFcp9kDWJT1g2Y/wd59cocf9XxBtkWA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { "picocolors": "^1.0.0", "thenby": "^1.3.4" @@ -7130,31 +6222,36 @@ "engines": { "node": ">=10" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.1.0" } }, "node_modules/postcss-selector-not": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", - "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" }, "peerDependencies": { - "postcss": "^8.1.0" + "postcss": "^8.2" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -7168,6 +6265,7 @@ "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-10.1.3.tgz", "integrity": "sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==", "dev": true, + "license": "MIT", "dependencies": { "make-dir": "~3.1.0", "mime": "~2.5.2", @@ -7181,11 +6279,28 @@ "postcss": "^8.0.0" } }, + "node_modules/postcss-url/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/postcss-url/node_modules/minimatch": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7193,72 +6308,92 @@ "node": "*" } }, + "node_modules/postcss-url/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/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", "react-is": "^17.0.1" }, "engines": { - "node": ">= 10" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "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==", + "node_modules/pretty-format/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, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, + "license": "MIT", "engines": { - "node": ">= 6" + "node": ">=8" } }, - "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "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/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/publint": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/publint/-/publint-0.2.12.tgz", + "integrity": "sha512-YNeUtCVeM4j9nDiTT2OPczmlyzOkIXNtdDZnSuajAxS/nZ6j3t7Vs9SUB4euQNddiltIwu7Tdd3s+hr08fAsMw==", "dev": true, + "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "npm-packlist": "^5.1.3", + "picocolors": "^1.1.1", + "sade": "^1.8.1" + }, + "bin": { + "publint": "lib/cli.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "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", "engines": { "node": ">=6" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7277,202 +6412,66 @@ "type": "consulting", "url": "https://feross.org/support" } - ] - }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + ], + "license": "MIT" }, "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "peer": true, + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": ">=16.13.1" + "react": "^18.3.1" } }, "node_modules/react-hooks": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/react-hooks/-/react-hooks-1.0.1.tgz", - "integrity": "sha1-5iGXw4zY0HAwYPeRI09/RpiqfEQ=", - "dev": true + "integrity": "sha512-PXU08tw4SvKwkW99qgnyV98x939RCmBC6aXqALPQXPjKq6+6EoH79Rz4KdUozzlpSyWmn2IiEm0vh3p+79aP5w==", + "dev": true, + "license": "MIT" }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/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, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/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, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/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, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/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, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/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, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/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, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" } }, "node_modules/readdirp": { @@ -7480,6 +6479,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -7501,25 +6501,6 @@ "node": ">=8" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -7541,139 +6522,106 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-core-module": "^2.8.1", + "is-core-module": "^2.16.1", "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, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { + "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-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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==", + "node_modules/rollup": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@types/estree": "1.0.8" }, "bin": { - "rimraf": "bin.js" + "rollup": "dist/bin/rollup" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" } }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } + "license": "MIT" }, "node_modules/run-parallel": { "version": "1.2.0", @@ -7694,367 +6642,87 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dev": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "tslib": "^2.1.0" } }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", "dev": true, + "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "mri": "^1.1.0" }, "engines": { "node": ">=6" } }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { + "node_modules/safe-regex-test": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "node": ">= 0.4" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } + "license": "MIT" }, "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, + "license": "ISC", "dependencies": { "xmlchars": "^2.2.0" }, "engines": { - "node": ">=10" + "node": ">=v12.22.7" } }, "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "peer": true, + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -8062,12 +6730,6 @@ "node": ">=10" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -8102,47 +6764,12 @@ "node": ">= 0.4" } }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "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" }, @@ -8155,16 +6782,23 @@ "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/shellwords": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", - "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", "dev": true, - "optional": true + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/side-channel": { "version": "1.1.0", @@ -8242,1073 +6876,1442 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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 - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, - "engines": { - "node": ">=8" - } + "license": "ISC" }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, + "license": "MIT", "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", "dev": true, + "license": "MIT", "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "unicode-emoji-modifier-base": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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": { - "ms": "2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/string-width-cjs": { + "name": "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": { - "is-descriptor": "^0.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": { - "is-extendable": "^0.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/strip-ansi-cjs": { + "name": "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": { - "kind-of": "^3.0.2" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/strip-ansi-cjs/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, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/strip-ansi/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, - "dependencies": { - "kind-of": "^3.0.2" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-buffer": "^1.1.5" + "min-indent": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", "dev": true, + "license": "MIT", "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">=0.10.0" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "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": ">=0.10.0" + "node": ">=8" } }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" } }, - "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==", + "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.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "node_modules/tailwindcss/node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, + "license": "MIT", "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/tailwindcss/node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, + "license": "ISC", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "any-promise": "^1.0.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, + "license": "MIT", "dependencies": { - "extend-shallow": "^3.0.0" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" }, - "node_modules/stack-utils": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", - "integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==", + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=10" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "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==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "^18.0.0 || >=20.0.0" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=14.0.0" } }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", "dev": true, + "license": "MIT", "dependencies": { - "kind-of": "^3.0.2" + "tldts-core": "^6.1.86" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "tldts": "bin/cli.js" } }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "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-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" + "tldts": "^6.1.32" }, "engines": { - "node": ">= 0.4" + "node": ">=16" } }, - "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==", + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", "dev": true, + "license": "MIT", "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" + "punycode": "^2.3.1" }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "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==", + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-expose-internals-conditionally": { + "version": "1.0.0-empty.0", + "resolved": "https://registry.npmjs.org/ts-expose-internals-conditionally/-/ts-expose-internals-conditionally-1.0.0-empty.0.tgz", + "integrity": "sha512-F8m9NOF6ZhdOClDVdlM8gj3fDCav4ZIFSs/EI3ksQbAAXVSCN/Jh5OCJDDZWBuBy9psFc6jULGDlPwjMYMhJDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsup": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz", + "integrity": "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.25.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "0.8.0-beta.0", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "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==", + "node_modules/tsup/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "readdirp": "^4.0.1" }, "engines": { - "node": ">=8" + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "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==", + "node_modules/tsup/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "node_modules/tsup/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, "engines": { - "node": ">=0.10.0" + "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==", + "node_modules/tsup/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", "dev": true, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "node_modules/tsup/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/tsup/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "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==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=14.17" } }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/supports-hyperlinks/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==", + "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": { - "has-flag": "^4.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, - "engines": { - "node": ">=8" + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "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==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, + "license": "ISC", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tailwindcss": { - "version": "3.0.24", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.24.tgz", - "integrity": "sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig==", + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", "dev": true, + "license": "MIT", "dependencies": { - "arg": "^5.0.1", - "chokidar": "^3.5.3", - "color-name": "^1.1.4", - "detective": "^5.2.0", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "lilconfig": "^2.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.12", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "5.0.6", - "postcss-selector-parser": "^6.0.10", - "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.0" + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" }, "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" + "vite": "bin/vite.js" }, "engines": { - "node": ">=12.13.0" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/tailwindcss/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, - "dependencies": { - "is-glob": "^4.0.3" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, - "engines": { - "node": ">=10.13.0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "node_modules/vite-node": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.9.tgz", + "integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=8" + "node": "^18.0.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "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==", + "node_modules/vite-node/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, + "license": "MIT" + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "dev": 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 - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "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==", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8.0" + "node": ">=12" } }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], "dev": true, - "bin": { - "tree-kill": "cli.js" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/ts-jest": { - "version": "26.5.6", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-26.5.6.tgz", - "integrity": "sha512-rua+rCP8DxpA8b4DQD/6X2HQS8Zy/xzViVYfEs2OQu68tkCuKLV0Md8pmX55+W24uRIyAsf/BajRfxOs+R2MKA==", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "bs-logger": "0.x", - "buffer-from": "1.x", - "fast-json-stable-stringify": "2.x", - "jest-util": "^26.1.0", - "json5": "2.x", - "lodash": "4.x", - "make-error": "1.x", - "mkdirp": "1.x", - "semver": "7.x", - "yargs-parser": "20.x" - }, - "bin": { - "ts-jest": "cli.js" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 10" - }, - "peerDependencies": { - "jest": ">=26 <27", - "typescript": ">=3.8 <5.0" + "node": ">=12" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "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==", + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/typescript": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", - "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4.2.0" + "node": ">=12" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 4.0.0" + "node": ">=12" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "dev": true, + "license": "MIT", "optional": true, - "bin": { - "uuid": "dist/bin/uuid" + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, - "node_modules/v8-to-istanbul": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz", - "integrity": "sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow==", + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10.10.0" + "node": ">=12" } }, - "node_modules/v8-to-istanbul/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">= 8" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.9.tgz", + "integrity": "sha512-MSmPM9REYqDGBI8439mA4mWhV5sKmDlBKWIYbA3lRb2PTHACE0mgKwA8yQ2xq9vxDTuk4iPrECBAEW2aoFXY0Q==", "dev": true, + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@vitest/expect": "2.1.9", + "@vitest/mocker": "2.1.9", + "@vitest/pretty-format": "^2.1.9", + "@vitest/runner": "2.1.9", + "@vitest/snapshot": "2.1.9", + "@vitest/spy": "2.1.9", + "@vitest/utils": "2.1.9", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.9", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.9", + "@vitest/ui": "2.1.9", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "node_modules/vitest/node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } + "license": "MIT" }, "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, + "license": "MIT", "dependencies": { - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=10" - } - }, - "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, - "dependencies": { - "makeerror": "1.0.12" + "node": ">=18" } }, "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=10.4" + "node": ">=12" } }, "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, + "license": "MIT", "dependencies": { - "iconv-lite": "0.4.24" + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" } }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", "dev": true, + "license": "MIT", "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/which": { @@ -9316,6 +8319,7 @@ "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" }, @@ -9327,16 +8331,20 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9361,12 +8369,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", @@ -9389,14 +8391,21 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/wrap-ansi": { @@ -9404,6 +8413,26 @@ "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/wrap-ansi-cjs": { + "name": "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", @@ -9419,33 +8448,22 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "license": "ISC" }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -9457,31 +8475,28 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "engines": { - "node": ">=0.4" - } + "license": "MIT" }, "node_modules/xxhashjs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", "dev": true, + "license": "MIT", "dependencies": { "cuint": "^0.2.2" } @@ -9491,62 +8506,45 @@ "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": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, - "engines": { - "node": ">= 6" - } + "license": "ISC" }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "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": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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==", + "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": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } } } diff --git a/package.json b/package.json index a9f234e..6bc3c70 100644 --- a/package.json +++ b/package.json @@ -2,31 +2,45 @@ "name": "react-enable", "version": "3.1.1", "description": "feature flags to enable and disable functionality at runtime in a react application", - "main": "dist/cjs/src/index.js", - "module": "dist/esm/src/index.js", - "types": "dist/index.d.ts", + "type": "module", + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.js" + }, + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + } + } + }, "files": [ "dist" ], + "sideEffects": false, "scripts": { - "build-types": "tsc --emitDeclarationOnly --outDir dist", - "build-js": "npm run build-types && ./scripts/build.mjs", - "build-css": "npx tailwindcss -i ./src/in-tailwind.css -o ./src/tailwind.css", - "build": "rimraf dist && npm run build-css && ./scripts/build.mjs && npm run build-types", - "dist": "rimraf dist && npm run build-css && ENV=production ./scripts/build.mjs --dist && npm run build-types", - "watch-js": "./scripts/build.mjs --watch", - "watch-css": "npx tailwindcss -i ./src/in-tailwind.css -o ./src/tailwind.css --watch", - "watch": "concurrently 'npm:watch-*'", - "test": "npx jest --watch", - "test:ci": "npx jest", + "build-css": "tailwindcss -i ./src/in-tailwind.css -o ./src/tailwind.css", + "build": "npm run build-css && tsup", + "dev": "npm run build-css && tsup --watch", + "watch-css": "tailwindcss -i ./src/in-tailwind.css -o ./src/tailwind.css --watch", + "watch": "concurrently 'npm:dev' 'npm:watch-css'", + "test": "vitest", + "test:ci": "vitest run", + "test:ui": "vitest --ui", "lint": "biome check src", "lint:fix": "biome check --write src", "format": "biome format --write src", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "prepublishOnly": "npm run build", + "validate": "publint && attw --pack ." }, "repository": { "type": "git", - "url": "git@github.com:pliosoft/react-enable.git" + "url": "git+https://github.com/pliosoft/react-enable.git" }, "keywords": [ "feature", @@ -41,38 +55,44 @@ }, "homepage": "https://github.com/pliosoft/react-enable#readme", "devDependencies": { + "@arethetypeswrong/cli": "^0.15.0", "@biomejs/biome": "^1.9.4", "@tailwindcss/forms": "^0.5.0", - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^12.1.5", - "@testing-library/react-hooks": "^8.0.0", - "@types/jest": "^26", - "@types/react": "^17", - "@types/react-dom": "^18.0.0", + "@testing-library/jest-dom": "^6.1.5", + "@testing-library/react": "^14.1.2", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", "@types/tailwindcss": "^3.0.10", + "@vitejs/plugin-react": "^5.0.4", + "@vitest/coverage-v8": "^2.1.9", + "@vitest/ui": "^2.1.8", "concurrently": "^7.1.0", - "esbuild": "^0.14.36", - "esbuild-node-externals": "^1.4.1", "identity-obj-proxy": "^3.0.0", - "jest": "^26", + "jsdom": "^25.0.1", "postcss": "^8.4.12", "postcss-import": "^14.1.0", "postcss-nested": "^5.0.6", "postcss-preset-env": "^7.4.3", "postcss-reporter": "^7.0.5", "postcss-url": "^10.1.3", + "publint": "^0.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", "react-hooks": "^1.0.1", - "rimraf": "^3.0.2", "tailwindcss": "^3.0.24", - "ts-jest": "^26", - "typescript": "^4.6.3" + "tsup": "^8.3.5", + "typescript": "^5.6.3", + "vitest": "^2.1.8" }, "peerDependencies": { - "react": "^17 || ^18", - "react-dom": "^17 || ^18" + "react": "^17 || ^18 || ^19", + "react-dom": "^17 || ^18 || ^19" }, "dependencies": { "@headlessui/react": "^1.5.0", - "tslib": "^1.14.1" + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.0.0" } } diff --git a/postcss.config.js b/postcss.config.cjs similarity index 88% rename from postcss.config.js rename to postcss.config.cjs index 6b5e233..381d76c 100644 --- a/postcss.config.js +++ b/postcss.config.cjs @@ -5,7 +5,7 @@ module.exports = { require('postcss-preset-env')({ browsers: ['last 2 versions', '> 5%'], }), - require('tailwindcss')('./tailwind.config.js'), + require('tailwindcss')('./tailwind.config.cjs'), require('postcss-reporter')({ clearReportedMessages: true }), process.env.NODE_ENV === 'production' ? require('autoprefixer')() : null, process.env.NODE_ENV === 'production' ? require('cssnano')({ preset: 'default' }) : null, diff --git a/scripts/build.mjs b/scripts/build.mjs deleted file mode 100755 index 45ef6ca..0000000 --- a/scripts/build.mjs +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env node - -import { nodeExternalsPlugin } from 'esbuild-node-externals'; -import esbuild from 'esbuild'; - -const dist = process.argv.includes('--dist') || process.env.NODE_ENV === 'production'; -const watch = !dist && process.argv.includes('--watch'); -const entries = ['src/index.tsx']; - -const a = esbuild.build({ - logLevel: 'info', - entryPoints: entries, - minify: !watch, - bundle: true, - splitting: true, - format: 'esm', - target: 'es6', - plugins: [nodeExternalsPlugin()], - minify: dist, - sourcemap: 'both', - outdir: 'dist/esm', - loader: { '.css': 'text' }, - outbase: './', - incremental: watch, - watch, -}); - -const b = esbuild.build({ - logLevel: 'info', - entryPoints: entries, - minify: !watch, - bundle: true, - format: 'cjs', - target: 'es6', - plugins: [nodeExternalsPlugin()], - minify: dist, - sourcemap: 'both', - outdir: 'dist/cjs', - loader: { '.css': 'text' }, - outbase: './', - incremental: watch, - watch, -}); - -await Promise.all([a, b]); diff --git a/src/Features.tsx b/src/Features.tsx index 69e0f0a..50b3514 100644 --- a/src/Features.tsx +++ b/src/Features.tsx @@ -1,6 +1,7 @@ -import React, { +import { type ReactNode, useEffect, + useLayoutEffect, useMemo, useReducer, useRef, @@ -44,7 +45,7 @@ export function Features({ initialFeaturesState, ); - useEffect(() => { + useLayoutEffect(() => { /// Load defaults defaultsDispatch({ type: 'INIT', features }); return () => { @@ -52,7 +53,7 @@ export function Features({ }; }, [features]); - useEffect(() => { + useLayoutEffect(() => { let f: Record = {}; if (storage != null) { try { @@ -69,7 +70,7 @@ export function Features({ overridesDispatch({ type: 'INIT', - features: featuresRef.current + features: (featuresRef.current ?? []) .filter((x) => x.noOverride !== true) .map((x) => ({ name: x.name, diff --git a/src/FeaturesState.tsx b/src/FeaturesState.tsx index ac5f6f3..317b0b2 100644 --- a/src/FeaturesState.tsx +++ b/src/FeaturesState.tsx @@ -64,7 +64,7 @@ export function featuresReducer( ): FeaturesState { switch (action.type) { case 'INIT': { - if (action.features.length === 0) { + if (!action.features || action.features.length === 0) { return state; } diff --git a/src/ToggleFeatures.tsx b/src/ToggleFeatures.tsx index 7f9a4c5..8eedfff 100644 --- a/src/ToggleFeatures.tsx +++ b/src/ToggleFeatures.tsx @@ -1,10 +1,5 @@ import { RadioGroup } from '@headlessui/react'; -import React, { - type ReactNode, - useCallback, - useContext, - useState, -} from 'react'; +import { type ReactNode, useCallback, useContext, useState } from 'react'; import ReactDOM from 'react-dom'; import { FeatureContext } from './FeatureContext'; diff --git a/src/index.spec.tsx b/src/index.spec.tsx index 56eac27..bbe8a64 100644 --- a/src/index.spec.tsx +++ b/src/index.spec.tsx @@ -1,4 +1,4 @@ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import * as React from 'react'; import { FeatureContext } from './FeatureContext'; @@ -119,47 +119,68 @@ describe('Basic Features', () => { expect(r2.current).toBe(true); }); - it('default-enabled should be enabled by default', () => { - const { result: r1, unmount: u1 } = renderHook( - () => useEnabled('Default Enabled'), - { - wrapper: Features, - initialProps: { features: featuresB }, - }, + it('default-enabled should be enabled by default', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} ); - u1(); - const { result: r2, unmount: u2 } = renderHook( - () => useDisabled('Default Enabled'), - { - wrapper: Features, - initialProps: { features: featuresB }, + + const { result } = renderHook( + () => { + const enabled = useEnabled('Default Enabled'); + const context = React.useContext(FeatureContext); + return { + enabled, + defaultsState: context?.defaultsState, + }; }, + { wrapper: Wrapper }, ); - expect(r1.current).toBe(true); - expect(r2.current).toBe(false); - u2(); + + // Wait for the states to be initialized (from 'idle' to 'ready') + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + + // Now check the actual value + expect(result.current.enabled).toBe(true); }); - it('changes are persisted', () => { + it('changes are persisted', async () => { const storage = new LocalStorageMock(); + const Wrapper1 = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + const { result: r1, unmount: u1 } = renderHook( () => { const f1 = useEnabled('Feature 1'); const f2 = useDisabled('Feature 2'); const f3 = useEnabled('Feature 3'); const x = React.useContext(FeatureContext); - return { f1, f2, f3, g: x?.overridesSend }; - }, - { - wrapper: Features, - initialProps: { features: featuresA, storage: storage }, + return { + f1, + f2, + f3, + g: x?.overridesSend, + defaultsState: x?.defaultsState, + }; }, + { wrapper: Wrapper1 }, ); - expect(r1.current.f1).toBe(false); - expect(r1.current.f2).toBe(true); - expect(r1.current.f3).toBe(false); + // Wait for initialization + await waitFor(() => { + expect(r1.current.defaultsState?.value).toBe('ready'); + }); + + await waitFor(() => { + expect(r1.current.f1).toBe(false); + expect(r1.current.f2).toBe(true); + expect(r1.current.f3).toBe(false); + }); act(() => { if (r1.current.g != null) { @@ -169,29 +190,47 @@ describe('Basic Features', () => { } }); - expect(r1.current.f1).toBe(true); - expect(r1.current.f2).toBe(false); - expect(r1.current.f3).toBe(true); + await waitFor(() => { + expect(r1.current.f1).toBe(true); + expect(r1.current.f2).toBe(false); + expect(r1.current.f3).toBe(true); + }); u1(); + const Wrapper2 = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + const { result: r2, unmount: u2 } = renderHook( () => { const f1 = useEnabled('Feature 1'); const f2 = useDisabled('Feature 2'); const f3 = useEnabled('Feature 3'); const x = React.useContext(FeatureContext); - return { f1, f2, f3, g: x?.overridesSend }; - }, - { - wrapper: Features, - initialProps: { features: featuresA, storage: storage }, + return { + f1, + f2, + f3, + g: x?.overridesSend, + defaultsState: x?.defaultsState, + }; }, + { wrapper: Wrapper2 }, ); - expect(r2.current.f1).toBe(r1.current.f1); - expect(r2.current.f2).toBe(r1.current.f2); - expect(r2.current.f3).toBe(r1.current.f3); + // Wait for initialization + await waitFor(() => { + expect(r2.current.defaultsState?.value).toBe('ready'); + }); + + await waitFor(() => { + expect(r2.current.f1).toBe(r1.current.f1); + expect(r2.current.f2).toBe(r1.current.f2); + expect(r2.current.f3).toBe(r1.current.f3); + }); expect(storage.getItem('react-enable:feature-values')).toEqual( '{"overrides":{"Feature 1":true,"Feature 2":true,"Feature 3":true}}', ); @@ -213,18 +252,33 @@ describe('Basic Features', () => { unmount(); }); - it('feature should be enabled after enabling', () => { + it('feature should be enabled after enabling', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result, unmount } = renderHook( () => { const f1 = useEnabled('Feature 1'); const f2 = useDisabled('Feature 1'); const f3 = useEnabled('Feature 2'); const x = React.useContext(FeatureContext); - return { f1, f2, f3, g: x?.overridesSend }; + return { + f1, + f2, + f3, + g: x?.overridesSend, + defaultsState: x?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: featuresA } }, + { wrapper: Wrapper }, ); + // Wait for initialization + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.f3).toBe(false); act(() => { @@ -233,35 +287,55 @@ describe('Basic Features', () => { } }); - expect(result.current.f1).toBe(true); - expect(result.current.f2).toBe(false); - expect(result.current.f3).toBe(false); + await waitFor(() => { + expect(result.current.f1).toBe(true); + expect(result.current.f2).toBe(false); + expect(result.current.f3).toBe(false); + }); unmount(); }); - it('default-enabled should be possible to disable', () => { + it('default-enabled should be possible to disable', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result } = renderHook( () => { const f1 = useEnabled('Default Enabled'); const f2 = useDisabled('Default Enabled'); const f3 = useEnabled('Feature 2'); const x = React.useContext(FeatureContext); - return { f1, f2, f3, g: x?.overridesSend }; + return { + f1, + f2, + f3, + g: x?.overridesSend, + defaultsState: x?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: featuresB } }, + { wrapper: Wrapper }, ); + // Wait for initialization + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.f1).toBe(true); expect(result.current.f2).toBe(false); expect(result.current.f3).toBe(false); + act(() => { if (result.current.g != null) { result.current.g({ type: 'DISABLE', name: 'Default Enabled' }); } }); - expect(result.current.f1).toBe(false); - expect(result.current.f2).toBe(true); - expect(result.current.f3).toBe(false); + await waitFor(() => { + expect(result.current.f1).toBe(false); + expect(result.current.f2).toBe(true); + expect(result.current.f3).toBe(false); + }); }); }); diff --git a/src/integration.spec.tsx b/src/integration.spec.tsx index 8e31da6..4dec131 100644 --- a/src/integration.spec.tsx +++ b/src/integration.spec.tsx @@ -1,4 +1,4 @@ -import { act, renderHook } from '@testing-library/react-hooks'; +import { act, renderHook, waitFor } from '@testing-library/react'; import * as React from 'react'; import { FeatureContext } from './FeatureContext'; @@ -58,84 +58,149 @@ describe('Integration Tests - Public API', () => { }); describe('useEnabled and useDisabled', () => { - it('should handle arrays of features correctly', () => { + it('should handle arrays of features correctly', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result } = renderHook( - () => ({ - anyEnabled: useEnabled(['Feature1', 'Feature2']), - anyDisabled: useDisabled(['Feature1', 'Feature2']), - }), - { wrapper: Features, initialProps: { features: baseFeatures } }, + () => { + const context = React.useContext(FeatureContext); + return { + anyEnabled: useEnabled(['Feature1', 'Feature2']), + anyDisabled: useDisabled(['Feature1', 'Feature2']), + defaultsState: context?.defaultsState, + }; + }, + { wrapper: Wrapper }, ); + // Wait for initialization + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.anyEnabled).toBe(true); // Feature2 is enabled expect(result.current.anyDisabled).toBe(true); // Feature1 is disabled }); - it('should update when features are toggled', () => { + it('should update when features are toggled', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result, unmount } = renderHook( () => { const enabled = useEnabled('Feature1'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.overridesSend }; + return { + enabled, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: baseFeatures } }, + { wrapper: Wrapper }, ); + // Wait for initialization + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.enabled).toBe(false); act(() => { result.current.dispatch?.({ type: 'TOGGLE', name: 'Feature1' }); }); - expect(result.current.enabled).toBe(true); + await waitFor(() => { + expect(result.current.enabled).toBe(true); + }); unmount(); }); - it('should handle enable and disable actions', () => { + it('should handle enable and disable actions', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result, unmount } = renderHook( () => { const enabled = useEnabled('Feature1'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.overridesSend }; + return { + enabled, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: baseFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.enabled).toBe(false); act(() => { result.current.dispatch?.({ type: 'ENABLE', name: 'Feature1' }); }); - expect(result.current.enabled).toBe(true); + await waitFor(() => { + expect(result.current.enabled).toBe(true); + }); act(() => { result.current.dispatch?.({ type: 'DISABLE', name: 'Feature1' }); }); - expect(result.current.enabled).toBe(false); + await waitFor(() => { + expect(result.current.enabled).toBe(false); + }); unmount(); }); }); describe('useAllEnabled and useAllDisabled', () => { - it('should return true when all features in list are enabled', () => { - const { result } = renderHook(() => useAllEnabled(['Feature2']), { - wrapper: Features, - initialProps: { features: baseFeatures }, - }); + it('should return true when all features in list are enabled', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + + const { result } = renderHook( + () => { + const res = useAllEnabled(['Feature2']); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; + }, + { wrapper: Wrapper }, + ); - expect(result.current).toBe(true); // Feature2 is enabled + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.res).toBe(true); // Feature2 is enabled }); - it('should update when features are enabled', () => { + it('should update when features are enabled', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result, unmount } = renderHook( () => { const allEnabled = useAllEnabled(['Feature1', 'Feature2']); const context = React.useContext(FeatureContext); - return { allEnabled, dispatch: context?.overridesSend }; + return { + allEnabled, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: baseFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.allEnabled).toBe(false); act(() => { @@ -148,7 +213,7 @@ describe('Integration Tests - Public API', () => { }); describe('force flag behavior', () => { - it('should respect force flag and ignore overrides', () => { + it('should respect force flag and ignore overrides', async () => { const forcedFeatures: FeatureDescription[] = [ { name: 'ForcedOn', @@ -164,16 +229,28 @@ describe('Integration Tests - Public API', () => { }, ]; + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result } = renderHook( () => { const forcedOn = useEnabled('ForcedOn'); const forcedOff = useDisabled('ForcedOff'); const context = React.useContext(FeatureContext); - return { forcedOn, forcedOff, dispatch: context?.overridesSend }; + return { + forcedOn, + forcedOff, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: forcedFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.forcedOn).toBe(true); expect(result.current.forcedOff).toBe(true); @@ -183,13 +260,14 @@ describe('Integration Tests - Public API', () => { result.current.dispatch?.({ type: 'ENABLE', name: 'ForcedOff' }); }); + // Force flags should prevent changes expect(result.current.forcedOn).toBe(true); expect(result.current.forcedOff).toBe(true); }); }); describe('noOverride flag behavior', () => { - it('should allow reading but prevent user overrides', () => { + it('should allow reading but prevent user overrides', async () => { const noOverrideFeatures: FeatureDescription[] = [ { name: 'NoOverride', @@ -199,15 +277,26 @@ describe('Integration Tests - Public API', () => { }, ]; + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result } = renderHook( () => { const enabled = useEnabled('NoOverride'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.overridesSend }; + return { + enabled, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: noOverrideFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.enabled).toBe(true); // UI should respect noOverride, but the state machine will still accept the action @@ -222,54 +311,89 @@ describe('Integration Tests - Public API', () => { }); describe('persistence integration', () => { - it('should persist and restore feature state', () => { + it('should persist and restore feature state', async () => { const storage = new LocalStorageMock(); + const Wrapper1 = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + const { result: firstResult, unmount } = renderHook( () => { const enabled = useEnabled('Feature1'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.overridesSend }; - }, - { - wrapper: Features, - initialProps: { features: baseFeatures, storage }, + return { + enabled, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, + { wrapper: Wrapper1 }, ); + await waitFor(() => { + expect(firstResult.current.defaultsState?.value).toBe('ready'); + }); expect(firstResult.current.enabled).toBe(false); act(() => { firstResult.current.dispatch?.({ type: 'ENABLE', name: 'Feature1' }); }); - expect(firstResult.current.enabled).toBe(true); + await waitFor(() => { + expect(firstResult.current.enabled).toBe(true); + }); unmount(); // Create new instance with same storage + const Wrapper2 = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + const { result: secondResult } = renderHook( - () => useEnabled('Feature1'), - { - wrapper: Features, - initialProps: { features: baseFeatures, storage }, + () => { + const res = useEnabled('Feature1'); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; }, + { wrapper: Wrapper2 }, ); - expect(secondResult.current).toBe(true); + await waitFor(() => { + expect(secondResult.current.defaultsState?.value).toBe('ready'); + }); + expect(secondResult.current.res).toBe(true); }); - it('should handle SET_ALL action', () => { + it('should handle SET_ALL action', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result } = renderHook( () => { const f1 = useEnabled('Feature1'); const f2 = useEnabled('Feature2'); const f3 = useEnabled('Feature3'); const context = React.useContext(FeatureContext); - return { f1, f2, f3, dispatch: context?.overridesSend }; + return { + f1, + f2, + f3, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: baseFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.f1).toBe(false); expect(result.current.f2).toBe(true); expect(result.current.f3).toBe(false); @@ -281,38 +405,55 @@ describe('Integration Tests - Public API', () => { }); }); - expect(result.current.f1).toBe(true); - expect(result.current.f2).toBe(false); - expect(result.current.f3).toBe(true); + await waitFor(() => { + expect(result.current.f1).toBe(true); + expect(result.current.f2).toBe(false); + expect(result.current.f3).toBe(true); + }); }); - it('should handle UNSET action to revert to defaults', () => { + it('should handle UNSET action to revert to defaults', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result } = renderHook( () => { const enabled = useEnabled('Feature1'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.overridesSend }; + return { + enabled, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: baseFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.enabled).toBe(false); act(() => { result.current.dispatch?.({ type: 'ENABLE', name: 'Feature1' }); }); - expect(result.current.enabled).toBe(true); + await waitFor(() => { + expect(result.current.enabled).toBe(true); + }); act(() => { result.current.dispatch?.({ type: 'UNSET', name: 'Feature1' }); }); - expect(result.current.enabled).toBe(false); // Back to default + await waitFor(() => { + expect(result.current.enabled).toBe(false); + }); // Back to default }); }); describe('async onChangeDefault', () => { it('should handle async feature changes', async () => { - const onChangeMock = jest.fn().mockResolvedValue(true); + const onChangeMock = vi.fn().mockResolvedValue(true); const asyncFeatures: FeatureDescription[] = [ { name: 'AsyncFeature', @@ -322,29 +463,40 @@ describe('Integration Tests - Public API', () => { }, ]; - const { result, waitForNextUpdate } = renderHook( + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + + const { result } = renderHook( () => { const enabled = useEnabled('AsyncFeature'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.defaultsSend }; + return { + enabled, + dispatch: context?.defaultsSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: asyncFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.enabled).toBe(false); act(() => { result.current.dispatch?.({ type: 'ENABLE', name: 'AsyncFeature' }); }); - await waitForNextUpdate(); - - expect(onChangeMock).toHaveBeenCalledWith('AsyncFeature', true); - expect(result.current.enabled).toBe(true); + await waitFor(() => { + expect(onChangeMock).toHaveBeenCalledWith('AsyncFeature', true); + expect(result.current.enabled).toBe(true); + }); }); it('should handle async feature changes that reject', async () => { - const onChangeMock = jest + const onChangeMock = vi .fn() .mockRejectedValue(new Error('Backend error')); const asyncFeatures: FeatureDescription[] = [ @@ -356,30 +508,41 @@ describe('Integration Tests - Public API', () => { }, ]; - const { result, waitForNextUpdate } = renderHook( + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + + const { result } = renderHook( () => { const enabled = useEnabled('AsyncFeature'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.defaultsSend }; + return { + enabled, + dispatch: context?.defaultsSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: asyncFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.enabled).toBe(false); act(() => { result.current.dispatch?.({ type: 'ENABLE', name: 'AsyncFeature' }); }); - await waitForNextUpdate(); - - expect(onChangeMock).toHaveBeenCalledWith('AsyncFeature', true); - // Should revert to undefined/unset on error - expect(result.current.enabled).toBe(false); + await waitFor(() => { + expect(onChangeMock).toHaveBeenCalledWith('AsyncFeature', true); + // Should revert to undefined/unset on error + expect(result.current.enabled).toBe(false); + }); }); it('should handle async feature that returns different value', async () => { - const onChangeMock = jest.fn().mockResolvedValue(false); + const onChangeMock = vi.fn().mockResolvedValue(false); const asyncFeatures: FeatureDescription[] = [ { name: 'AsyncFeature', @@ -389,105 +552,200 @@ describe('Integration Tests - Public API', () => { }, ]; - const { result, waitForNextUpdate } = renderHook( + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + + const { result } = renderHook( () => { const enabled = useEnabled('AsyncFeature'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.defaultsSend }; + return { + enabled, + dispatch: context?.defaultsSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: asyncFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(result.current.enabled).toBe(false); act(() => { result.current.dispatch?.({ type: 'ENABLE', name: 'AsyncFeature' }); }); - await waitForNextUpdate(); - - expect(onChangeMock).toHaveBeenCalledWith('AsyncFeature', true); - // Backend returned false instead of true - expect(result.current.enabled).toBe(false); + await waitFor(() => { + expect(onChangeMock).toHaveBeenCalledWith('AsyncFeature', true); + // Backend returned false instead of true + expect(result.current.enabled).toBe(false); + }); }); }); describe('console override integration', () => { - it('should expose window.feature when disableConsole is false (default)', () => { - const { unmount } = renderHook(() => useEnabled('Feature1'), { - wrapper: Features, - initialProps: { features: baseFeatures, disableConsole: false }, - }); + it('should expose window.feature when disableConsole is false (default)', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + + const { result, unmount } = renderHook( + () => { + const res = useEnabled('Feature1'); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; + }, + { wrapper: Wrapper }, + ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(window.feature).toBeDefined(); expect(window.feature?.listFeatures).toBeDefined(); unmount(); }); - it('should not expose window.feature when disableConsole is true', () => { - const { unmount } = renderHook(() => useEnabled('Feature1'), { - wrapper: Features, - initialProps: { features: baseFeatures, disableConsole: true }, - }); + it('should not expose window.feature when disableConsole is true', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + const { result, unmount } = renderHook( + () => { + const res = useEnabled('Feature1'); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; + }, + { wrapper: Wrapper }, + ); + + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); expect(window.feature).toBeUndefined(); unmount(); }); - it('should allow enabling features via window.feature', () => { - const { result, unmount } = renderHook(() => useEnabled('Feature1'), { - wrapper: Features, - initialProps: { features: baseFeatures, disableConsole: false }, - }); + it('should allow enabling features via window.feature', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); - expect(result.current).toBe(false); + const { result, unmount } = renderHook( + () => { + const res = useEnabled('Feature1'); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; + }, + { wrapper: Wrapper }, + ); + + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.res).toBe(false); act(() => { window.feature?.enable('Feature1'); }); - expect(result.current).toBe(true); + await waitFor(() => { + expect(result.current.res).toBe(true); + }); unmount(); }); - it('should allow disabling features via window.feature', () => { - const { result, unmount } = renderHook(() => useEnabled('Feature2'), { - wrapper: Features, - initialProps: { features: baseFeatures, disableConsole: false }, - }); + it('should allow disabling features via window.feature', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + + const { result, unmount } = renderHook( + () => { + const res = useEnabled('Feature2'); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; + }, + { wrapper: Wrapper }, + ); - expect(result.current).toBe(true); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.res).toBe(true); act(() => { window.feature?.disable('Feature2'); }); - expect(result.current).toBe(false); + await waitFor(() => { + expect(result.current.res).toBe(false); + }); unmount(); }); - it('should allow toggling features via window.feature', () => { - const { result, unmount } = renderHook(() => useEnabled('Feature1'), { - wrapper: Features, - initialProps: { features: baseFeatures, disableConsole: false }, - }); + it('should allow toggling features via window.feature', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); - expect(result.current).toBe(false); + const { result, unmount } = renderHook( + () => { + const res = useEnabled('Feature1'); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; + }, + { wrapper: Wrapper }, + ); + + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + expect(result.current.res).toBe(false); act(() => { window.feature?.toggle('Feature1'); }); - expect(result.current).toBe(true); + await waitFor(() => { + expect(result.current.res).toBe(true); + }); unmount(); }); - it('should list all features via window.feature', () => { - const { unmount } = renderHook(() => useEnabled('Feature1'), { - wrapper: Features, - initialProps: { features: baseFeatures, disableConsole: false }, - }); + it('should list all features via window.feature', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + + {children} + + ); + const { result, unmount } = renderHook( + () => { + const res = useEnabled('Feature1'); + const context = React.useContext(FeatureContext); + return { res, defaultsState: context?.defaultsState }; + }, + { wrapper: Wrapper }, + ); + + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); const features = window.feature?.listFeatures(); expect(features).toHaveLength(3); expect(features?.map((f) => f[0])).toEqual([ @@ -518,16 +776,28 @@ describe('Integration Tests - Public API', () => { expect(result.current).toBe(false); }); - it('should handle rapid state changes', () => { + it('should handle rapid state changes', async () => { + const Wrapper = ({ children }: { children?: React.ReactNode }) => ( + {children} + ); + const { result } = renderHook( () => { const enabled = useEnabled('Feature1'); const context = React.useContext(FeatureContext); - return { enabled, dispatch: context?.overridesSend }; + return { + enabled, + dispatch: context?.overridesSend, + defaultsState: context?.defaultsState, + }; }, - { wrapper: Features, initialProps: { features: baseFeatures } }, + { wrapper: Wrapper }, ); + await waitFor(() => { + expect(result.current.defaultsState?.value).toBe('ready'); + }); + act(() => { result.current.dispatch?.({ type: 'ENABLE', name: 'Feature1' }); result.current.dispatch?.({ type: 'DISABLE', name: 'Feature1' }); @@ -536,7 +806,9 @@ describe('Integration Tests - Public API', () => { }); // Final state should reflect the last action - expect(result.current.enabled).toBe(true); + await waitFor(() => { + expect(result.current.enabled).toBe(true); + }); }); }); }); diff --git a/src/setupTests.ts b/src/setupTests.ts index 7b0828b..bb02c60 100644 --- a/src/setupTests.ts +++ b/src/setupTests.ts @@ -1 +1 @@ -import '@testing-library/jest-dom'; +import '@testing-library/jest-dom/vitest'; diff --git a/src/tailwind.css b/src/tailwind.css index b504475..559f2c0 100644 --- a/src/tailwind.css +++ b/src/tailwind.css @@ -1,5 +1,113 @@ +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + /* -! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com +! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com */ /* @@ -30,9 +138,13 @@ 2. Prevent adjustments of font size after orientation changes in iOS. 3. Use a more readable tab size. 4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS */ -html { +html, +:host { line-height: 1.5; /* 1 */ -webkit-text-size-adjust: 100%; @@ -42,8 +154,14 @@ html { -o-tab-size: 4; tab-size: 4; /* 3 */ - font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ } /* @@ -115,8 +233,10 @@ strong { } /* -1. Use the user's configured `mono` font family by default. -2. Correct the odd `em` font sizing in all browsers. +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. */ code, @@ -125,8 +245,12 @@ samp, pre { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ - font-size: 1em; + font-feature-settings: normal; /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ } /* @@ -185,10 +309,18 @@ select, textarea { font-family: inherit; /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ font-size: 100%; /* 1 */ + font-weight: inherit; + /* 1 */ line-height: inherit; /* 1 */ + letter-spacing: inherit; + /* 1 */ color: inherit; /* 1 */ margin: 0; @@ -212,9 +344,9 @@ select { */ button, -[type='button'], -[type='reset'], -[type='submit'] { +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { -webkit-appearance: button; /* 1 */ background-color: transparent; @@ -333,6 +465,14 @@ menu { padding: 0; } +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + /* Prevent resizing textareas horizontally by default. */ @@ -353,13 +493,6 @@ input::-moz-placeholder, textarea::-moz-placeholder { /* 2 */ } -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - input::placeholder, textarea::placeholder { opacity: 1; @@ -415,15 +548,13 @@ video { height: auto; } -/* -Ensure the default browser behavior of the `hidden` attribute. -*/ +/* Make elements with the HTML hidden attribute stay hidden by default */ -[hidden] { +[hidden]:where(:not([hidden="until-found"])) { display: none; } -[type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { +[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { -webkit-appearance: none; -moz-appearance: none; appearance: none; @@ -440,7 +571,7 @@ Ensure the default browser behavior of the `hidden` attribute. --tw-shadow: 0 0 #0000; } -[type='text']:focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { +[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { outline: 2px solid transparent; outline-offset: 2px; --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); @@ -458,11 +589,6 @@ input::-moz-placeholder, textarea::-moz-placeholder { opacity: 1; } -input:-ms-input-placeholder, textarea:-ms-input-placeholder { - color: #6b7280; - opacity: 1; -} - input::placeholder,textarea::placeholder { color: #6b7280; opacity: 1; @@ -474,6 +600,11 @@ input::placeholder,textarea::placeholder { ::-webkit-date-and-time-value { min-height: 1.5em; + text-align: inherit; +} + +::-webkit-datetime-edit { + display: inline-flex; } ::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field { @@ -488,17 +619,17 @@ select { background-size: 1.5em 1.5em; padding-right: 2.5rem; -webkit-print-color-adjust: exact; - color-adjust: exact; + print-color-adjust: exact; } -[multiple] { +[multiple],[size]:where(select:not([size="1"])) { background-image: initial; background-position: initial; background-repeat: unset; background-size: initial; padding-right: 0.75rem; -webkit-print-color-adjust: unset; - color-adjust: unset; + print-color-adjust: unset; } [type='checkbox'],[type='radio'] { @@ -507,13 +638,12 @@ select { appearance: none; padding: 0; -webkit-print-color-adjust: exact; - color-adjust: exact; + print-color-adjust: exact; display: inline-block; vertical-align: middle; background-origin: border-box; -webkit-user-select: none; -moz-user-select: none; - -ms-user-select: none; user-select: none; flex-shrink: 0; height: 1rem; @@ -557,10 +687,26 @@ select { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); } +@media (forced-colors: active) { + [type='checkbox']:checked { + -webkit-appearance: auto; + -moz-appearance: auto; + appearance: auto; + } +} + [type='radio']:checked { background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); } +@media (forced-colors: active) { + [type='radio']:checked { + -webkit-appearance: auto; + -moz-appearance: auto; + appearance: auto; + } +} + [type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus { border-color: transparent; background-color: currentColor; @@ -575,6 +721,14 @@ select { background-repeat: no-repeat; } +@media (forced-colors: active) { + [type='checkbox']:indeterminate { + -webkit-appearance: auto; + -moz-appearance: auto; + appearance: auto; + } +} + [type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { border-color: transparent; background-color: currentColor; @@ -591,54 +745,10 @@ select { } [type='file']:focus { + outline: 1px solid ButtonText; outline: 1px auto -webkit-focus-ring-color; } -*, ::before, ::after { - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} - .container { width: 100%; } @@ -706,17 +816,11 @@ select { } .-inset-px { - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; + inset: -1px; } .inset-0 { - top: 0px; - right: 0px; - bottom: 0px; - left: 0px; + inset: 0px; } .bottom-0 { @@ -736,32 +840,32 @@ select { margin-right: 1rem; } -.my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} - .mx-8 { margin-left: 2rem; margin-right: 2rem; } -.mt-4 { +.my-4 { margin-top: 1rem; + margin-bottom: 1rem; } .mt-1 { margin-top: 0.25rem; } -.mt-6 { - margin-top: 1.5rem; +.mt-4 { + margin-top: 1rem; } .mt-5 { margin-top: 1.25rem; } +.mt-6 { + margin-top: 1.5rem; +} + .inline-block { display: inline-block; } @@ -782,10 +886,6 @@ select { display: none; } -.h-7 { - height: 1.75rem; -} - .h-4 { height: 1rem; } @@ -794,12 +894,20 @@ select { height: 1.25rem; } +.h-6 { + height: 1.5rem; +} + +.h-7 { + height: 1.75rem; +} + .h-8 { height: 2rem; } -.h-6 { - height: 1.5rem; +.min-h-6 { + min-height: 1.5rem; } .min-h-screen { @@ -814,12 +922,20 @@ select { width: 1.25rem; } +.w-6 { + width: 1.5rem; +} + .w-8 { width: 2rem; } -.w-6 { - width: 1.5rem; +.min-w-4 { + min-width: 1rem; +} + +.min-w-6 { + min-width: 1.5rem; } .max-w-full { @@ -874,14 +990,14 @@ select { justify-content: center; } -.gap-2 { - gap: 0.5rem; -} - .gap-1 { gap: 0.25rem; } +.gap-2 { + gap: 0.5rem; +} + .gap-4 { gap: 1rem; } @@ -902,16 +1018,16 @@ select { overflow-y: auto; } -.rounded-sm { - border-radius: 0.125rem; +.rounded-full { + border-radius: 9999px; } .rounded-lg { border-radius: 0.5rem; } -.rounded-full { - border-radius: 9999px; +.rounded-sm { + border-radius: 0.125rem; } .border { @@ -922,103 +1038,103 @@ select { border-width: 2px; } -.border-orange-500 { +.border-blue-500 { --tw-border-opacity: 1; - border-color: rgb(249 115 22 / var(--tw-border-opacity)); + border-color: rgb(59 130 246 / var(--tw-border-opacity, 1)); } -.border-green-500 { +.border-gray-300 { --tw-border-opacity: 1; - border-color: rgb(34 197 94 / var(--tw-border-opacity)); + border-color: rgb(209 213 219 / var(--tw-border-opacity, 1)); } -.border-red-500 { +.border-gray-500 { --tw-border-opacity: 1; - border-color: rgb(239 68 68 / var(--tw-border-opacity)); + border-color: rgb(107 114 128 / var(--tw-border-opacity, 1)); } -.border-transparent { - border-color: transparent; +.border-green-500 { + --tw-border-opacity: 1; + border-color: rgb(34 197 94 / var(--tw-border-opacity, 1)); } -.border-gray-300 { +.border-orange-500 { --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); + border-color: rgb(249 115 22 / var(--tw-border-opacity, 1)); } -.border-blue-500 { +.border-red-500 { --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); + border-color: rgb(239 68 68 / var(--tw-border-opacity, 1)); } -.border-gray-500 { - --tw-border-opacity: 1; - border-color: rgb(107 114 128 / var(--tw-border-opacity)); +.border-transparent { + border-color: transparent; } .bg-blue-600 { --tw-bg-opacity: 1; - background-color: rgb(37 99 235 / var(--tw-bg-opacity)); + background-color: rgb(37 99 235 / var(--tw-bg-opacity, 1)); } .bg-white { --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.p-3 { - padding: 0.75rem; + background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); } .p-1 { padding: 0.25rem; } +.p-3 { + padding: 0.75rem; +} + .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; } -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - .px-4 { padding-left: 1rem; padding-right: 1rem; } -.pt-4 { - padding-top: 1rem; +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; } -.pb-10 { - padding-bottom: 2.5rem; +.pb-0 { + padding-bottom: 0px; } -.pt-5 { - padding-top: 1.25rem; +.pb-10 { + padding-bottom: 2.5rem; } .pb-4 { padding-bottom: 1rem; } -.pt-0 { - padding-top: 0px; -} - -.pb-0 { - padding-bottom: 0px; +.pl-4 { + padding-left: 1rem; } .pr-4 { padding-right: 1rem; } -.pl-4 { - padding-left: 1rem; +.pt-0 { + padding-top: 0px; +} + +.pt-4 { + padding-top: 1rem; +} + +.pt-5 { + padding-top: 1.25rem; } .text-left { @@ -1033,24 +1149,24 @@ select { vertical-align: bottom; } -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} - .text-base { font-size: 1rem; line-height: 1.5rem; } +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + .text-sm { font-size: 0.875rem; line-height: 1.25rem; } -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; +.text-xs { + font-size: 0.75rem; + line-height: 1rem; } .font-medium { @@ -1065,45 +1181,39 @@ select { line-height: 1.75rem; } -.text-gray-500 { +.text-blue-500 { --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); + color: rgb(59 130 246 / var(--tw-text-opacity, 1)); } -.text-gray-900 { +.text-gray-500 { --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); + color: rgb(107 114 128 / var(--tw-text-opacity, 1)); } -.text-orange-500 { +.text-gray-900 { --tw-text-opacity: 1; - color: rgb(249 115 22 / var(--tw-text-opacity)); + color: rgb(17 24 39 / var(--tw-text-opacity, 1)); } .text-green-500 { --tw-text-opacity: 1; - color: rgb(34 197 94 / var(--tw-text-opacity)); + color: rgb(34 197 94 / var(--tw-text-opacity, 1)); } -.text-red-500 { +.text-orange-500 { --tw-text-opacity: 1; - color: rgb(239 68 68 / var(--tw-text-opacity)); + color: rgb(249 115 22 / var(--tw-text-opacity, 1)); } -.text-blue-500 { +.text-red-500 { --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); + color: rgb(239 68 68 / var(--tw-text-opacity, 1)); } .text-white { --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + color: rgb(255 255 255 / var(--tw-text-opacity, 1)); } .shadow { @@ -1112,6 +1222,12 @@ select { box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + .shadow-xl { --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); @@ -1126,12 +1242,12 @@ select { .ring-blue-500 { --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1)); } .ring-gray-500 { --tw-ring-opacity: 1; - --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity)); + --tw-ring-color: rgb(107 114 128 / var(--tw-ring-opacity, 1)); } .invert { @@ -1162,7 +1278,7 @@ select { .focus\:ring-blue-600:focus { --tw-ring-opacity: 1; - --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); + --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity, 1)); } .focus\:ring-offset-2:focus { diff --git a/src/useConsoleOverride.spec.tsx b/src/useConsoleOverride.spec.tsx index 4be9c0f..c5ceedd 100644 --- a/src/useConsoleOverride.spec.tsx +++ b/src/useConsoleOverride.spec.tsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { FeatureDescription, FeatureValue } from './FeatureState'; import type { FeaturesDispatch } from './FeaturesState'; import { GlobalEnable } from './GlobalEnable'; @@ -14,13 +14,13 @@ describe('useConsoleOverride', () => { return name === 'Feature2'; }; - const mockDispatch: FeaturesDispatch = jest.fn(); + const mockDispatch: FeaturesDispatch = vi.fn(); beforeEach(() => { if (window.feature !== undefined) { window.feature = undefined; } - jest.clearAllMocks(); + vi.clearAllMocks(); }); afterEach(() => { @@ -87,7 +87,7 @@ describe('useConsoleOverride', () => { ...testFeatures, { name: 'Feature3', description: 'New', defaultValue: false }, ]; - const newDispatch: FeaturesDispatch = jest.fn(); + const newDispatch: FeaturesDispatch = vi.fn(); rerender({ features: newFeatures, dispatch: newDispatch }); @@ -124,16 +124,16 @@ describe('GlobalEnable', () => { { name: 'Feature2', description: 'Test Feature 2', defaultValue: true }, ]; - const mockTestFeature = jest.fn((name: string): FeatureValue => { + const mockTestFeature = vi.fn((name: string): FeatureValue => { return name === 'Feature2'; }); - const mockDispatch = jest.fn(); + const mockDispatch = vi.fn(); let globalEnable: GlobalEnable; beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); mockTestFeature.mockImplementation((name: string): FeatureValue => { return name === 'Feature2'; }); diff --git a/src/usePersist.spec.tsx b/src/usePersist.spec.tsx index 4503edb..2db8aa5 100644 --- a/src/usePersist.spec.tsx +++ b/src/usePersist.spec.tsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; import type { FeatureDescription } from './FeatureState'; import { @@ -134,7 +134,7 @@ describe('usePersist', () => { it('should handle storage setItem errors gracefully', () => { const storage = new LocalStorageMock(); - storage.setItem = jest.fn(() => { + storage.setItem = vi.fn(() => { throw new Error('Storage quota exceeded'); }); diff --git a/src/utils.spec.tsx b/src/utils.spec.tsx index 27bca07..2640544 100644 --- a/src/utils.spec.tsx +++ b/src/utils.spec.tsx @@ -1,4 +1,4 @@ -import { renderHook } from '@testing-library/react-hooks'; +import { renderHook } from '@testing-library/react'; // biome-ignore lint/style/useImportType: JSX requires React at runtime import * as React from 'react'; @@ -7,7 +7,7 @@ import type { FeatureValue } from './FeatureState'; import { useTestAndConvert } from './utils'; describe('useTestAndConvert', () => { - const mockTest = jest.fn((feature: string): FeatureValue => { + const mockTest = vi.fn((feature: string): FeatureValue => { return feature === 'EnabledFeature'; }); @@ -16,7 +16,7 @@ describe('useTestAndConvert', () => { ); beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); describe('context retrieval', () => { diff --git a/tailwind.config.js b/tailwind.config.cjs similarity index 100% rename from tailwind.config.js rename to tailwind.config.cjs diff --git a/tsconfig.json b/tsconfig.json index d238164..8f433d8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,29 @@ { "compilerOptions": { - "target": "es6", - "lib": [ - "es6", - "dom", - "es2016", - "es2017" - ], - "rootDirs": [ - "src" - ], - "importHelpers": true, - "removeComments": true, + // Modern target for better performance and smaller output + "target": "ES2020", + + // Modern module system + "module": "ESNext", + + // Modern module resolution (replaces "node16") + "moduleResolution": "bundler", + + // Standard libraries + "lib": ["ES2020", "DOM", "DOM.Iterable"], + + // React JSX runtime (modern) + "jsx": "react-jsx", + + // Type declaration settings + "declaration": true, + "declarationMap": true, + + // Source maps for debugging + "sourceMap": true, + + // Strict mode for better type safety + "strict": true, "noImplicitAny": true, "strictNullChecks": true, "noImplicitThis": true, @@ -19,22 +31,23 @@ "alwaysStrict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "forceConsistentCasingInFileNames": true, - "declaration": true, - "jsx": "react", + "noFallthroughCasesInSwitch": true, + + // Modern interop "esModuleInterop": true, - "baseUrl": ".", - "module": "esnext", - "outDir": "lib/esm", - "declarationDir": "dist", - "allowJs": true, - "skipLibCheck": true, "allowSyntheticDefaultImports": true, - "strict": true, - "noFallthroughCasesInSwitch": true, - "moduleResolution": "node", + "forceConsistentCasingInFileNames": true, + + // Import helpers for smaller output + "importHelpers": true, + + // Other useful settings + "skipLibCheck": true, "resolveJsonModule": true, - "isolatedModules": true + "isolatedModules": true, + + // Base directory + "baseUrl": "." }, "include": [ "./src/**/*.ts", @@ -42,6 +55,7 @@ ], "exclude": [ "node_modules", + "dist", "**/*.spec.ts", "**/*.spec.tsx" ] diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..d17cf74 --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,45 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + // Entry point + entry: ['src/index.tsx'], + + // Output formats: both ESM and CJS for maximum compatibility + format: ['esm', 'cjs'], + + // Generate TypeScript declaration files + dts: true, + + // Clean dist folder before building + clean: true, + + // Generate source maps for debugging + sourcemap: true, + + // Target modern browsers and Node.js + target: 'es2020', + + // Bundle dependencies (except externals) + bundle: true, + + // Split output for better tree-shaking + splitting: true, + + // Minify in production + minify: process.env.NODE_ENV === 'production', + + // External dependencies (don't bundle peer deps) + external: ['react', 'react-dom'], + + // Loader configuration for CSS files + loader: { + '.css': 'text', + }, + + // Output file naming + outDir: 'dist', + + // Include declaration maps for better IDE support + // This helps with go-to-definition in consuming projects + tsconfig: './tsconfig.json', +}); diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..162a57c --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,46 @@ +import { defineConfig } from 'vitest/config'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], + test: { + // Test environment + environment: 'jsdom', + + // Global test setup + globals: true, + + // Setup files + setupFiles: ['./src/setupTests.ts'], + + // Coverage configuration + coverage: { + provider: 'v8', + reporter: ['text', 'json', 'html'], + include: ['src/**/*.{ts,tsx}'], + exclude: [ + 'node_modules/', + 'dist/', + '**/*.spec.tsx', + '**/*.spec.ts', + 'src/setupTests.ts', + '**/*.config.*', + '**/test.tsx', + ], + }, + + // CSS module mocking + css: { + modules: { + classNameStrategy: 'non-scoped', + }, + }, + }, + + resolve: { + alias: { + // Map CSS imports to identity-obj-proxy equivalent + '\\.css$': 'identity-obj-proxy', + }, + }, +});