From 3419fb073165abcb4fd4021749d2cc0c728c468a Mon Sep 17 00:00:00 2001 From: maryliag Date: Sun, 19 Oct 2025 23:47:10 -0400 Subject: [PATCH 01/58] update exemple --- .../test/fixtures/kitchen-sink.yaml | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/experimental/packages/opentelemetry-configuration/test/fixtures/kitchen-sink.yaml b/experimental/packages/opentelemetry-configuration/test/fixtures/kitchen-sink.yaml index 85c40c0526e..f44e11628dd 100644 --- a/experimental/packages/opentelemetry-configuration/test/fixtures/kitchen-sink.yaml +++ b/experimental/packages/opentelemetry-configuration/test/fixtures/kitchen-sink.yaml @@ -8,13 +8,13 @@ # The file format version. # The yaml format is documented at # https://github.com/open-telemetry/opentelemetry-configuration/tree/main/schema -file_format: "1.0-rc.1" +file_format: "1.0-rc.2" # Configure if the SDK is disabled or not. # If omitted or null, false is used. disabled: false # Configure the log level of the internal logger used by the SDK. # If omitted, info is used. -log_level: debug +log_level: info # Configure general attribute limits. See also tracer_provider.limits, logger_provider.limits. attribute_limits: # Configure max attribute value size. @@ -200,12 +200,6 @@ meter_provider: # Configure port. # If omitted or null, 9464 is used. port: 9464 - # Configure Prometheus Exporter to produce metrics without a unit suffix or UNIT metadata. - # If omitted or null, false is used. - without_units: false - # Configure Prometheus Exporter to produce metrics without a type suffix. - # If omitted or null, false is used. - without_type_suffix: false # Configure Prometheus Exporter to produce metrics without a scope info metric. # If omitted or null, false is used. without_scope_info: false @@ -225,6 +219,15 @@ meter_provider: # If omitted, .included resource attributes are included. excluded: - "service.attr1" + # Configure how Prometheus metrics are exposed. Values include: + # + # * UnderscoreEscapingWithSuffixes, the default. This fully escapes metric names for classic Prometheus metric name compatibility, and includes appending type and unit suffixes. + # * UnderscoreEscapingWithoutSuffixes, metric names will continue to escape special characters to _, but suffixes won't be attached. + # * NoUTF8EscapingWithSuffixes will disable changing special characters to _. Special suffixes like units and _total for counters will be attached. + # * NoTranslation. This strategy bypasses all metric and label name translation, passing them through unaltered. + # + # If omitted or null, UnderscoreEscapingWithSuffixes is used. + translation_strategy: UnderscoreEscapingWithSuffixes # Configure metric producers. producers: - # Configure metric producer to be opencensus. From 71c777d4667c1b265c879cba4112896742eacb87 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:20:04 -0400 Subject: [PATCH 02/58] add attribute from attribute list env variables --- experimental/CHANGELOG.md | 2 ++ .../src/EnvironmentConfigProvider.ts | 12 +++++++++++- .../opentelemetry-configuration/src/index.ts | 2 +- .../test/ConfigProvider.test.ts | 12 ++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index e81dec8e1d2..ff9dcab0852 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -6,6 +6,8 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ## Unreleased +* feat(opentelemetry-configuration): set attributes from attribute list from env variables [#6029](https://github.com/open-telemetry/opentelemetry-js/pull/6029) @maryliag + ### :boom: Breaking Changes ### :rocket: Features diff --git a/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts b/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts index c96958a5d1e..c6969cb99a2 100644 --- a/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts +++ b/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts @@ -73,8 +73,18 @@ export function setResources(config: ConfigurationModel): void { } const resourceAttrList = getStringFromEnv('OTEL_RESOURCE_ATTRIBUTES'); - if (resourceAttrList) { + const list = getStringListFromEnv('OTEL_RESOURCE_ATTRIBUTES'); + if (list && list.length > 0) { config.resource.attributes_list = resourceAttrList; + config.resource.attributes = []; + for (let i = 0; i < list.length; i++) { + const element = list[i].split('='); + config.resource.attributes.push({ + name: element[0], + value: element[1], + type: 'string', + }); + } } const serviceName = getStringFromEnv('OTEL_SERVICE_NAME'); diff --git a/experimental/packages/opentelemetry-configuration/src/index.ts b/experimental/packages/opentelemetry-configuration/src/index.ts index c97ac1c4fad..fd2dcbefc6d 100644 --- a/experimental/packages/opentelemetry-configuration/src/index.ts +++ b/experimental/packages/opentelemetry-configuration/src/index.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export { EnvironmentConfigProvider } from './EnvironmentConfigProvider'; export type { ConfigProvider } from './IConfigProvider'; export type { ConfigurationModel as Configuration } from './models/configModel'; +export { createConfigProvider } from './ConfigProvider'; diff --git a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts index a85955b0ac2..0ad0c63f02c 100644 --- a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts +++ b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts @@ -809,6 +809,18 @@ describe('ConfigProvider', function () { resource: { attributes_list: 'service.namespace=my-namespace,service.version=1.0.0', + attributes: [ + { + name: 'service.namespace', + value: 'my-namespace', + type: 'string', + }, + { + name: 'service.version', + value: '1.0.0', + type: 'string', + }, + ], }, }; const configProvider = createConfigProvider(); From ad41ff23eba24e00fd33cd63e1f89a8d70050f49 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:25:01 -0400 Subject: [PATCH 03/58] add file --- .../src/FileConfigProvider.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts b/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts index 1da7cdc4dc5..bcd9902aab7 100644 --- a/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts +++ b/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts @@ -121,6 +121,20 @@ export function parseConfigFile(config: ConfigurationModel) { ); if (attrList) { config.resource.attributes_list = attrList; + const list = getStringListFromConfigFile( + parsedContent['resource']?.['attributes_list'] + ); + if (list && list.length > 0) { + config.resource.attributes = []; + for (let i = 0; i < list.length; i++) { + const element = list[i].split('='); + config.resource.attributes.push({ + name: element[0], + value: element[1], + type: 'string', + }); + } + } } const schemaUrl = getStringFromConfigFile( From 5060fe1a8bb7ec25d04b8fc502f6a2daf78d41b1 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:29:31 -0400 Subject: [PATCH 04/58] add check --- .../opentelemetry-configuration/src/FileConfigProvider.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts b/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts index bcd9902aab7..2ddd8a6c52c 100644 --- a/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts +++ b/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts @@ -124,7 +124,11 @@ export function parseConfigFile(config: ConfigurationModel) { const list = getStringListFromConfigFile( parsedContent['resource']?.['attributes_list'] ); - if (list && list.length > 0) { + if ( + list && + list.length > 0 && + parsedContent['resource']?.['attributes'] == null + ) { config.resource.attributes = []; for (let i = 0; i < list.length; i++) { const element = list[i].split('='); From 502a620be2d7e4935efaeaf4cfb455eb52636ca2 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:31:47 -0400 Subject: [PATCH 05/58] update changelog --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index ff9dcab0852..93ca1e3c020 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -6,7 +6,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ## Unreleased -* feat(opentelemetry-configuration): set attributes from attribute list from env variables [#6029](https://github.com/open-telemetry/opentelemetry-js/pull/6029) @maryliag +* feat(opentelemetry-configuration): set attributes from attribute list from env variables [#6043](https://github.com/open-telemetry/opentelemetry-js/pull/6043) @maryliag ### :boom: Breaking Changes From 7d137e8e0a1f17f9dd272c8e42370b282524c7dc Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:33:14 -0400 Subject: [PATCH 06/58] use config --- .../opentelemetry-sdk-node/src/sdk.ts | 30 +++++++------ .../opentelemetry-sdk-node/src/utils.ts | 45 +++++++++++++++---- .../opentelemetry-sdk-node/test/sdk.test.ts | 14 ------ .../test/util/resource-assertions.ts | 17 +++++-- 4 files changed, 67 insertions(+), 39 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index ec7ff0c8464..423101f0d00 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -63,19 +63,20 @@ import { } from '@opentelemetry/sdk-trace-node'; import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import { NodeSDKConfiguration } from './types'; -import { - getBooleanFromEnv, - getStringFromEnv, - getStringListFromEnv, - diagLogLevelFromString, -} from '@opentelemetry/core'; +import { getStringFromEnv, getStringListFromEnv } from '@opentelemetry/core'; import { getResourceDetectorsFromEnv, getSpanProcessorsFromEnv, getPropagatorFromEnv, setupPropagator, setupContextManager, + getServiceName, } from './utils'; +import { + ConfigProvider, + Configuration, + createConfigProvider, +} from '../../opentelemetry-configuration/build/src'; type TracerProviderConfig = { tracerConfig: NodeTracerConfig; @@ -221,6 +222,7 @@ function configureMetricProviderFromEnv(): IMetricReader[] { * nodeSdk.start(); // registers all configured SDK components */ export class NodeSDK { + config: Configuration; private _tracerProviderConfig?: TracerProviderConfig; private _loggerProviderConfig?: LoggerProviderConfig; private _meterProviderConfig?: MeterProviderConfig; @@ -243,16 +245,17 @@ export class NodeSDK { * Create a new NodeJS SDK instance */ public constructor(configuration: Partial = {}) { - if (getBooleanFromEnv('OTEL_SDK_DISABLED')) { + const configProvider: ConfigProvider = createConfigProvider(); + this.config = configProvider.getInstrumentationConfig(); + if (this.config.disabled) { this._disabled = true; // Functions with possible side-effects are set // to no-op via the _disabled flag } - const logLevel = getStringFromEnv('OTEL_LOG_LEVEL'); - if (logLevel != null) { + if (this.config.log_level != null) { diag.setLogger(new DiagConsoleLogger(), { - logLevel: diagLogLevelFromString(logLevel), + logLevel: this.config.log_level, }); } @@ -264,13 +267,14 @@ export class NodeSDK { this._resourceDetectors = []; } else if (configuration.resourceDetectors != null) { this._resourceDetectors = configuration.resourceDetectors; - } else if (getStringFromEnv('OTEL_NODE_RESOURCE_DETECTORS')) { - this._resourceDetectors = getResourceDetectorsFromEnv(); + } else if (this.config.node_resource_detectors) { + this._resourceDetectors = getResourceDetectorsFromEnv(this.config); } else { this._resourceDetectors = [envDetector, processDetector, hostDetector]; } - this._serviceName = configuration.serviceName; + this._serviceName = + configuration.serviceName ?? getServiceName(this.config); // If a tracer provider can be created from manual configuration, create it if ( diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index 691ac4c4753..6b5c1c8c0cb 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -50,6 +50,7 @@ import { import { B3InjectEncoding, B3Propagator } from '@opentelemetry/propagator-b3'; import { JaegerPropagator } from '@opentelemetry/propagator-jaeger'; import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks'; +import { Configuration } from '../../opentelemetry-configuration/build/src'; const RESOURCE_DETECTOR_ENVIRONMENT = 'env'; const RESOURCE_DETECTOR_HOST = 'host'; @@ -57,19 +58,25 @@ const RESOURCE_DETECTOR_OS = 'os'; const RESOURCE_DETECTOR_PROCESS = 'process'; const RESOURCE_DETECTOR_SERVICE_INSTANCE_ID = 'serviceinstance'; -export function getResourceDetectorsFromEnv(): Array { +export function getResourceDetectorsFromEnv( + config: Configuration +): Array { // When updating this list, make sure to also update the section `resourceDetectors` on README. const resourceDetectors = new Map([ [RESOURCE_DETECTOR_ENVIRONMENT, envDetector], [RESOURCE_DETECTOR_HOST, hostDetector], [RESOURCE_DETECTOR_OS, osDetector], - [RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, serviceInstanceIdDetector], [RESOURCE_DETECTOR_PROCESS, processDetector], ]); - const resourceDetectorsFromEnv = getStringListFromEnv( - 'OTEL_NODE_RESOURCE_DETECTORS' - ) ?? ['all']; + if (getInstanceID(config) == null) { + resourceDetectors.set( + RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, + serviceInstanceIdDetector + ); + } + + const resourceDetectorsFromEnv = config.node_resource_detectors ?? ['all']; if (resourceDetectorsFromEnv.includes('all')) { return [...resourceDetectors.values()].flat(); @@ -82,14 +89,36 @@ export function getResourceDetectorsFromEnv(): Array { return resourceDetectorsFromEnv.flatMap(detector => { const resourceDetector = resourceDetectors.get(detector); if (!resourceDetector) { - diag.warn( - `Invalid resource detector "${detector}" specified in the environment variable OTEL_NODE_RESOURCE_DETECTORS` - ); + diag.warn(`Invalid resource detector "${detector}" specified`); } return resourceDetector || []; }); } +export function getServiceName(config: Configuration): string | undefined { + if (config.resource?.attributes) { + for (let i = 0; i < config.resource.attributes.length; i++) { + const element = config.resource.attributes[i]; + if (element.name === 'service.name') { + return element.value?.toString(); + } + } + } + return undefined; +} + +export function getInstanceID(config: Configuration): string | undefined { + if (config.resource?.attributes) { + for (let i = 0; i < config.resource.attributes.length; i++) { + const element = config.resource.attributes[i]; + if (element.name === 'service.instance.id') { + return element.value?.toString(); + } + } + } + return undefined; +} + export function filterBlanksAndNulls(list: string[]): string[] { return list.map(item => item.trim()).filter(s => s !== 'null' && s !== ''); } diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 7ff7f377e68..44ac7d7e48a 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -174,20 +174,6 @@ describe('Node SDK', () => { sdk.shutdown(); }); - it('should not register a diag logger with OTEL_LOG_LEVEL unset', () => { - delete env.OTEL_LOG_LEVEL; - - const spy = Sinon.spy(diag, 'setLogger'); - const sdk = new NodeSDK({ - autoDetectResources: false, - }); - - sdk.start(); - - assert.strictEqual(spy.callCount, 0); - sdk.shutdown(); - }); - it('should register a tracer provider if an exporter is provided', async () => { const sdk = new NodeSDK({ traceExporter: new ConsoleSpanExporter(), diff --git a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts index 0938b6090fb..eb1d8819465 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts @@ -39,10 +39,19 @@ export const assertServiceResource = ( } ) => { assert.strictEqual(resource.attributes[ATTR_SERVICE_NAME], validations.name); - assert.strictEqual( - resource.attributes[ATTR_SERVICE_INSTANCE_ID], - validations.instanceId - ); + if (validations.instanceId) { + assert.strictEqual( + resource.attributes[ATTR_SERVICE_INSTANCE_ID], + validations.instanceId + ); + } else { + assert.notEqual( + resource.attributes[ATTR_SERVICE_INSTANCE_ID], + null, + `${ATTR_SERVICE_INSTANCE_ID} must not be null` + ); + } + if (validations.namespace) assert.strictEqual( resource.attributes[ATTR_SERVICE_NAMESPACE], From e95a598b5583f0687d2f1e96d1d5080262937793 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:34:15 -0400 Subject: [PATCH 07/58] update changelog --- experimental/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 93ca1e3c020..31ac5181c74 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -7,6 +7,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ## Unreleased * feat(opentelemetry-configuration): set attributes from attribute list from env variables [#6043](https://github.com/open-telemetry/opentelemetry-js/pull/6043) @maryliag +* feat(opentelemetry-sdk-node): use declarative config for resource attributes [#6044](https://github.com/open-telemetry/opentelemetry-js/pull/6044) @maryliag ### :boom: Breaking Changes From a158a9894b7b3c920235fbfce919e00d6426062a Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:46:37 -0400 Subject: [PATCH 08/58] improvements --- .../opentelemetry-sdk-node/src/sdk.ts | 16 ++++++++++++--- .../opentelemetry-sdk-node/src/utils.ts | 20 +------------------ 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 423101f0d00..5f87f305bf1 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -70,13 +70,14 @@ import { getPropagatorFromEnv, setupPropagator, setupContextManager, - getServiceName, + getInstanceID, } from './utils'; import { ConfigProvider, Configuration, createConfigProvider, } from '../../opentelemetry-configuration/build/src'; +import { ATTR_SERVICE_INSTANCE_ID } from '@opentelemetry/resources/src/semconv'; type TracerProviderConfig = { tracerConfig: NodeTracerConfig; @@ -273,8 +274,7 @@ export class NodeSDK { this._resourceDetectors = [envDetector, processDetector, hostDetector]; } - this._serviceName = - configuration.serviceName ?? getServiceName(this.config); + this._serviceName = configuration.serviceName; // If a tracer provider can be created from manual configuration, create it if ( @@ -390,6 +390,16 @@ export class NodeSDK { }) ); + const instanceId = getInstanceID(this.config); + this._resource = + instanceId === undefined + ? this._resource + : this._resource.merge( + resourceFromAttributes({ + [ATTR_SERVICE_INSTANCE_ID]: instanceId, + }) + ); + const spanProcessors = this._tracerProviderConfig ? this._tracerProviderConfig.spanProcessors : getSpanProcessorsFromEnv(); diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index 6b5c1c8c0cb..3c8deb077d3 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -66,16 +66,10 @@ export function getResourceDetectorsFromEnv( [RESOURCE_DETECTOR_ENVIRONMENT, envDetector], [RESOURCE_DETECTOR_HOST, hostDetector], [RESOURCE_DETECTOR_OS, osDetector], + [RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, serviceInstanceIdDetector], [RESOURCE_DETECTOR_PROCESS, processDetector], ]); - if (getInstanceID(config) == null) { - resourceDetectors.set( - RESOURCE_DETECTOR_SERVICE_INSTANCE_ID, - serviceInstanceIdDetector - ); - } - const resourceDetectorsFromEnv = config.node_resource_detectors ?? ['all']; if (resourceDetectorsFromEnv.includes('all')) { @@ -95,18 +89,6 @@ export function getResourceDetectorsFromEnv( }); } -export function getServiceName(config: Configuration): string | undefined { - if (config.resource?.attributes) { - for (let i = 0; i < config.resource.attributes.length; i++) { - const element = config.resource.attributes[i]; - if (element.name === 'service.name') { - return element.value?.toString(); - } - } - } - return undefined; -} - export function getInstanceID(config: Configuration): string | undefined { if (config.resource?.attributes) { for (let i = 0; i < config.resource.attributes.length; i++) { From 0a4d64f94be04c5f7a84c840759917f955d374b1 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 23 Oct 2025 23:58:41 -0400 Subject: [PATCH 09/58] increase test coverage --- .../test/ConfigProvider.test.ts | 15 ++++++++++++++- .../test/fixtures/short-config.yml | 4 +++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts index 0ad0c63f02c..f1942281940 100644 --- a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts +++ b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts @@ -1297,9 +1297,22 @@ describe('ConfigProvider', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = 'test/fixtures/short-config.yml'; const configProvider = createConfigProvider(); + const expectedConfig: Configuration = { + ...defaultConfig, + resource: { + attributes_list: 'service.instance.id=123', + attributes: [ + { + name: 'service.instance.id', + value: '123', + type: 'string', + }, + ], + }, + }; assert.deepStrictEqual( configProvider.getInstrumentationConfig(), - defaultConfig + expectedConfig ); }); diff --git a/experimental/packages/opentelemetry-configuration/test/fixtures/short-config.yml b/experimental/packages/opentelemetry-configuration/test/fixtures/short-config.yml index 984c87c34a8..0473fbd1b1e 100644 --- a/experimental/packages/opentelemetry-configuration/test/fixtures/short-config.yml +++ b/experimental/packages/opentelemetry-configuration/test/fixtures/short-config.yml @@ -1,2 +1,4 @@ file_format: "1.0-rc.1" -disabled: false \ No newline at end of file +disabled: false +resource: + attributes_list: service.instance.id=123 \ No newline at end of file From dc0b694534b90aea6914c5f56e8aa20a6d26d3cc Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 24 Oct 2025 00:08:42 -0400 Subject: [PATCH 10/58] fix lint --- .../opentelemetry-configuration/test/ConfigProvider.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts index f1942281940..4e47ec887a0 100644 --- a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts +++ b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts @@ -1297,7 +1297,7 @@ describe('ConfigProvider', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = 'test/fixtures/short-config.yml'; const configProvider = createConfigProvider(); - const expectedConfig: Configuration = { + const expectedConfig: Configuration = { ...defaultConfig, resource: { attributes_list: 'service.instance.id=123', From 045ad49029ce3e7a201cd85e4751de1e4728dc9f Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 24 Oct 2025 09:07:51 -0400 Subject: [PATCH 11/58] use package --- .../opentelemetry-configuration/package.json | 1 - .../opentelemetry-sdk-node/package.json | 1 + .../packages/opentelemetry-sdk-node/src/sdk.ts | 2 +- .../opentelemetry-sdk-node/tsconfig.json | 3 +++ package-lock.json | 17 +---------------- tsconfig.json | 1 + 6 files changed, 7 insertions(+), 18 deletions(-) diff --git a/experimental/packages/opentelemetry-configuration/package.json b/experimental/packages/opentelemetry-configuration/package.json index e278964a173..f2896714316 100644 --- a/experimental/packages/opentelemetry-configuration/package.json +++ b/experimental/packages/opentelemetry-configuration/package.json @@ -1,6 +1,5 @@ { "name": "@opentelemetry/configuration", - "private": true, "version": "0.207.0", "description": "OpenTelemetry Configuration", "main": "build/src/index.js", diff --git a/experimental/packages/opentelemetry-sdk-node/package.json b/experimental/packages/opentelemetry-sdk-node/package.json index 1b0c6ff8ba3..78de51c4bf6 100644 --- a/experimental/packages/opentelemetry-sdk-node/package.json +++ b/experimental/packages/opentelemetry-sdk-node/package.json @@ -44,6 +44,7 @@ }, "dependencies": { "@opentelemetry/api-logs": "0.207.0", + "@opentelemetry/configuration": "0.207.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.207.0", "@opentelemetry/exporter-logs-otlp-http": "0.207.0", diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 5f87f305bf1..2e4761e4e57 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -76,7 +76,7 @@ import { ConfigProvider, Configuration, createConfigProvider, -} from '../../opentelemetry-configuration/build/src'; +} from '@opentelemetry/configuration'; import { ATTR_SERVICE_INSTANCE_ID } from '@opentelemetry/resources/src/semconv'; type TracerProviderConfig = { diff --git a/experimental/packages/opentelemetry-sdk-node/tsconfig.json b/experimental/packages/opentelemetry-sdk-node/tsconfig.json index 5f842b7af04..b197f6dad3e 100644 --- a/experimental/packages/opentelemetry-sdk-node/tsconfig.json +++ b/experimental/packages/opentelemetry-sdk-node/tsconfig.json @@ -63,6 +63,9 @@ { "path": "../exporter-trace-otlp-proto" }, + { + "path": "../opentelemetry-configuration" + }, { "path": "../opentelemetry-exporter-metrics-otlp-grpc" }, diff --git a/package-lock.json b/package-lock.json index 60381ec8049..b4b4ab68169 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1167,6 +1167,7 @@ "license": "Apache-2.0", "dependencies": { "@opentelemetry/api-logs": "0.207.0", + "@opentelemetry/configuration": "0.207.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/exporter-logs-otlp-grpc": "0.207.0", "@opentelemetry/exporter-logs-otlp-http": "0.207.0", @@ -1335,22 +1336,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "experimental/packages/sampler-composite/node_modules/@opentelemetry/resources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.0.1.tgz", - "integrity": "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw==", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.0.1", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, "experimental/packages/sampler-composite/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", diff --git a/tsconfig.json b/tsconfig.json index 58f4ff7e340..9adffd58306 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,7 @@ "experimental/packages/exporter-trace-otlp-http", "experimental/packages/exporter-trace-otlp-proto", "experimental/packages/opentelemetry-browser-detector", + "experimental/packages/opentelemetry-configuration", "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc", "experimental/packages/opentelemetry-exporter-metrics-otlp-http", "experimental/packages/opentelemetry-exporter-metrics-otlp-proto", From f7ee496e047776efb03233c39bff619a719bb5e8 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 24 Oct 2025 09:14:36 -0400 Subject: [PATCH 12/58] make config private --- .../packages/opentelemetry-sdk-node/src/sdk.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 2e4761e4e57..3fa0008831f 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -223,7 +223,7 @@ function configureMetricProviderFromEnv(): IMetricReader[] { * nodeSdk.start(); // registers all configured SDK components */ export class NodeSDK { - config: Configuration; + private _config: Configuration; private _tracerProviderConfig?: TracerProviderConfig; private _loggerProviderConfig?: LoggerProviderConfig; private _meterProviderConfig?: MeterProviderConfig; @@ -247,16 +247,16 @@ export class NodeSDK { */ public constructor(configuration: Partial = {}) { const configProvider: ConfigProvider = createConfigProvider(); - this.config = configProvider.getInstrumentationConfig(); - if (this.config.disabled) { + this._config = configProvider.getInstrumentationConfig(); + if (this._config.disabled) { this._disabled = true; // Functions with possible side-effects are set // to no-op via the _disabled flag } - if (this.config.log_level != null) { + if (this._config.log_level != null) { diag.setLogger(new DiagConsoleLogger(), { - logLevel: this.config.log_level, + logLevel: this._config.log_level, }); } @@ -268,8 +268,8 @@ export class NodeSDK { this._resourceDetectors = []; } else if (configuration.resourceDetectors != null) { this._resourceDetectors = configuration.resourceDetectors; - } else if (this.config.node_resource_detectors) { - this._resourceDetectors = getResourceDetectorsFromEnv(this.config); + } else if (this._config.node_resource_detectors) { + this._resourceDetectors = getResourceDetectorsFromEnv(this._config); } else { this._resourceDetectors = [envDetector, processDetector, hostDetector]; } @@ -390,7 +390,7 @@ export class NodeSDK { }) ); - const instanceId = getInstanceID(this.config); + const instanceId = getInstanceID(this._config); this._resource = instanceId === undefined ? this._resource From fb41d5506e29972317695d9dd2d620a23735d435 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 24 Oct 2025 09:28:39 -0400 Subject: [PATCH 13/58] move semconv to src --- experimental/packages/opentelemetry-sdk-node/src/sdk.ts | 2 +- .../packages/opentelemetry-sdk-node/{test => src}/semconv.ts | 0 experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts | 4 ++-- .../opentelemetry-sdk-node/test/util/resource-assertions.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename experimental/packages/opentelemetry-sdk-node/{test => src}/semconv.ts (100%) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 3fa0008831f..8c3cc9c74da 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -77,7 +77,7 @@ import { Configuration, createConfigProvider, } from '@opentelemetry/configuration'; -import { ATTR_SERVICE_INSTANCE_ID } from '@opentelemetry/resources/src/semconv'; +import { ATTR_SERVICE_INSTANCE_ID } from './semconv'; type TracerProviderConfig = { tracerConfig: NodeTracerConfig; diff --git a/experimental/packages/opentelemetry-sdk-node/test/semconv.ts b/experimental/packages/opentelemetry-sdk-node/src/semconv.ts similarity index 100% rename from experimental/packages/opentelemetry-sdk-node/test/semconv.ts rename to experimental/packages/opentelemetry-sdk-node/src/semconv.ts diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 44ac7d7e48a..c26807e757c 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -83,7 +83,7 @@ import { OTLPTraceExporter as OTLPProtoTraceExporter } from '@opentelemetry/expo import { OTLPTraceExporter as OTLPGrpcTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'; import { ZipkinExporter } from '@opentelemetry/exporter-zipkin'; -import { ATTR_HOST_NAME, ATTR_PROCESS_PID } from './semconv'; +import { ATTR_HOST_NAME, ATTR_PROCESS_PID } from '../src/semconv'; function assertDefaultContextManagerRegistered() { assert.ok( @@ -124,7 +124,7 @@ describe('Node SDK', () => { describe('Basic Registration', () => { it('should not register more than the minimal SDK components', async () => { - // need to set these to none, since the deafult value is 'otlp' + // need to set these to none, since the default value is 'otlp' env.OTEL_TRACES_EXPORTER = 'none'; env.OTEL_LOGS_EXPORTER = 'none'; env.OTEL_METRIC_EXPORTER = 'none'; diff --git a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts index eb1d8819465..2d09dc8d5ee 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts @@ -21,7 +21,7 @@ import { ATTR_SERVICE_VERSION, } from '@opentelemetry/semantic-conventions'; -import { ATTR_SERVICE_INSTANCE_ID, ATTR_SERVICE_NAMESPACE } from '../semconv'; +import { ATTR_SERVICE_INSTANCE_ID, ATTR_SERVICE_NAMESPACE } from '../../src/semconv'; /** * Test utility method to validate a service resource From 968b4e0e77853cf75326e4a743df352cedd821a1 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 24 Oct 2025 09:32:12 -0400 Subject: [PATCH 14/58] fix lint --- .../opentelemetry-sdk-node/test/util/resource-assertions.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts index 2d09dc8d5ee..ec088c766b7 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts @@ -21,7 +21,10 @@ import { ATTR_SERVICE_VERSION, } from '@opentelemetry/semantic-conventions'; -import { ATTR_SERVICE_INSTANCE_ID, ATTR_SERVICE_NAMESPACE } from '../../src/semconv'; +import { + ATTR_SERVICE_INSTANCE_ID, + ATTR_SERVICE_NAMESPACE, +} from '../../src/semconv'; /** * Test utility method to validate a service resource From cacb7854ea4d999f7685b8ca96ce476487ea9ef1 Mon Sep 17 00:00:00 2001 From: Jamie Danielson Date: Tue, 28 Oct 2025 19:44:07 -0400 Subject: [PATCH 15/58] feat(opentelemetry-config): add backups for compression, timeout, headers (#6058) Co-authored-by: Marylia Gutierrez --- experimental/CHANGELOG.md | 1 + .../src/EnvironmentConfigProvider.ts | 40 +++++++++++++------ .../test/ConfigProvider.test.ts | 18 ++++++--- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 0ff3cc4c464..e3f085d33f8 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -21,6 +21,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :rocket: Features * feat(instrumentation): allow error of safeExecuteInTheMiddleAsync to be async [#6032](https://github.com/open-telemetry/opentelemetry-js/pull/6032) @JPeer264 +* feat(opentelemetry-config): add backups for compression, timeout, headers [#6058](https://github.com/open-telemetry/opentelemetry-js/pull/6058) @JamieDanielson ### :bug: Bug Fixes diff --git a/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts b/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts index cab3d3b7348..6406612a869 100644 --- a/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts +++ b/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts @@ -240,19 +240,23 @@ export function setTracerProvider(config: ConfigurationModel): void { batch.exporter.otlp_http.client_certificate_file = clientCertificateFile; } - const compression = getStringFromEnv( - 'OTEL_EXPORTER_OTLP_TRACES_COMPRESSION' - ); + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); if (compression && batch.exporter.otlp_http) { batch.exporter.otlp_http.compression = compression; } - const timeout = getNumberFromEnv('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT'); + const timeout = + getNumberFromEnv('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); if (timeout && batch.exporter.otlp_http) { batch.exporter.otlp_http.timeout = timeout; } - const headersList = getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_HEADERS'); + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); if (headersList && batch.exporter.otlp_http) { batch.exporter.otlp_http.headers_list = headersList; } @@ -314,19 +318,23 @@ export function setMeterProvider(config: ConfigurationModel): void { clientCertificateFile; } - const compression = getStringFromEnv( - 'OTEL_EXPORTER_OTLP_METRICS_COMPRESSION' - ); + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); if (compression) { readerPeriodic.exporter.otlp_http.compression = compression; } - const timeoutEx = getNumberFromEnv('OTEL_EXPORTER_OTLP_METRICS_TIMEOUT'); + const timeoutEx = + getNumberFromEnv('OTEL_EXPORTER_OTLP_METRICS_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); if (timeoutEx) { readerPeriodic.exporter.otlp_http.timeout = timeoutEx; } - const headersList = getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_HEADERS'); + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); if (headersList) { readerPeriodic.exporter.otlp_http.headers_list = headersList; } @@ -478,17 +486,23 @@ export function setLoggerProvider(config: ConfigurationModel): void { batch.exporter.otlp_http.client_certificate_file = clientCertificateFile; } - const compression = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION'); + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); if (compression && batch.exporter.otlp_http) { batch.exporter.otlp_http.compression = compression; } - const timeout = getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT'); + const timeout = + getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); if (timeout && batch.exporter.otlp_http) { batch.exporter.otlp_http.timeout = timeout; } - const headersList = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS'); + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); if (headersList && batch.exporter.otlp_http) { batch.exporter.otlp_http.headers_list = headersList; } diff --git a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts index bc686dea062..2c3d6050075 100644 --- a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts +++ b/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts @@ -1064,14 +1064,16 @@ describe('ConfigProvider', function () { ); }); - it('should use backup option for certificates', function () { + it('should use backup options for exporters', function () { process.env.OTEL_EXPORTER_OTLP_CERTIFICATE = 'backup_certificate_file.pem'; process.env.OTEL_EXPORTER_OTLP_CLIENT_KEY = 'backup_client_key.pem'; process.env.OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE = 'backup_client_certificate.pem'; process.env.OTEL_EXPORTER_OTLP_ENDPOINT = 'http://backup.com:4318'; - + process.env.OTEL_EXPORTER_OTLP_COMPRESSION = 'backup_compression'; + process.env.OTEL_EXPORTER_OTLP_TIMEOUT = '12000'; + process.env.OTEL_EXPORTER_OTLP_HEADERS = 'backup_headers=123'; const expectedConfig: Configuration = { ...defaultConfig, tracer_provider: { @@ -1082,11 +1084,13 @@ describe('ConfigProvider', function () { exporter: { otlp_http: { endpoint: 'http://backup.com:4318/v1/traces', - timeout: 10000, + timeout: 12000, + compression: 'backup_compression', encoding: OtlpHttpEncoding.Protobuf, certificate_file: 'backup_certificate_file.pem', client_certificate_file: 'backup_client_certificate.pem', client_key_file: 'backup_client_key.pem', + headers_list: 'backup_headers=123', }, }, }, @@ -1105,7 +1109,8 @@ describe('ConfigProvider', function () { exporter: { otlp_http: { endpoint: 'http://backup.com:4318/v1/metrics', - timeout: 10000, + timeout: 12000, + compression: 'backup_compression', temporality_preference: ExporterTemporalityPreference.Cumulative, default_histogram_aggregation: @@ -1113,6 +1118,7 @@ describe('ConfigProvider', function () { certificate_file: 'backup_certificate_file.pem', client_certificate_file: 'backup_client_certificate.pem', client_key_file: 'backup_client_key.pem', + headers_list: 'backup_headers=123', }, }, }, @@ -1131,11 +1137,13 @@ describe('ConfigProvider', function () { exporter: { otlp_http: { endpoint: 'http://backup.com:4318/v1/logs', - timeout: 10000, + timeout: 12000, + compression: 'backup_compression', encoding: OtlpHttpEncoding.Protobuf, certificate_file: 'backup_certificate_file.pem', client_certificate_file: 'backup_client_certificate.pem', client_key_file: 'backup_client_key.pem', + headers_list: 'backup_headers=123', }, }, }, From db220cbf58a94bb151d48d61232b05878c16c398 Mon Sep 17 00:00:00 2001 From: Jamie Danielson Date: Tue, 28 Oct 2025 19:57:48 -0400 Subject: [PATCH 16/58] chore: update entries in changelog (#6059) Co-authored-by: Marylia Gutierrez --- experimental/CHANGELOG.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index e3f085d33f8..360ccc0d346 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -21,7 +21,10 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :rocket: Features * feat(instrumentation): allow error of safeExecuteInTheMiddleAsync to be async [#6032](https://github.com/open-telemetry/opentelemetry-js/pull/6032) @JPeer264 -* feat(opentelemetry-config): add backups for compression, timeout, headers [#6058](https://github.com/open-telemetry/opentelemetry-js/pull/6058) @JamieDanielson +* feat(opentelemetry-configuration): parse logger provider from config file [#5995](https://github.com/open-telemetry/opentelemetry-js/pull/5995) @maryliag +* feat(opentelemetry-configuration): parse meter provider from config file [#6000](https://github.com/open-telemetry/opentelemetry-js/pull/6000) @maryliag +* feat(opentelemetry-configuration): add backup options for certificates and endpoints [#6038](https://github.com/open-telemetry/opentelemetry-js/pull/6038) @maryliag +* feat(opentelemetry-configuration): add backups for compression, timeout, headers [#6058](https://github.com/open-telemetry/opentelemetry-js/pull/6058) @JamieDanielson ### :bug: Bug Fixes @@ -47,6 +50,10 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 is initialized. * feat(otlp-exporter-base, otlp-grpc-exporter-base): add an option to let an SDK distribution prepend their own user-agent string in HTTP & GRPC exporters [#5928](https://github.com/open-telemetry/opentelemetry-js/pull/5928) @david-luna * feat(web): add session handling implementation [5173](https://github.com/open-telemetry/opentelemetry-js/pull/5173) @martinkuba +* feat(opentelemetry-configuration): parse more parameters from config file [#5955](https://github.com/open-telemetry/opentelemetry-js/pull/5955) @maryliag +* feat(exporter-prometheus): support withoutTargetInfo option [#5962](https://github.com/open-telemetry/opentelemetry-js/pull/5962) @cjihrig +* feat(opentelemetry-configuration): parse trace provider from config file [#5992](https://github.com/open-telemetry/opentelemetry-js/pull/5992) @maryliag +* feat(opentelemetry-configuration): parse config file with format 1.0-rc.2 [#6029](https://github.com/open-telemetry/opentelemetry-js/pull/6029) @maryliag ### :bug: Bug Fixes @@ -71,13 +78,6 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(opentelemetry-configuration): Parse of Configuration File [#5875](https://github.com/open-telemetry/opentelemetry-js/pull/5875) @maryliag * feat(opentelemetry-configuration): parse of array objects on configuration file [#5947](https://github.com/open-telemetry/opentelemetry-js/pull/5947) @maryliag * feat(opentelemetry-configuration): parse of environment variables on configuration file [#5947](https://github.com/open-telemetry/opentelemetry-js/pull/5947) @maryliag -* feat(opentelemetry-configuration): parse more parameters from config file [#5955](https://github.com/open-telemetry/opentelemetry-js/pull/5955) @maryliag -* feat(exporter-prometheus): support withoutTargetInfo option [#5962](https://github.com/open-telemetry/opentelemetry-js/pull/5962) @cjihrig -* feat(opentelemetry-configuration): parse trace provider from config file [#5992](https://github.com/open-telemetry/opentelemetry-js/pull/5992) @maryliag -* feat(opentelemetry-configuration): parse logger provider from config file [#5995](https://github.com/open-telemetry/opentelemetry-js/pull/5995) @maryliag -* feat(opentelemetry-configuration): parse meter provider from config file [#6000](https://github.com/open-telemetry/opentelemetry-js/pull/6000) @maryliag -* feat(opentelemetry-configuration): parse config file with format 1.0-rc.2 [#6029](https://github.com/open-telemetry/opentelemetry-js/pull/6029) @maryliag -* feat(opentelemetry-configuration): add backup options for certificates and endpoints [#6038](https://github.com/open-telemetry/opentelemetry-js/pull/6038) @maryliag ### :bug: Bug Fixes From bef482830da738431ea53bd8bd4502d2c3940bce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 29 Oct 2025 10:32:20 +0100 Subject: [PATCH 17/58] chore(deps): update github artifact actions (major) (#6051) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ossf-scorecard.yml | 2 +- .github/workflows/sbom.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml index 83d5c0754af..bfa31d79344 100644 --- a/.github/workflows/ossf-scorecard.yml +++ b/.github/workflows/ossf-scorecard.yml @@ -33,7 +33,7 @@ jobs: # uploads of run results in SARIF format to the repository Actions tab. # https://docs.github.com/en/actions/advanced-guides/storing-workflow-data-as-artifacts - name: "Upload artifact" - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: SARIF file path: results.sarif diff --git a/.github/workflows/sbom.yml b/.github/workflows/sbom.yml index 0ca5edab5c1..644ec78375d 100644 --- a/.github/workflows/sbom.yml +++ b/.github/workflows/sbom.yml @@ -51,7 +51,7 @@ jobs: zip sbom.zip *.spdx.json - name: Upload artifact - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5 with: name: SBOM.zip path: ./sbom.zip @@ -63,7 +63,7 @@ jobs: contents: write steps: - name: Download artifact from generate-sboms - uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5 + uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6 with: name: SBOM.zip - name: Upload release asset From d8c6b4ae3863b6387c233ffa326940eedd90becf Mon Sep 17 00:00:00 2001 From: Colin Ihrig Date: Wed, 29 Oct 2025 08:14:48 -0400 Subject: [PATCH 18/58] test(sdk-node): use `process.env` consistently in tests (#6052) --- experimental/CHANGELOG.md | 1 + .../opentelemetry-sdk-node/test/sdk.test.ts | 199 +++++++++--------- 2 files changed, 100 insertions(+), 100 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 360ccc0d346..5f96f6ab21a 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -33,6 +33,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :house: Internal * test(otlp-grpc-exporter-base): increase timeout in flaky test [#6042](https://github.com/open-telemetry/opentelemetry-js/pull/6042) @cjihrig +* test(sdk-node): use process.env consistently in tests [#xxxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxxx) @cjihrig ## 0.207.0 diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index c26807e757c..004d5373bf4 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -58,7 +58,6 @@ import { import * as assert from 'assert'; import * as Sinon from 'sinon'; import { NodeSDK } from '../src'; -import { env } from 'process'; import { envDetector, processDetector, @@ -125,9 +124,9 @@ describe('Node SDK', () => { describe('Basic Registration', () => { it('should not register more than the minimal SDK components', async () => { // need to set these to none, since the default value is 'otlp' - env.OTEL_TRACES_EXPORTER = 'none'; - env.OTEL_LOGS_EXPORTER = 'none'; - env.OTEL_METRIC_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_LOGS_EXPORTER = 'none'; + process.env.OTEL_METRIC_EXPORTER = 'none'; const sdk = new NodeSDK({ autoDetectResources: false, }); @@ -149,13 +148,13 @@ describe('Node SDK', () => { logsDelegate, 'logger provider should not have changed' ); - delete env.OTEL_TRACES_EXPORTER; - delete env.OTEL_METRICS_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_METRICS_EXPORTER; await sdk.shutdown(); }); it('should register a diag logger with OTEL_LOG_LEVEL', () => { - env.OTEL_LOG_LEVEL = 'ERROR'; + process.env.OTEL_LOG_LEVEL = 'ERROR'; const spy = Sinon.spy(diag, 'setLogger'); const sdk = new NodeSDK({ @@ -170,7 +169,7 @@ describe('Node SDK', () => { logLevel: DiagLogLevel.ERROR, }); - delete env.OTEL_LOG_LEVEL; + delete process.env.OTEL_LOG_LEVEL; sdk.shutdown(); }); @@ -194,7 +193,7 @@ describe('Node SDK', () => { }); it('should register a tracer provider if an exporter is provided via env', async () => { - env.OTEL_TRACES_EXPORTER = 'console'; + process.env.OTEL_TRACES_EXPORTER = 'console'; const sdk = new NodeSDK({ autoDetectResources: false, }); @@ -209,7 +208,7 @@ describe('Node SDK', () => { const apiTracerProvider = trace.getTracerProvider() as ProxyTracerProvider; assert.ok(apiTracerProvider.getDelegate() instanceof NodeTracerProvider); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -262,7 +261,7 @@ describe('Node SDK', () => { it('should register a meter provider if a reader is provided', async () => { // need to set OTEL_TRACES_EXPORTER to none since default value is otlp // which sets up an exporter and affects the context manager - env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; const exporter = new ConsoleMetricExporter(); const metricReader = new PeriodicExportingMetricReader({ exporter: exporter, @@ -289,13 +288,13 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof MeterProvider); await sdk.shutdown(); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; }); it('should register a meter provider if multiple readers are provided', async () => { // need to set OTEL_TRACES_EXPORTER to none since default value is otlp // which sets up an exporter and affects the context manager - env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; const consoleExporter = new ConsoleMetricExporter(); const inMemoryExporter = new InMemoryMetricExporter( AggregationTemporality.CUMULATIVE @@ -335,13 +334,13 @@ describe('Node SDK', () => { assert.strictEqual(sharedState.metricCollectors.length, 2); await sdk.shutdown(); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; }); it('should show deprecation warning when using metricReader option', async () => { // need to set OTEL_TRACES_EXPORTER to none since default value is otlp // which sets up an exporter and affects the context manager - env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; const exporter = new ConsoleMetricExporter(); const metricReader = new PeriodicExportingMetricReader({ exporter: exporter, @@ -367,13 +366,13 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof MeterProvider); await sdk.shutdown(); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; }); it('should not show deprecation warning when using metricReaders option', async () => { // need to set OTEL_TRACES_EXPORTER to none since default value is otlp // which sets up an exporter and affects the context manager - env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; const exporter = new ConsoleMetricExporter(); const metricReader = new PeriodicExportingMetricReader({ exporter: exporter, @@ -399,11 +398,11 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof MeterProvider); await sdk.shutdown(); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; }); it('should register a logger provider if a log record processor is provided', async () => { - env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; const logRecordExporter = new InMemoryLogRecordExporter(); const logRecordProcessor = new SimpleLogRecordProcessor( logRecordExporter @@ -429,7 +428,7 @@ describe('Node SDK', () => { LoggerProvider ); await sdk.shutdown(); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; }); it('should register a logger provider if multiple log record processors are provided', async () => { @@ -583,7 +582,7 @@ describe('Node SDK', () => { it('should register meter views when provided', async () => { // need to set OTEL_TRACES_EXPORTER to none since default value is otlp // which sets up an exporter and affects the context manager - env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; const exporter = new InMemoryMetricExporter( AggregationTemporality.CUMULATIVE ); @@ -646,7 +645,7 @@ describe('Node SDK', () => { ); await sdk.shutdown(); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; }); describe('detectResources', async () => { @@ -976,11 +975,11 @@ describe('Node SDK', () => { describe('A disabled SDK should be no-op', () => { beforeEach(() => { - env.OTEL_SDK_DISABLED = 'true'; + process.env.OTEL_SDK_DISABLED = 'true'; }); afterEach(() => { - delete env.OTEL_SDK_DISABLED; + delete process.env.OTEL_SDK_DISABLED; }); it('should not register a trace provider', async () => { @@ -1088,14 +1087,14 @@ describe('Node SDK', () => { afterEach(() => { stubLogger.reset(); - delete env.OTEL_LOGS_EXPORTER; - delete env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL; - delete env.OTEL_EXPORTER_OTLP_PROTOCOL; + delete process.env.OTEL_LOGS_EXPORTER; + delete process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL; + delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL; }); it('should not register the provider if OTEL_LOGS_EXPORTER contains none', async () => { const logsAPIStub = Sinon.spy(logs, 'setGlobalLoggerProvider'); - env.OTEL_LOGS_EXPORTER = 'console,none'; + process.env.OTEL_LOGS_EXPORTER = 'console,none'; const sdk = new NodeSDK(); sdk.start(); assert.strictEqual( @@ -1120,7 +1119,7 @@ describe('Node SDK', () => { }); it('should set up all allowed exporters', async () => { - env.OTEL_LOGS_EXPORTER = 'console,otlp'; + process.env.OTEL_LOGS_EXPORTER = 'console,otlp'; const sdk = new NodeSDK(); sdk.start(); @@ -1149,8 +1148,8 @@ describe('Node SDK', () => { }); it('should use OTEL_EXPORTER_OTLP_LOGS_PROTOCOL for otlp protocol', async () => { - env.OTEL_LOGS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc'; + process.env.OTEL_LOGS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); @@ -1166,8 +1165,8 @@ describe('Node SDK', () => { }); it('should use OTLPHttpLogExporter when http/json is set', async () => { - env.OTEL_LOGS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json'; + process.env.OTEL_LOGS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'http/json'; const sdk = new NodeSDK(); sdk.start(); @@ -1183,8 +1182,8 @@ describe('Node SDK', () => { }); it('should fall back to OTEL_EXPORTER_OTLP_PROTOCOL', async () => { - env.OTEL_LOGS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_PROTOCOL = 'grpc'; + process.env.OTEL_LOGS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); @@ -1200,8 +1199,8 @@ describe('Node SDK', () => { }); it('should fall back to http/protobuf if invalid protocol is set', async () => { - env.OTEL_LOGS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc2'; + process.env.OTEL_LOGS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_LOGS_PROTOCOL = 'grpc2'; const sdk = new NodeSDK(); sdk.start(); @@ -1226,9 +1225,9 @@ describe('Node SDK', () => { afterEach(() => { stubLogger.reset(); - delete env.OTEL_METRICS_EXPORTER; - delete env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; - delete env.OTEL_EXPORTER_METRICS_PROTOCOL; + delete process.env.OTEL_METRICS_EXPORTER; + delete process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; + delete process.env.OTEL_EXPORTER_METRICS_PROTOCOL; }); it('should not register the provider if OTEL_METRICS_EXPORTER is not set', async () => { @@ -1239,7 +1238,7 @@ describe('Node SDK', () => { }); it('should not register the provider if OTEL_METRICS_EXPORTER contains none', async () => { - env.OTEL_METRICS_EXPORTER = 'console,none'; + process.env.OTEL_METRICS_EXPORTER = 'console,none'; const sdk = new NodeSDK(); sdk.start(); assert.ok(!(metrics.getMeterProvider() instanceof MeterProvider)); @@ -1251,7 +1250,7 @@ describe('Node SDK', () => { }); it('should use console with default interval and timeout', async () => { - env.OTEL_METRICS_EXPORTER = 'console'; + process.env.OTEL_METRICS_EXPORTER = 'console'; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1272,8 +1271,8 @@ describe('Node SDK', () => { }); it('should use otlp with gRPC and default interval and timeout', async () => { - env.OTEL_METRICS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'grpc'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1294,8 +1293,8 @@ describe('Node SDK', () => { }); it('should use otlp with http/protobuf and default interval and timeout', async () => { - env.OTEL_METRICS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'http/protobuf'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'http/protobuf'; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1316,8 +1315,8 @@ describe('Node SDK', () => { }); it('should use otlp with http/json and default interval and timeout', async () => { - env.OTEL_METRICS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'http/json'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'http/json'; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1338,8 +1337,8 @@ describe('Node SDK', () => { }); it('should fall back to OTEL_EXPORTER_OTLP_PROTOCOL', async () => { - env.OTEL_METRICS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'grpc'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1360,8 +1359,8 @@ describe('Node SDK', () => { }); it('should fall back to http/protobuf if invalid protocol is set', async () => { - env.OTEL_METRICS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'grpcx'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'grpcx'; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1382,8 +1381,8 @@ describe('Node SDK', () => { }); it('should fall back to http/protobuf if protocol is not set', async () => { - env.OTEL_METRICS_EXPORTER = 'otlp'; - delete env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + delete process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1404,11 +1403,11 @@ describe('Node SDK', () => { }); it('should use otlp with http/protobuf and and use user defined flushing settings', async () => { - env.OTEL_METRICS_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'http/protobuf'; - env.OTEL_METRIC_EXPORT_INTERVAL = '200'; - env.OTEL_METRIC_EXPORT_TIMEOUT = '150'; - delete env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'http/protobuf'; + process.env.OTEL_METRIC_EXPORT_INTERVAL = '200'; + process.env.OTEL_METRIC_EXPORT_TIMEOUT = '150'; + delete process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1426,13 +1425,13 @@ describe('Node SDK', () => { 150 ); await sdk.shutdown(); - delete env.OTEL_METRIC_EXPORT_INTERVAL; - delete env.OTEL_METRIC_EXPORT_TIMEOUT; + delete process.env.OTEL_METRIC_EXPORT_INTERVAL; + delete process.env.OTEL_METRIC_EXPORT_TIMEOUT; }); it('should use prometheus if that is set ', async () => { - env.OTEL_METRICS_EXPORTER = 'prometheus'; - delete env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; + process.env.OTEL_METRICS_EXPORTER = 'prometheus'; + delete process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; const sdk = new NodeSDK(); sdk.start(); const meterProvider = metrics.getMeterProvider(); @@ -1514,7 +1513,7 @@ describe('Node SDK', () => { }); it('should ignore exporter form env if another is provided in sdk config', async () => { - env.OTEL_TRACES_EXPORTER = 'console'; + process.env.OTEL_TRACES_EXPORTER = 'console'; const traceExporter = new OTLPTraceExporter(); const sdk = new NodeSDK({ traceExporter, @@ -1525,12 +1524,12 @@ describe('Node SDK', () => { assert.ok(listOfProcessors.length === 1); assert.ok(listOfProcessors[0] instanceof BatchSpanProcessor); assert.ok(listOfProcessors[0]['_exporter'] instanceof OTLPTraceExporter); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); it('should only create one span processor when configured using env vars and config', async () => { - env.OTEL_TRACES_EXPORTER = 'console'; + process.env.OTEL_TRACES_EXPORTER = 'console'; const sdk = new NodeSDK({ sampler: new AlwaysOffSampler(), }); @@ -1545,13 +1544,13 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof ConsoleSpanExporter ); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); it('should use otlp exporter and defined exporter protocol env value', async () => { - env.OTEL_TRACES_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; + process.env.OTEL_TRACES_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); const listOfProcessors = getSdkSpanProcessors(sdk); @@ -1561,15 +1560,15 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof OTLPGrpcTraceExporter ); - delete env.OTEL_TRACES_EXPORTER; - delete env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + delete process.env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); it('sohuld use exporter and processor from env, signal specific env for protocol takes precedence', async () => { - env.OTEL_TRACES_EXPORTER = 'otlp'; - env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/protobuf'; - env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; + process.env.OTEL_TRACES_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/protobuf'; + process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); const listOfProcessors = getSdkSpanProcessors(sdk); @@ -1579,13 +1578,13 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof OTLPGrpcTraceExporter ); - delete env.OTEL_TRACES_EXPORTER; - delete env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + delete process.env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); it('should use empty span processor when user sets env exporter to none', async () => { - env.OTEL_TRACES_EXPORTER = 'none'; + process.env.OTEL_TRACES_EXPORTER = 'none'; const sdk = new NodeSDK(); sdk.start(); @@ -1601,12 +1600,12 @@ describe('Node SDK', () => { 'tracer provider should not have changed' ); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); it('should use default otlp exporter when empty value is provided for exporter via env', async () => { - env.OTEL_TRACES_EXPORTER = ''; + process.env.OTEL_TRACES_EXPORTER = ''; const sdk = new NodeSDK(); sdk.start(); @@ -1617,12 +1616,12 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof OTLPProtoTraceExporter ); - env.OTEL_TRACES_EXPORTER = ''; + process.env.OTEL_TRACES_EXPORTER = ''; await sdk.shutdown(); }); it('should use only default exporter when none value is provided with other exporters', async () => { - env.OTEL_TRACES_EXPORTER = 'otlp,zipkin,none'; + process.env.OTEL_TRACES_EXPORTER = 'otlp,zipkin,none'; const sdk = new NodeSDK(); sdk.start(); @@ -1640,12 +1639,12 @@ describe('Node SDK', () => { listOfProcessors[0]['_exporter'] instanceof OTLPProtoTraceExporter ); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); it('should warn that provided exporter value is unrecognized and not able to be set up', async () => { - env.OTEL_TRACES_EXPORTER = 'invalid'; + process.env.OTEL_TRACES_EXPORTER = 'invalid'; const sdk = new NodeSDK(); sdk.start(); @@ -1659,13 +1658,13 @@ describe('Node SDK', () => { 'Unable to set up trace exporter(s) due to invalid exporter and/or protocol values.' ); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); it('should be able to setup zipkin exporter', async () => { - env.OTEL_TRACES_EXPORTER = 'zipkin'; - env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; + process.env.OTEL_TRACES_EXPORTER = 'zipkin'; + process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); @@ -1675,14 +1674,14 @@ describe('Node SDK', () => { assert.ok(listOfProcessors[0] instanceof BatchSpanProcessor); assert.ok(listOfProcessors[0]['_exporter'] instanceof ZipkinExporter); - delete env.OTEL_TRACES_EXPORTER; - delete env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + delete process.env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); it('should be able to setup zipkin and otlp exporters', async () => { - env.OTEL_TRACES_EXPORTER = 'zipkin, otlp'; - env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; + process.env.OTEL_TRACES_EXPORTER = 'zipkin, otlp'; + process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); @@ -1696,13 +1695,13 @@ describe('Node SDK', () => { listOfProcessors[1]['_exporter'] instanceof OTLPGrpcTraceExporter ); - delete env.OTEL_TRACES_EXPORTER; - delete env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + delete process.env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); it('should be able to use console and otlp exporters', async () => { - env.OTEL_TRACES_EXPORTER = 'console, otlp'; + process.env.OTEL_TRACES_EXPORTER = 'console, otlp'; const sdk = new NodeSDK(); sdk.start(); @@ -1717,12 +1716,12 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[1]['_exporter'] instanceof OTLPProtoTraceExporter ); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); it('should be able to use console exporter but not http/json exporter', async () => { - env.OTEL_TRACES_EXPORTER = 'console, http/json'; + process.env.OTEL_TRACES_EXPORTER = 'console, http/json'; const sdk = new NodeSDK(); sdk.start(); @@ -1733,13 +1732,13 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof ConsoleSpanExporter ); - delete env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); it('should ignore the protocol from env when use the console exporter', async () => { - env.OTEL_TRACES_EXPORTER = 'console'; - env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; + process.env.OTEL_TRACES_EXPORTER = 'console'; + process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); sdk.start(); @@ -1750,8 +1749,8 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof ConsoleSpanExporter ); - delete env.OTEL_TRACES_EXPORTER; - delete env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + delete process.env.OTEL_TRACES_EXPORTER; + delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); }); From 5696b084956d369f5d736f085d8bb67dcc14cb13 Mon Sep 17 00:00:00 2001 From: Colin Ihrig Date: Wed, 29 Oct 2025 14:06:44 -0400 Subject: [PATCH 19/58] chore(instrumentation-http): remove commented out code (#6062) Co-authored-by: Marylia Gutierrez --- experimental/CHANGELOG.md | 2 +- .../packages/opentelemetry-instrumentation-http/src/utils.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 5f96f6ab21a..2d319c5ae40 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -33,7 +33,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :house: Internal * test(otlp-grpc-exporter-base): increase timeout in flaky test [#6042](https://github.com/open-telemetry/opentelemetry-js/pull/6042) @cjihrig -* test(sdk-node): use process.env consistently in tests [#xxxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxxx) @cjihrig +* test(sdk-node): use process.env consistently in tests [#6052](https://github.com/open-telemetry/opentelemetry-js/pull/6052) @cjihrig ## 0.207.0 diff --git a/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts b/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts index 744ec9f7b0e..1074583a545 100644 --- a/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts +++ b/experimental/packages/opentelemetry-instrumentation-http/src/utils.ts @@ -116,7 +116,6 @@ export const getAbsoluteUrl = ( } // Redact sensitive query parameters if (path.includes('?')) { - //const [pathname, query] = path.split('?', 2); const parsedUrl = url.parse(path); const pathname = parsedUrl.pathname || ''; const query = parsedUrl.query || ''; From b806020ab3b3f7a34eee30a7f3c8835c3fa661dc Mon Sep 17 00:00:00 2001 From: Samo Prelog Date: Fri, 31 Oct 2025 16:40:28 +0100 Subject: [PATCH 20/58] fix(instrumentation-fetch): Handling null-body-status responses (#6037) Co-authored-by: Wolfgang Therrien --- experimental/CHANGELOG.md | 2 + .../src/fetch.ts | 10 ++++- .../test/fetch.test.ts | 43 +++++++++++++++++++ 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 2d319c5ae40..f17fb9d68a1 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -28,6 +28,8 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :bug: Bug Fixes +* fix(instrumentation-fetch): Handling null-body-status responses [#6037](https://github.com/open-telemetry/opentelemetry-js/pull/6037) @m0sa + ### :books: Documentation ### :house: Internal diff --git a/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts b/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts index 443d1b60c66..0328a229916 100644 --- a/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts +++ b/experimental/packages/opentelemetry-instrumentation-fetch/src/fetch.ts @@ -507,8 +507,14 @@ export class FetchInstrumentation extends InstrumentationBase { msw.http.get('/boom', () => { return new msw.HttpResponse(null, { status: 500 }); }), + msw.http.get('/null-body-204', () => { + return new msw.HttpResponse(null, { status: 204 }); + }), + msw.http.get('/null-body-205', () => { + return new msw.HttpResponse(null, { status: 205 }); + }), + msw.http.get('/null-body-304', () => { + return new msw.HttpResponse(null, { status: 304 }); + }), ], callback = () => fetch('/api/status.json'), config = {}, @@ -391,6 +400,40 @@ describe('fetch', () => { return { rootSpan, response }; }; + describe('null-bodied response', () => { + // https://chromium.googlesource.com/chromium/src/+/ac85ca2a9cb8c76a37f9d7a6c611c24114f1f05d/third_party/WebKit/Source/core/fetch/Response.cpp#106 + it('204 (No Content) will correctly end the span', async () => { + await tracedFetch({ + callback: () => fetch('/null-body-204'), + }); + assert.strictEqual(exportedSpans.length, 1); + assert.strictEqual( + exportedSpans[0].attributes[ATTR_HTTP_STATUS_CODE], + 204 + ); + }); + it('205 (Reset Content) will correctly end the span', async () => { + await tracedFetch({ + callback: () => fetch('/null-body-205'), + }); + assert.strictEqual(exportedSpans.length, 1); + assert.strictEqual( + exportedSpans[0].attributes[ATTR_HTTP_STATUS_CODE], + 205 + ); + }); + it('304 (Not Modified) will correctly end the span', async () => { + await tracedFetch({ + callback: () => fetch('/null-body-304'), + }); + assert.strictEqual(exportedSpans.length, 1); + assert.strictEqual( + exportedSpans[0].attributes[ATTR_HTTP_STATUS_CODE], + 304 + ); + }); + }); + describe('simple request', () => { let rootSpan: api.Span | undefined; let response: Response | undefined; From 169e4656ee59aa6dae9fca5c7ed6893e16f27429 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Oct 2025 17:39:28 +0100 Subject: [PATCH 21/58] chore(deps): update github/codeql-action digest to 0499de3 (#6067) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 14ad2511a5f..741c5398aa8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,12 +21,12 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4 + uses: github/codeql-action/init@0499de31b99561a6d14a36a5f662c2a54f91beee # v4 with: languages: javascript - name: Autobuild - uses: github/codeql-action/autobuild@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4 + uses: github/codeql-action/autobuild@0499de31b99561a6d14a36a5f662c2a54f91beee # v4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@4e94bd11f71e507f7f87df81788dff88d1dacbfb # v4 + uses: github/codeql-action/analyze@0499de31b99561a6d14a36a5f662c2a54f91beee # v4 From dfb754f65a07df6d4c4f3d84d5a0599311465b5b Mon Sep 17 00:00:00 2001 From: Colin Ihrig Date: Sun, 2 Nov 2025 21:34:27 -0500 Subject: [PATCH 22/58] test(sdk-node): ensure process.env is cleaned up between tests (#6066) --- experimental/CHANGELOG.md | 1 + .../opentelemetry-sdk-node/test/sdk.test.ts | 62 +++++++------------ 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index f17fb9d68a1..5788377d501 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -36,6 +36,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * test(otlp-grpc-exporter-base): increase timeout in flaky test [#6042](https://github.com/open-telemetry/opentelemetry-js/pull/6042) @cjihrig * test(sdk-node): use process.env consistently in tests [#6052](https://github.com/open-telemetry/opentelemetry-js/pull/6052) @cjihrig +* test(sdk-node): ensure process.env is cleaned up between tests [#6066](https://github.com/open-telemetry/opentelemetry-js/pull/6066) @cjihrig ## 0.207.0 diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 004d5373bf4..6442a3ee032 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -122,6 +122,14 @@ describe('Node SDK', () => { }); describe('Basic Registration', () => { + afterEach(function () { + delete process.env.OTEL_LOGS_EXPORTER; + delete process.env.OTEL_LOG_LEVEL; + delete process.env.OTEL_METRICS_EXPORTER; + delete process.env.OTEL_PROPAGATORS; + delete process.env.OTEL_TRACES_EXPORTER; + }); + it('should not register more than the minimal SDK components', async () => { // need to set these to none, since the default value is 'otlp' process.env.OTEL_TRACES_EXPORTER = 'none'; @@ -148,8 +156,6 @@ describe('Node SDK', () => { logsDelegate, 'logger provider should not have changed' ); - delete process.env.OTEL_TRACES_EXPORTER; - delete process.env.OTEL_METRICS_EXPORTER; await sdk.shutdown(); }); @@ -169,7 +175,6 @@ describe('Node SDK', () => { logLevel: DiagLogLevel.ERROR, }); - delete process.env.OTEL_LOG_LEVEL; sdk.shutdown(); }); @@ -208,7 +213,6 @@ describe('Node SDK', () => { const apiTracerProvider = trace.getTracerProvider() as ProxyTracerProvider; assert.ok(apiTracerProvider.getDelegate() instanceof NodeTracerProvider); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -288,7 +292,6 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof MeterProvider); await sdk.shutdown(); - delete process.env.OTEL_TRACES_EXPORTER; }); it('should register a meter provider if multiple readers are provided', async () => { @@ -334,7 +337,6 @@ describe('Node SDK', () => { assert.strictEqual(sharedState.metricCollectors.length, 2); await sdk.shutdown(); - delete process.env.OTEL_TRACES_EXPORTER; }); it('should show deprecation warning when using metricReader option', async () => { @@ -366,7 +368,6 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof MeterProvider); await sdk.shutdown(); - delete process.env.OTEL_TRACES_EXPORTER; }); it('should not show deprecation warning when using metricReaders option', async () => { @@ -398,7 +399,6 @@ describe('Node SDK', () => { assert.ok(metrics.getMeterProvider() instanceof MeterProvider); await sdk.shutdown(); - delete process.env.OTEL_TRACES_EXPORTER; }); it('should register a logger provider if a log record processor is provided', async () => { @@ -428,7 +428,6 @@ describe('Node SDK', () => { LoggerProvider ); await sdk.shutdown(); - delete process.env.OTEL_TRACES_EXPORTER; }); it('should register a logger provider if multiple log record processors are provided', async () => { @@ -513,7 +512,6 @@ describe('Node SDK', () => { assert.deepStrictEqual(propagation.fields(), ['b3']); await sdk.shutdown(); - delete process.env.OTEL_PROPAGATORS; }); it('should not register propagators OTEL_PROPAGATORS contains "none"', async () => { @@ -528,7 +526,6 @@ describe('Node SDK', () => { assert.deepStrictEqual(propagation.fields(), []); await sdk.shutdown(); - delete process.env.OTEL_PROPAGATORS; }); it('should not register propagators OTEL_PROPAGATORS contains "none" alongside valid propagator', async () => { @@ -543,7 +540,6 @@ describe('Node SDK', () => { assert.deepStrictEqual(propagation.fields(), []); await sdk.shutdown(); - delete process.env.OTEL_PROPAGATORS; }); it('should not register propagators OTEL_PROPAGATORS contains valid propagator but option is set to null', async () => { @@ -559,7 +555,6 @@ describe('Node SDK', () => { assert.deepStrictEqual(propagation.fields(), []); await sdk.shutdown(); - delete process.env.OTEL_PROPAGATORS; }); }); @@ -839,6 +834,11 @@ describe('Node SDK', () => { }); describe('configureServiceName', async () => { + afterEach(function () { + delete process.env.OTEL_RESOURCE_ATTRIBUTES; + delete process.env.OTEL_SERVICE_NAME; + }); + it('should configure service name via config', async () => { const sdk = new NodeSDK({ serviceName: 'config-set-name', @@ -864,7 +864,6 @@ describe('Node SDK', () => { assertServiceResource(resource, { name: 'env-set-name', }); - delete process.env.OTEL_SERVICE_NAME; await sdk.shutdown(); }); @@ -881,7 +880,6 @@ describe('Node SDK', () => { assertServiceResource(resource, { name: 'config-set-name', }); - delete process.env.OTEL_SERVICE_NAME; await sdk.shutdown(); }); @@ -898,7 +896,6 @@ describe('Node SDK', () => { name: 'resource-env-set-name', instanceId: 'my-instance-id', }); - delete process.env.OTEL_RESOURCE_ATTRIBUTES; await sdk.shutdown(); }); @@ -917,12 +914,16 @@ describe('Node SDK', () => { name: 'config-set-name', instanceId: 'my-instance-id', }); - delete process.env.OTEL_RESOURCE_ATTRIBUTES; await sdk.shutdown(); }); }); describe('configureServiceInstanceId', async () => { + afterEach(function () { + delete process.env.OTEL_NODE_RESOURCE_DETECTORS; + delete process.env.OTEL_RESOURCE_ATTRIBUTES; + }); + it('should configure service instance id via OTEL_RESOURCE_ATTRIBUTES env var', async () => { process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.instance.id=627cc493,service.name=my-service,service.namespace'; @@ -936,7 +937,6 @@ describe('Node SDK', () => { name: 'my-service', instanceId: '627cc493', }); - delete process.env.OTEL_RESOURCE_ATTRIBUTES; await sdk.shutdown(); }); @@ -949,7 +949,6 @@ describe('Node SDK', () => { await resource.waitForAsyncAttributes?.(); assertServiceInstanceIdIsUUID(resource); - delete process.env.OTEL_NODE_RESOURCE_DETECTORS; await sdk.shutdown(); }); @@ -1225,6 +1224,8 @@ describe('Node SDK', () => { afterEach(() => { stubLogger.reset(); + delete process.env.OTEL_METRIC_EXPORT_INTERVAL; + delete process.env.OTEL_METRIC_EXPORT_TIMEOUT; delete process.env.OTEL_METRICS_EXPORTER; delete process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; delete process.env.OTEL_EXPORTER_METRICS_PROTOCOL; @@ -1404,7 +1405,6 @@ describe('Node SDK', () => { it('should use otlp with http/protobuf and and use user defined flushing settings', async () => { process.env.OTEL_METRICS_EXPORTER = 'otlp'; - process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'http/protobuf'; process.env.OTEL_METRIC_EXPORT_INTERVAL = '200'; process.env.OTEL_METRIC_EXPORT_TIMEOUT = '150'; delete process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL; @@ -1425,8 +1425,6 @@ describe('Node SDK', () => { 150 ); await sdk.shutdown(); - delete process.env.OTEL_METRIC_EXPORT_INTERVAL; - delete process.env.OTEL_METRIC_EXPORT_TIMEOUT; }); it('should use prometheus if that is set ', async () => { @@ -1463,6 +1461,9 @@ describe('Node SDK', () => { stubLoggerError = Sinon.stub(diag, 'warn'); }); afterEach(() => { + delete process.env.OTEL_EXPORTER_OTLP_PROTOCOL; + delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; + delete process.env.OTEL_TRACES_EXPORTER; stubLoggerError.restore(); }); @@ -1524,7 +1525,6 @@ describe('Node SDK', () => { assert.ok(listOfProcessors.length === 1); assert.ok(listOfProcessors[0] instanceof BatchSpanProcessor); assert.ok(listOfProcessors[0]['_exporter'] instanceof OTLPTraceExporter); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -1544,7 +1544,6 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof ConsoleSpanExporter ); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -1560,8 +1559,6 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof OTLPGrpcTraceExporter ); - delete process.env.OTEL_TRACES_EXPORTER; - delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); @@ -1578,8 +1575,6 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof OTLPGrpcTraceExporter ); - delete process.env.OTEL_TRACES_EXPORTER; - delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); @@ -1600,7 +1595,6 @@ describe('Node SDK', () => { 'tracer provider should not have changed' ); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -1639,7 +1633,6 @@ describe('Node SDK', () => { listOfProcessors[0]['_exporter'] instanceof OTLPProtoTraceExporter ); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -1658,7 +1651,6 @@ describe('Node SDK', () => { 'Unable to set up trace exporter(s) due to invalid exporter and/or protocol values.' ); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -1674,8 +1666,6 @@ describe('Node SDK', () => { assert.ok(listOfProcessors[0] instanceof BatchSpanProcessor); assert.ok(listOfProcessors[0]['_exporter'] instanceof ZipkinExporter); - delete process.env.OTEL_TRACES_EXPORTER; - delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); @@ -1695,8 +1685,6 @@ describe('Node SDK', () => { listOfProcessors[1]['_exporter'] instanceof OTLPGrpcTraceExporter ); - delete process.env.OTEL_TRACES_EXPORTER; - delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); @@ -1716,7 +1704,6 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[1]['_exporter'] instanceof OTLPProtoTraceExporter ); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -1732,7 +1719,6 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof ConsoleSpanExporter ); - delete process.env.OTEL_TRACES_EXPORTER; await sdk.shutdown(); }); @@ -1749,8 +1735,6 @@ describe('Node SDK', () => { assert.ok( listOfProcessors[0]['_exporter'] instanceof ConsoleSpanExporter ); - delete process.env.OTEL_TRACES_EXPORTER; - delete process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL; await sdk.shutdown(); }); }); From 3977d51044a8583671d3182be4b2c34676f2fe6b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 10:26:36 +0100 Subject: [PATCH 23/58] chore(deps): update node.js to v24 (#6069) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/peer-api.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/peer-api.yml b/.github/workflows/peer-api.yml index 7c94a3dce73..8943911cb76 100644 --- a/.github/workflows/peer-api.yml +++ b/.github/workflows/peer-api.yml @@ -14,7 +14,7 @@ jobs: peer-api-check: runs-on: ubuntu-latest container: - image: node:22@sha256:23c24e85395992be118734a39903e08c8f7d1abc73978c46b6bda90060091a49 + image: node:24@sha256:34af25027ee1b8bffd482ba995ec1e577fbd398db87beb4c60b80c2c9c025127 steps: - name: Checkout uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5 From ddae11d7e3c74ec6b8f0d8d64097dee2539c63af Mon Sep 17 00:00:00 2001 From: Marc Pichler Date: Mon, 3 Nov 2025 10:39:27 +0100 Subject: [PATCH 24/58] docs: document new release steps (#6033) --- doc/contributing/releasing.md | 20 +++++++++++++++--- .../releasing/approve-and-deploy.png | Bin 0 -> 109698 bytes .../releasing/waiting-for-approvals.png | Bin 0 -> 100372 bytes 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 doc/contributing/releasing/approve-and-deploy.png create mode 100644 doc/contributing/releasing/waiting-for-approvals.png diff --git a/doc/contributing/releasing.md b/doc/contributing/releasing.md index deabf54025b..d9bae481599 100644 --- a/doc/contributing/releasing.md +++ b/doc/contributing/releasing.md @@ -3,6 +3,10 @@ This document is aimed at Maintainers and describes how to release a new version of the packages contained in this repository. We aim to eventually automate this process as much as possible. +> [!IMPORTANT] +> You must have another maintainer approve the deployment to NPM. Make sure to coordinate with them before starting the release process. +> Never approve deployments that were not coordinated with you ahead of time. + ## 1. Create a release PR 1. Go to the [Release PR Workflow](https://github.com/open-telemetry/opentelemetry-js/actions/workflows/create-or-update-release-pr.yml) @@ -31,10 +35,20 @@ We aim to eventually automate this process as much as possible. 1. Go to the [NPM publish workflow](https://github.com/open-telemetry/opentelemetry-js/actions/workflows/publish-to-npm.yml) 2. Click "Run workflow" (from main) - 1. In rare cases not all packages are published due to a race when publishing, if you suspect this to - be the case, re-run the workflow: there should be enough time from 1. +3. Get another maintainer to approve the workflow run + 1. Have them navigate to the workflow run, and then click on "Review pending deployments" ![workflow job waiting for deployment approval](./releasing/waiting-for-approvals.png) + 2. They should then check the box and select "Approve and deploy" ![approve and deploy button](./releasing/approve-and-deploy.png) to approve the deployment to NPM. + +## 4. Troubleshooting NPM publishing issues + +> [!NOTE] +> You can skip this step if the `publish-to-npm` workflow completed successfully. + +- New packages that have never been published before cannot be published this way - contact an `@opentelemetry` org Admin to publish them manually. +- In rare cases not all packages are published due to a race when publishing, if you suspect this to be the case, re-run the workflow. + This will only publish packages that failed to publish the first time around. Repeat [Step 3: Publish to NPM](#3-publish-to-npm) until all packages are published. -## 4. Create GitHub Releases +## 5. Create GitHub Releases 1. Check out the commit created by merging the release PR 2. Run diff --git a/doc/contributing/releasing/approve-and-deploy.png b/doc/contributing/releasing/approve-and-deploy.png new file mode 100644 index 0000000000000000000000000000000000000000..737b923134236287e87ca9f2143c7f4f5507b8a8 GIT binary patch literal 109698 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⪻zw-%gabA0G_mne0(2iszXLG%8WnmFM2YoiGCWs8fs<#(>>PEuQ)kr^{@GvCFhb3ACP%35FCY~m@?lZ_Q&An^?7 z>cbn1Q?rl!gcp`j&r0JajYk?>9J4d8as4;F3G6i=7LlDAtjTdcWTPE@q@_d~~YyPOXv z0&cG&vA(H_T*eM80~b|$ypGVaw}aZv(ekc`m+2#5Tn!-+|tEasaj(Jm_*3m~7WRD3~ zx6fC9ij$9o{zid3Th*g+G|Bo!U z;2QPuMSZo!MU(7Q7)RODt6GcQ+eHDdC33C%Guq-Z*GSrl$6yXMeimvOVA6={Lysy; zB3GmTpLwU0z@-tI151mi!mCQV)u%C08UXYYgTAATN8wJtD@6%?Y#m^bT#Unrt@z9^ z-;+{jPuYLI?A0e??KTHyh$u45`LGJYNmOP|yx&_}!4rPzBOjVY>&^3ERUg?i^B_EX zic@;FX0qGTm_p2p)Is9M8r&0^Va`4cFJ8>d+G*%=f$vgc=#$*Mo8liVjQf%+iIMge ziA*X?J5OS&!9rU4i=i7H{r5X8nbDq_5A418jNTP{1m~#O{0jP>otq;Xc%_XQX$9Fm zY(DRxjI1)iFN?&3$wZq@YLT6lG@mXo32t1VYgO+drTv-`X;k+a+`(7BOx0-tMm4woLTgD1}M5NVQaEy!}RrgGHSzX<6OYxb5{=hQ5y7upbW| z%fj$00TJQv8L3gKC5D;})trxa5O+-4+Vhs0+CT{OE7N^uNjd z^>&k1W5nqYx`Cn-8Sx*vUD6wjW0;~YmMJ2ys0Y~#3T9%szAc}UYB(XYK7;lUz0pg+yI9e5_1elbBP>`cxJ>c@vv?>W=xnb{FU>{ct{UH)k=&I|M5l8=r z6MpHP1m1|L%$-yNoqd>6p1jWZSW+UeTA{G3p)$KrjLj`VK^|l;UwJYQssw&VwnO%7 zzO5~A{Ce}aD?L7|mDJ6SlU}0PtJPJi9kF-Fx+kEk-h^r35CIpll?o|~-?f@9Q{1h> zF-{S1mKH5${v1Rz*FwpW>?Lc>vHc2{UPp${>#DMdr{$Ct75|U=mUKML5!EmErjUJM z5j<^uJc9lUEP??CW_V_5D;Zm>CagcDG_rob(!n&uR=Xnu1$R(BE*cRXcmrHa7l9f} zov$96kEb|_c4Suvvy?t}DbjO|rHiNTjOv}|r3b|T>!o_WX16)5n&S1{vxEU>pnKiS zMrFp#z9Rf%TfNsVe0(Hs`=cpSJ?q0v9)K{`EA|mCc8-I(Q`z z0ew{YBFme(x_xeTSzOaV8}0*@yQ;{WN}+7zTep}2X9xZ8KAt+wsrh@E0;SS~O_EvX z?5>BQn~_u`SLj?=@xmvXM<`R$0)F@x##1P$LLj4ct9m1%Fhl7;i+xZz`o_W#Tga!n z@2KtJb9#ZwXlW?~#O%flIp1KtJe#lR9RGDz4vSuO4aspce)x~{ro;zu3#Q-XrY{dH z>8o9g?s(>k@zspu~4^DT3OF{)5JgYCGLcKlMgk=I;I4;>3Bz+AC+Mnac~|iW!n2; zP_%v*^Dp(ZmuO4goNdMq$pVuW8)12eK8FIkp!qK!e=b+=E#s+O+%K-KNCF;R=Itgf z8xu=>Su`1(L>99W&O$DaDig-MFD{(%$>=v#{{&l&3v1M8svoqbJ>>xwbXtDnGwGSn z!o!G?F`{>-S!FyLrBe0lr)$2*R>Y?U#EzDfwb|`C&8((H;OuRNPuFyrE?bH;a`WYX z9-@W$hg%HyVa`u&sC!d6+ggw-_c1oJk^Btxrk8sSAICqt>?UtT@?J{*mO|`cysZGp z{nmW<)#esp3Y5Pp?90FEOgc&M0u8(E|4Dyw8C6BR$%>Z8q@Z4SmGO3&KyIYYqi4^c z2~XpA9sQRt(`-|W&qrFa$v(s3SU^d$P6gVINte!=tzJFWp)-o`=D70JMNyes%#4J^ zeF#ZkHWXBqnEy64IV&=M^J!sqqfq(Rz@@6fz_@I&gzAw^$uf!^JTvh;3>M1ng6riK z+s+Acl*1TDlJp+7Fo5F$x0*!t68(VY+_SiRKF`yV*kdnyPo{Hr;hTKzxX~G9IPA2` z;Dzr}jyj{hq2@#?$X+JlPekJVhN**qyMmwRrb%K2R1(0^9&#%U&Uc!ESG7I6(tpZU zDOBp)${+duLn=O_rpa}eu$CUk3y(6vHB|=Hv_hZ+`I}rd!`Qm|S%kKg+ObB}h z<&_j*%c#0Jjm1cSA{{OrBoJuk0|}ft#RvZT!5Y$CtevTB0o_(tT|IxuT6xo$o!OJb zfLd9srmGpV&mMRnNxW8)o&{_$ohG3Gyxt~K-=MOyREqOrW{)4t_`rChZbG;$kK5sz z+F>)-qH29PsV8pOEIB&-bU?1xQwDmHAmO(z=>HJ$GiZ`Lg2du&;zfdA&0hhh4okO( zTNheYDybbW5$lQxWet*}$1^6&v6A@7VcS5evU3VR{n4M`nfemsqe%A1L7NZZEaa1mrhKXpjNsNRuen;7x{aOSZyQzT;+HEmSty_-Ke=;A(-+PRO-|*zGy97ETZX$471|QA!NL?Qx3_DiADW1< z-jMvVDZ@lHuXl@A1`%eQP;ZdA6-zEMeDZChwP`Xw76Wh`r5+LsM%wip%(-Rhb6D4e zy8vevzC;E;>`fMH+6?`gELNxSxjmmE(YZ8AW3*s4?86ovU(5)qt-W^_eZib@P<5nCC;U``hb+pVk5e>w|S#nAN~@_fx#-{ zc+@!MdbGFdZ3IA$fX@TVe+YF4mm!JHN5+$%V0+Fi!%ke=Z;^_iBKW;FEnRy-c_?c6 z3-o5>Z9A%Q@N0~ALWARjU<(geu4h1M3hmsRAo2jq7$Y-?r zqGp!^8J{J`n<4hZZYV*jCQ*xoJDvZDLI_&pUDQ-5WP3PO-tLOXfJkxM0>?5;Q(!Rn z5$=UHB@!hdmEQ+u%py+~y)jX=Ov{u=njUd!gC)I|TI}ZQZL(nb565^LW}g>O&~X$B zuA<$?=#s9LfG*^EpZ&+o6i@{`|(9>2%5Q!Pi`A`SUnA|drWYN@3RXZjl8(lP| z*J_Dd+P_KQ#<{gP@s>*DPn&l-%tl%-aL9h4MiBqc?R&ZXm+4Ib`wZfB(e>~4C(L%< zJNHv++s8f+qansL?gG=$|2!5*I*J(zOC_lPxB+rNY@GU2H|3aHY_=x^I5w}+0EGCs zj9l^Wl-_Z)+%NSy16N@Q3se0T9WC^J%0OD9r%IFVJSkZE?wgo(aD&Sk(^QXSQ5sWa zTQvTacIz7T-pr;dxA%1@VNdMq9hg*t|Kk>dp1Yl4Mc4afs5h=qe{2W6r@yR)zA@-H z`6h5iA|lY@M+r*cK9BPb&s$@j#~DhFl>Q`^!1ybUkKr6-WWnaUSvPg5{*|>m1Le+D z_jIs~Pc~%p_UEgWgom2Ya2$rNA#Y^Z9^@^c@!tbgSey`Ht=-IVJMV3oE~Y7fDm>&h zj`i!DF*gSi6Pad__uGDW6mv{{SHo#T?jYi6r}f_Wa3h4z=1Ea&X>r8USMz$)2nJ?% zz3yY+?fHrL`efnFt5i@$6-Pb6##*kl%0b`U6kE`|^=!>o$IU^SR4*8JZlk;XDVIdc z^hsjEO~PRt|9L?GDVTV>S(>HCxBQI`cpf?OcyH8fa$wE=3dwG}T>xxwHn)Dd&%RwM z0B^8W?YEp!`Iveepgi^Fjpl?=lwvUJLlgsn9@>$smc8ziMT%%shBl zwIhRd=ivXb_m*K%u3a1OfFKAe4HAN&fV9$$v^3J)p>#J4NC_w?N_Tg6mw@EZHNX(k zF?2J0H~ZPo`{;i5e!pMeukSq$e~cV6cUTrmCK^=nx}*IQMmBm;FVD#{Py#|gGcke7Ji2J8XUXL9VGqs}t^wVA27P_lpVL{!y+~E&4*1222K7 zf>59W>1gK75OW5I^jS17*glaR`}K~XQ)W&UtBS5R5wzBp0dd38dH>GNcV1?$IdMBp zk$bJ?kmL-2hSdVfgw)S6v72Uh#q$rus4)P^zs#&ThUGTEk9UmQw5cP->T{QxHjqc( zG{%M!y1!<@U2{y{f?WINv|UgESZa)ZGj_Yf76F!h$U ziU$Z!^-}FGghmx?0s&!g-ms~9OG2Nxa<{ZCag3VdXCTLGKBL20ARy%-n8F1QZpY!1 zkrjrTcmZ2bWh*adt~ZhK>-2?=fa6)iXC7smzL^xRXQY?HV-ofkzVm}%FnX((4p_hw z;LLSU7XXeU{Tl6|*4tG`f}Cj|ztIX$o7eH>M3$rER^Ye!AusvT0vwk*|JzpQ-~NR} z0nNsfNmA9wd%6Q00n(0SgyfVZ{CS$7Ln#V=w-3qrlS9sHR6=sYCNQDPjdzsH8-A!I zoJNjy>FuHHPoDV7Cvr>S(aKdbn$$62axkvW1is1W9vOqQd{iUA#r5u~p8o;pCU-oJ zJQ4_*wTzq%3+hfKn`8)jV{&BUSTWkTzNr=I$@m99bj0gBqTa}73sW~`-!fO#(?s_M z*sY>+R!;Az{N9>C%pmnZhM*}F<;pk4rRe>L(7q@p886$3Vr@y~00mtEb|R5kw*d$X zriTL8TSgrZvWob9=f-mhSNjy{9=Y-<`2NSZidnBihvl6X>+C|!@*h68Zg&db#R=1( zI0f*%>@Kq?@>+f+MZ(t}BC_;Pi+3pOt+z6CNx9^oBgIBsPbN2w0W_a{*Q2R!#s+G| zTO(l#DNreS*W|Wf@77-k3a zpJpGgmX>w*sn$++_-eK8&LyD}P2FqN89Y7f*;LI_1gZm2c+2SfK$%$`Av@Ah*x@F} zR>14oPX#7JOp|pBKutPV@4BnF_lLqs)%9$J^?KRC$_FM7F3gnG<-iETs!-qH*;kN% z&jLsY48TucX&;%x53RFV&Sp9?YEb7UW|F;G#q8nK3VeR+0%SlZf3Pp#RYAM6ReVJ{ zRWl+gMHZ%;d%b-Jo(VK^7SeI7SzerRV6L;e^Rs0FMoUAVcau5rS6nUQO`c6sbNV|L zpFW}d&Vqx`pK&5f17*AWr5~R-r--uWPG^SRWRmkzvBBsH`M9z3i(aImBK+SghRH`NW-*(PpjS_k9vhXDHt{Bsq0N`-CJ*WObBTPlD>(0e# zn*8Hgt|7J<%Yui=g>kB+IaB!78vTM`#Cv7O8V9~Kd#G)Ta)POYiu4a8>=oh*cH{DG4Vt{Haw4(oW7P6Y<8 z`YK7v{N}q6V>z%_ITkezU%%3Upmi8;?!hklm9> zb9ZdcX>H9lWd&IG+3~^lIWlO!=f!SZ0k(?1Px7@wt<}AeL4|Sq?VYRB7*K!rQTMIu z2Ae2bN$kl6fEP(;8(|_vHUDwz~LHWogAMxyJct z(pO>0+y_wEbvW7_hX>BK0pitOS560FhEj1eC$WctXHc0BtsV<<8RR~-wR+D+vybg% zjg%^pJ|Zhu#=YEOAmM)dp?hn|SpMRbWtfO=v`Ug%I(JFq(O>>UR}b#M@kJ3 zU+Rta6T@oH3*_Gd>+O9Ro^%wqhgYO6;=t2zy*|DCz{r)}I3Umwpe)E8mogRJwu?df zmZs@bnBF^E+9`up%Zl}y=$Td~3w0ry5q|pd{mC3pXIw`rL3&SgKQg!2ArK?1fSFfe5^^iK6$)+ z;WdTrv43u!QMHUr=xRBZZ$92M-hkFLQ4|)X9)d~4jICe5tdq~%Of#R!;9c*elHYHf zAFJoF?@q$W-pf_I!7y1VI2luTC~)OC>0-&qmUbDuQhyDGXQ!qO z-q+c0Gf|X{H94gLD!5Z-aJm0eA%x3w^bS}Z?ZKwx@zywj4K_^=Xa4+#+xC1wi{y63 z_@MgBi0LA2bBnqBKqsv9F6A;h5QSiAOgK3oO*3RUz0S*EK8e>Q^+Y7K8hZcB^_?0x zHV2E~xm&uEeR_CSH`E8pyt?bO6r*Fduw41>`r}^rl?Z#=j8&ieXg603lh%tE=@|MR zDd@t^mAN{bI7RqD$ktC-Jk|kFZewyKwX$yV*^!1CcdtxeM!7u48YMfc4^QEyEUIxo_nzl>5An9Wz_o!j zGr=hj@8SDc0wJtaox_R~-V1MHmSXE^i-Ukti58~~T+`Pn$r$Km&_S@JP6S>IVzNY^ z$Pp3BAx5}JI*oT~28bS*99=yO4IiwFzn@Da<8#rO&zW8FF&&5>57Qfz1BBr$Efib< zEV`@7`X4@Th;P#Yo-$tmQt;I1kbCtTpR4>v#ne~d;)`?KL+^#Ub_j*b=vOv#m)@^@ zH42BO9bIxqBYlsHI)Vb+PK0bYWEaGYyiUqxJ|!3-N`=mxmP|h>FSy)<)Y;27zUYah zW(&lpM<1TNNBGw^C|o9B_)D?&9VG5y`8SCgN>l)yB`-bsC2?@PQq6ic*RS%xY_act z_9b?8tw~?sPi!C&lUlsc_+TRAGDqb+#pl0~MU*UqkrUzg-%9+~uYdt7x_e*aKxD!f zLADk?8>S)Fc-+q6AHH$|rwxH4%2u3{a!7}Pa!BFV0<|jE@nYRDH#$D;s4$SGZvO>9QA>I_tKe5uhfbQ_lVeAiC{m?J|bV|SVgErI%E2zsLpfh8k4-75doZW~+0d?R@#j&uf% zgN-hvbz~R@osmAc_gC!@ASL3zh12(Ukfu7G2@{~Z$ru2UPo-OrQh_^!yrl2bOd;|! z+;6R)61YN&{7&IQuh1TnWwxAbe_2y57rRIQ=D?8tO(S;{xRPw8=PREugiY|Fpmmq* zOoe#~8L#u^7`xSa>KXS({q95nE+2TCbDQ>m{zC4tE=;eKiGJI|Ku)LIThiTT@Rwj4 z_-{|bZM=OQ2uf^R<0*dl*YxavWKg>@w^mUzXO6_p&i-xcfrFx5=_H<{bvvOl+P`9_ ztGR}JVsSA8JZ{Xpf1_#t^VD_}c()Shf;)Uy5qSqv0Icb~e>kG<1Hc^#MU@lU}>&3TA;>~lR zSKB#iOpZPVy31((T4(-sRllHIQGyN?>6A)Eb<~GObv{yxkCr-eKl0ho`JfJ zyr!w+-)_D5Y>{I$E(_V(_|c}yb_S|`{p2sI%U=?sQ?A<$e@VfDY$xW10?d*~7|E6z zVC5Favwpmq{O5t*X~O+c_kg0<>qHV%R8*x9s=%?m|DsBMnY|K8e0x;V&95M@^AS_6 zdatVO=|X#N=>*PC(8{R_SBf1d_;ayt19RVWCXaI0{i8GEmFJS-+cwratc!+=?B)n6 zBc!@sJc8$7gjabSt~Zy}taP_RawcOO+nc!@i~67s_`Z;2K81n_goucBHqC>rH-JRh zb6%C19Y})d0#m-MjdT|H~AJ&-ZWL$DCLS$^zi9hek}9k!sz) z-u))%&1*?tYP(?Et)S&j2#&Jr3nU0c*8v2r1@p{pJAfEl9`G?~?O25A(gYM=2Wqcu z#8AA2%>5oI$L@vh$sTs$C$eVYd-2?Kr+EGZ=ZR^CWj|Ocb5C3;n0({r#?6IeErrpV zXf;Azveyv8FKaN z;OT9At#C~Rx+%L1_5Kv(jjsmy%WT^(3}VPI#V? zpkNLq$kUN_=QQ5>&cx!AG!4coZB=AQGw!>XAO)1H1wyVo-pi87YCfDDsx|=u~taZw#e% zRBCEGTI-7m&R5S9)2^}35e<$|j2ofO``OVMV7uVl?))8)1) zW~o*p;(oX~kx-ij5YPKp;zGlpwz$@NEEI-<23jyqadF1--HidBLZjX;mc!L=`%-0K zv(jRKMM=YEyzvV)H-&&lBB#|f&CG0+T8DeUS>JLyS}Cc6iPy8C^W$cx%Mem|`@; z`F}&SXMZ^U3m+Wc(;cY7WZ;VJ1Y=xapbb*ZrN`C;Q~cqwk)~Q+dq#T++~4NdLxRW` z3_}Q=-=Ws7W^~%U5(lXGI~+EOleli`MVgX8V@ZsV9t+Uuao!mbOCLqAaSYzQPC!gG zsow{y*M4!+(%8tVMlpycmnNjkq#)UNCiaApQRiw%kQx$ORPX;D89qH-vo-7A-ifsy zzLT6qva}*5yI5!^H&OxPE1%vIwjK8GI(?drKoqukt>mwyQ>zb>?Ne2rA9@{^$zvM+ z+^n)Je=hdo=$Yci^%BGN9M<7R4uR#$9#dy;(CQK~p8g`%BJ9flUWx~q;N_j^T&oS- zBb|g*d`8YT*+Rb-zN^Ov_!@~!2a1#)`_pPiz8Wiw5qtAfQkAFhYlqy3?k3A3{Qd4J zDeL>TtIBEb&+|N1x;rrvXft%lH6%o-FwbDX?9>h79e9WI{(FxZSH~5Z_!6PV=1_MC z>}KdpDrJ;u-{Fhsz7f`NY7MN^x{pOs;?repafqD#Kx+Zc#nHBe_+vy;)y)D930*U0 zqe$=lMh^?%l@m&hYR=%@X-RlQN@4lSuH&t-)HP`3hqA}O%PD?&qODEOZi8+p3-aD- z5p+GZRBW-8$|~(W>ho6`4FQ3HQl}3j5d!pEQzBeItjlVBnugh$6VM6WtZMmT#yAyC z|0c1QUugu_?ew}rUyBISTRn(2!1Kd<)C29~weMZF3~D7r&aQ!`GUOhW+fSFK^45b& zyLc$ScigQisN-E?>%rl6`YA+mu&d!df2yS-*NeROp1SXyO{QfO&@(1lm0TEUvU|;! z(KU)hsb}|y%L07`pIH}|we*R=Ne1L+U+}!G(|&^DJ6E}RbeDYnH01NQiYZ(x74lKk z*;AxQ8c8f+njLpfvK!l}IEs`p`F^tB*Y7-8Sya6Vo6(q;-FzZ(LmXrLHp!#C?}FxQU=c8jF(t5<%5TKGJuK%7<=EoVG+pV7%1$nEEY4AHNW-k5iGnGy@PZ_0k2C`6Azw={Rc#z&$}~X0 zA^;s3zJ=aU#mX zZWG#YR-d}bp+&n$f;vTM0lLrP^*}$*QHu~F()nt{zTZx*Rc@8FJzf4zRJ!2YqS5`3#u{JHRRL4qRXTGeXyZH9$MT48 z>DVk@Ciy<}dUT9#kVGDaq7Z1c1r7czzKt=^526ysG-y7_NMInOVaV&tJtttR9F18I$D_o(IZ#O{r4GDb?Ti0%S{F!4d|y#t3mV$ z`o!a;B-%FhP!an-ng!X=g}%<;^?8R)znhSAc%%wCp=ARDMHwX+;HrBrV@3M6JaLQ| zKotvidi_#_1pN;nXMC<|AF$K|Jnx;@T1|92>26be^H&^o=U%t9+-d z{P1OSPu!fN4k1g)6q=dWFTG2MnqNB%U&JHTv%T+ z$E}^u)r%Wn>@7n~=jB0y2e6kU>{oX*Z(ipG=P5+kOaSWd7P#*Gx+K^4mQHRjUc+z4 zH8E?I5q=#$MIGfg7TR2O_vRYG1DwZ_`{P4tzc4(Z>z14q&$iy3OGc`b`aD0 zfAaa;5C0-NI%ttJ(AMb&Ch82+3=g_BUKylP_j+u0IM=%s)Tpj_kQV4&t-oo*_f_@W zg&+>N<&$WbwtlEk;hcd4?bbg`y|#$tzuq^}ysU(;4lys*#9kjp;UM^7J{1M^>~&w} zYbt!65eo6_jmROsXewa~et^QeF*ZZyQr zA(e9Apiwv5T_hnjWpa1D6WEJToZk+*PUd{4C|QD=?pe#dYNSv? zj5dD{Yk#9%a%oT(JRDV^zT)PUEFQ-HIti#$l$#DP_J!XoGuiv_(gE)kp#t{{v}EHv zrL2!98BtsmA0Jdqx0@dysBRS!2b3CdEmGM;$}nWs4? z%@(C=PVGxs+#^ z#1SzpGEDJfu6R0{sl(kqE1lIxU$9?k#3~AFJ}qa_CYUE6ExKl6)Y*B@tnz$65c*(a z(tpBwib@}m>)vjB>Q?j=NQwfg5!GLt;|2S0rE9Um-fi=ZLI>KyG0LRsD2cfoKK$%n zUWaW+83&C5^9BNb90ohLobxBY8~(7#?PczMpUv&*lzj^M(q%tO1owJ6-6huQOKw>b zK9NSJAJ0ZNjjy|kj?TGYJ&ceJ-m3h*qm!GRY81NW6vpy+$C%E;U0tZM&7$&5LhGsM zIWP~;*FBM?^IG$=&x|KCNtH4M%5J!yTS!<(+45>(%?zq0$FwN(@QI)iF4MW^InZs& z$n|tKqVqzDIxNIoM^_Ryw{7-z7rD&vUFLe%^;w+CYpWl}W;NjxjSCJ0Q^5=ksESJ^ z^yV$IB`zL4CmL7jKMRN}G8vG@lOqll7qQQ;z)SX!0!tN&a9}fE)rg)~tO$-~%YUBi z+=$h<@UV50owu^OD69jLC6}7DdqSQJ-&mgBJe)fBFfV|{Rjg^lSjc4%*7&f)Nfem| zc!iK=xlB@0JJTJs<`Vk7)A#;*U62ARqm%&lrB3F{Q&r>_HxE|UxNf{j_XaP^Q-G{? z_mNr=^vM?K2ZA>)K0at6EfKvWuI*?YjFaq*A`8IPn!-+4Dzj%e@_Q>0!_C^ZVFE3$ zj80yn`q=Cp`inxN<#NBAxuX8w-UC!MffU8{nI0g(FguKpvVDKc2T4M<-f5P6+Ia@r zS`N53iA#p-59*hxf#D$&p%Ko0qc9!ZLVlr*xKAKx8x`Am?6E-c*-F6VF5x$I49W@S zZv=>Mu9$B=bbFnjn=|6Xp+<4dlT$U6g06=A1Jj+?JZ!p!PR=A#$ORLx>h=a2wOPtX z7<0Y$cAs#)2|$HWKJC(Kj~eG@Z4+9B5uXtT;`h^nWwFRs8_BMqEIN#JmW6Tm-n?7U z@-)kmA*8LY{E3|)x1jMukx<_Od&fU;^o!`FmYQ$I_bxtg2*nkn#eTM`*^oHd$yco@ z|3HBT^K;=wbUO?@p-0T(E`$=iF0S`ly=DvAEmTt+>p}g?`?d0EX2-o_i&@obRf3$h zgzlnNBt7Y+x{qGgMl`~7xQvd(W@>Iyb=lro=P{0J%qrSo_roJM`yDsj%cN$G;A?qQ zHL?0CAKh&~tG5T+1R@qM;pq141!OWe@`tW&F?$W~h`gq`ECs4sE(+ZP?ow*6}&KrKq`Fm#S>E+h;u{J}O@J zGNIh|UL55x4@W!dcug^6(bJ?YZW2^?pW-Syfx3)2A9}pV>Jrw*a-w2j)&a!uJ8=Je z<+3D*x~h5C{2=X0z3(M>Z}-&}FMrv`fu_YZkhT}p+9G=}33Z(E+EXe28=dMGH{vqi zXl8xml>ro34VJ|H%H{+exNY=>4AJ44ynC|b)yN0^egZreo~X~4urfSyRD+y-6`qoV zjd{z|MhTzcpJ7}0*QiM~-jFZ?L)#PkYi+-^iySxGTUH7Um_M-~ zJJv}h_&_gSQ(XhLf=614f`%%UCP73y^?rS2OKO{=>kPRUgC01@Bu>7Bt&?okGsu^!cH_s+L`)Ze)C4 z)=7PHX2#Hd8hl#g^P}QNhY=Q9b5Op53O4Do7&bg~5P?${f!m>ZWlp(YI;Ha2m38gK zLeXTPMr?`_N@nRS)>#5EJhA!JS%O-^=Y4zQryxh6>et3NkuiJ8xTl|8KftcGT#Bi5 zXGc4^^yK?@364@Z2_0}h99J_=R8%cqeA3Q5W|-W+YbR}DR510*P`oItG9O$<6&Ml- zuQbX7OO@d~Wl^1ElF&3U+~Od78GhyZZS|`5dwI~$febf1x`!^t6{^lShHXC%{fVE; z7|mUL693X?6!%j5jNa1FEJf}^RikXmrQ;B)!Qi2L1vNuMwjrjlvXu=DU}<47q`+v0 zXtn;?V1MSsdg*PUCLG^7T5VY&-5i>g-Z)(?R)zS3s-GQ3N9GitPAn=oZBh7iuNIf- z3vA>8eeJ5f#!thS(VaFv&AH}Sllz#@9XUWT34Se*c@5AhQS@iY&Zf0gA!zMK^(TAW zWK$*dwtGD?!_#YgEoX}c%#N^=U{cf<-8LC~Np9itD%_g1{Q=L$ZJfq+D|Ew2 zYtMugr{WES-N> zt8@&seD34k)%FwE5MGcoV#n?8Qd^zoNm}CpSpe90Arf+tOBxpy6$?2RRB_GrR6(nr z-*3u1)SLeL%$TZC!m|2IdWMuO1WNM|B3(m$+E0O{uARQC&T@B_y08OZLu= z(+Nr6{C%?CE2BRI5hvIY4+O31I;tY&|-wS%3tEH#>&YXYNE zwH(NSJa=A{ay1?yD+zD|h?&a>{)ulPaG5V5sLU>Lt?6$?7w;}7$wI_4&XJ zf$h7KEYzo7ltJ9i^Z?D4EBO%6j2>FWxTRHj%t`b)#7A6)lrpNo#C4sF)Umdy#8H*| zP5az^gxlMsKx(9}_N0WLE|0y&cZdu1D($?v7Cq}i_uBdmbEd4eCV{CXP6HOIKl?c1 za3~l9%6$if!OVx}bX?D^0tY6hJPg8y04hz-qhtgH(d6S-*55;M=in?2Eb%}nMy8=*O zMLEm-F@;?<`&h28*7v4)0N2K4Hy{uL+{zf+5HNXWK&SA^>#BT1eSW5TB)YDZ{x+d2S^B68neb-MOXiH<%yKmLJ#+Ik@Optx zS^eh6fc+7@IIniU z(H{nbtXxZ+U0-Ie7lvDR0cPu*TpYMHK!n=Mgan~Hk+Hmc(o>-0b>vorC!jWXoZcf< zd36Du7O|Uu7CfvQk!!Dz$jdY<+DKb5Kls3=aJ8Hny}T-WSN-&ylPNdajkDs$A!o0_ zE{9FHc6_mQ>G`D%m;b?BZvlg#7dTh*8hkQ%XE0>xx&zL!yZ+wky9k;vs(9Oc+3EbT zEnJ8%^s%S<_5;t7DFPgnvO9!gNCX?HBa6H@?zH{$CQ`e=I~Xy~K2lUPjGo3#lb!GK z!3!OBAhh0687yM#>tWP$iV7_e$14e#-H+W%k72vT%Vn}IRys{(;mrw1*HF7WoOO;f z7H1V-6-Bs!44y9gjEIg!{49mMCV0jP&1@ie?@7vF2wTfwvJ&*#XPUUq z3X5Zrc=i<3eQCdgDZ06(5;JYN2Oo94vsj2b&a#!t@Kn&#+K*l^|0$?|U?;VJN~A=; z$VSYmVqanVJ+nF%nt4e6zWmThAjHimts;8VL6p2+=1MN*_WPg=<|kJRV&xhLCU2Z) zZ@xe%65NpO7{LuQv|K{oDZM`W9c#@7MDm9v$H}U19c(akwCGU`=H4pCxL>vr)sDe; zt-BPgR4Exj-F+pnJ9n7*8G4UHZj5C5R5?zs1iSH=yw&mOQ#Uc$g$gy^kk^ujaM-F= zj-F>QJ0D#NbNMUBJhaL3WdT_>VF@5Uek3{k1PdV88ozK$X!bU_{#+1KngY$=)zqKK zy-e*DNk5d@+9R&#H7?UhDjW6~ztGm*xiZs`KX=TZ`v^>QT48nFZET$jW&vs_*)~R- z+?J1f>m9p4^~1t#CZax9AST!!Y#0#dX@2*1J&$f~P9=qB*;d>{ zb1l!ekDx-TEJx8)=M6V*ioE^8Yv4)>wC_9LTS6mP3>Tm_+KC0e0y%9qyCXy7L|1>2 zKaomGlkD1cQ}@hM<&-KWj`}#{E{sW>aad`~{*dYmulMA$tSnQro|_84hy}Nm4nWe< z5+QV${*mO``N_n&sq?)XQ=-JjRyrN!KsOSA)OA+T@v2a1*D0ZT{HFN3z)6(3i?L#&Ns_%5Zl)Wn`#@4Z1Na|{mKJM z*Z24)1qM%xt4kocLGIuiKInJYwpvc9OPcF{@ueQe_j)*&`!p_C zAN!0MtB@mkKc*l(gTf1Gsz%MlU6346$A3J_aB?v9^kF2TVfQV>825-gZ~D7Tm~+E|?G(f2A|sX9ZZc-1K z;7vIka8xtU;o#;Hu<2=uR-PB&+BM=_+opOja9VP~pjI}VbuMUVoq4V}j7WfY^+n*( z^a2eQBxhq2PE|_ap)(a#Kb>n>K84PM`ZUec;)42n4%egn2`AfXOqd1)3=qy;Je{FS z{Svu?Tp}ChfyaL!1P@H(0C5fX(r&`Y+N5aikRW}1eQ}&M^|21x&&~*HK;-&fjn^1| zdURPpV3L%Zw?U7rZ^9Wd`q?6S6EfZ8RrcW7URl|6t8;6hd3S$ZJ#wkqW<$k2+kkZv z)fiEA9Y>iVS7)3omI&N?J`~5765bQ)W~Pa+lYaVv{^KZK)!%ypl0<(B%JIxrRRXIb zml8T7cRqxk5L7*qeRf7#p5(DKJQ2yDBhM5wwkhq;0%Fmr)EKOPQvQuE875-hwvO4_ z{Nns`nVAcr!lDaalbZ0tZd-(weuP#R5g!AdF9&>+HEb=v?KB|~*tpS37B2}NHe231 z_AhK^)Qz=`K23HUjyh4Adv*VM0k7fkg0P9}%OQk++Eiv8I5Z-*p*`e7B_hnf_xpYI z96lN)*LLJm&6&dJNS{3}zlMX6s!3#SM$lHIt+!qh>XPu~4&6lyg;$tBjdZJmYXXgh zjx|Q>O!MKr;kQj?RK&-!;9w3b=dA`& zbZwBN>XL4*WfWh3HUMuUJtZ`-gEtf~OUH)AJk?`)x z8&YBg(8*d)tjWmgB5 zwhx+<==XL6J8{gg&*jYpvfiKWAJR3HuEkgvNGjjHR)X~ zn2%4)vE*_oM6l*fFnO)*!p*4W#-`2Th4F9=zA88@Mqj&3g`M#(ucgYGORFuU=EVW3 zf&Qae$5TLI-SO}!Y}#>76OnR$_$j69p$l;X26ajEd9fVS;c%dEJVyWRQ4FltKSIDd z!^!b!P31{M-snp2mTlF3+4mWh7Y)`!t+{ee-=kyVrG1dI181&yyg;B63*lmK5x0|;;a7Q(p42yeke*sRkV8ASyIsNusZk{dO7}s zR8;752m@2C0+%(rW=`2NC0A4AQkxg+h3&>6u{Wwn8f}-55DYzkcq3(RQa^)PKaAD5 zgp%<|0qXKJ(f#{{NS4~53ArDGEk`6!^=ovd-@V;^**Scmwt3 zrD|YXcZ$#O#0F+7FIecpDf1KT`&r(2jE7IHWFqp3stXrBStco z!2U-@y>bR6MMX?*!0 z!)Cl@(EG{{TEuehR5~W%j9BMC@GjqS%<>+xODlV|Ys&bg00Zz0h*MWa{S{u8@flcM z)?SLKwYILAjtwK&nK~?JGqeQ}rcO|GY)dfFLP$+<8$SLSNfOHgZ~kL_h2C1l{pOmY zWgo@BIm~YSxJDEF#bQ6h28Gwvf@NC5?a|FLiu-z*`F59RybEk+5^X7vnRJ4>gk&s! z{fFoYSKt0*4e3DR$wY(SQ0j&ul3VIKI3#bh@c5fn<|dZywLQ;7t@)#?z0a-E14O=6 z$qf{4vdz~BG=Zq=kG2ZeetGFdhy}0x@tXGo5njU+=e4S7CJWSSGlKb`43VJ$S3v`= zT4fwT^`f0=;>s5~^phEP*c(IC3z<_Wy#~UD@v-SbdZ)}!&i!dh~~VKM@5~jFNYek!lHPP11#M zy(jOK)fX7ezpB`7QVxEQ5$PRPn2X|=CXxxwq+tYI?vhm|PQYD=)a^z5wbFu64XPrW zF1q+Kd;%^^s}e6v8ut>F?+AC_P?l_Hft&ZMHliynXXA3nShQ`c>HxRH#N~oBGpHOP zc13Qf!yD_&?nRrBw8?R1^!d|=!^KOGTFOVEgsl0p_ZWONkG2GxPVE$L;&YO{rC!{< z9_W(oj;B}{e?b2v(RE){SfIEO4+9tHoo?Kkp3hV1b%*`k+-3W5-y2l5xsWm4I8Y%A z#qJB4)az8_ih9!FJ$*voV?>A7?%u4)dPP2q^DL|L037Xjh2L{fhcxOQa%m`dO^5qM zY|i4qLHp?@ER0VGkt=FalT_mxW6$Kv;oodkzn!0eoW}M1XHqWK$qjKz#~?5FRnv-T zm7tgEl*(>1sL-AK@j>IqN5@$y-cg5pU0N0^o&$2ju!2RAi^y$>Ww>riNWMrtih(s( zT$w##W!XhhvEFL`HI(KYU=NDwe)f{SuhcL-=374qgS;daaY2s+qUamu%~0Y8=1Cqv z173NJfa^rP1>NO`GHiusD%2p$$HvWw!R8}paD?%A!KwGj2Ca0;e8SzH=F6}r<&j_a z=rO_iNLv{*XC#oGp1jPvk-y}~Pd@XYVEaBb_57l}Q|rEG(L?r6oJ+F4h{&L(QX5>F3^*CpG zPxCh=gyaJp_ID;Mjpy*!M;7d2-?@AQpC70BRpn(1T~0No?h4e=7bO0#SQ$c zZrzNJLK9!uNAjO<_xX*d(iAvXVZ26^uV^6DMOCNeZh}a{WWa(J({ z&o!&AC}Y8@LR(V_{cP`FzbKtJLS3MQG?8gs>skk_?a}z#NVzczcM)-orH`F16VJX{ z{|RZy4m(lrn5)qvtu>SS8Rx>R1~65M$8TZ~m~qyZ$6rQo;8VFyuJ(cUTj>*Uk_)Tm zyu?2;xHp)sP`I}kP22-2UB$GwVB@AD=vsNMOq{b{r>9q5lffM-V4Q~A4vm) z-VAKsb-K{q(A%pOv%Vah|8#3-~7sbJ8$jIDWFH}wo_*_$C?2vG@K`fm2AhZdxfe?sxlVv zan6K?p9XhGNO;Gr1O1{fftB{Yrv*ao49`?hCLDkeF$5PLB}H2yy(-K0khi9TGK%py zEA%39a>2HAU9ICR-MN-x(GrX&RwWiuqdCi7LA7GI>|zw}KH*KN0r$LfSfivLyAG2V zI-9ui@oIFO!!9c+d+uuZISzscPO@StLpZB&i~NfVx;6Pix?59!8VG94?w^XfRv9)u zNpz>uq+*Kas+g!#oqLbrJ)YCNxf7W1zd* zyD=Q4J9&k!@SRl-+&>t{2hp0YVwEXPs!Gx~KhqJnAs{+DaPYsxSkruLHWM5jg&gI zSjG<}%GL`jD?%BWIVYl=4@TxEHjmiw`sf>oD^_1u$4y@7mS$`3=c!&^p@#K)n?SSn z&buCTY@&GkWkIq9GcH83%VQjh9~1cAa3pZhTrf5`Tr?HJRxU(j^`isyKh}96-t_ge z5%$eMXtoNCn`1~Xdx)Kr`={1JLyR0FnEFpYXj@1AklTQfcrQ-nzUf#nl~rAtcoto@ z+lkO+1GB8fwd@QelrV%K20p41+5ZwWVQVDZCRGwdNN(22E2^{FRLFJ&s-Jc4pp03Z zbwSaf(MEM0xqi$;DE|(#e*5wAty2oRkL30#p+0Zx1+v|yMs`Ma&HVLipNkds^Uhl9 zA?*2emdDmgw14}1?c3i=-~uO)8mvMBw~GMse5*mO{Sm|3-tC;guY@7Gi3 z#smCN01mR36}zplmq zE!Uq9?Efdr^+IKT{@=3z{?F2G0pwpBlY48eM_D~H=_K@f{BzgyS$os&t3Cn*Abu|C z>+AEkB!Y*3$ya+VFJCOMQ)QnMRpt1Pcrd|O}y;h-riOn z(GBR!nPdp7&wN7V85I!9_{KbBHH^N}g9yE~pgUsZ@9^vv!d~6Q1vdQsUho8}n7ffg z4>7m%2JSzg(Gx`izwIcAmO7s4E(b1q%!Sf8+rsi<>zLJWX2JQF!(RKnw0IGq#QPk* zzv94eNJ%Vrn||}(Xd=~m<~(5Yct67PkNDw^Y=ul@2(%Pmk)=QTr)&D0b_>dP{6UFn zc;9S>SPH{ElKYo($fd7p=GaQ_LEe<%Xb{l!lhG&pomy5_H__wPgd{k%oLDM}En zQ1J76{{)gI&u?j~)+ZqIb(AdaU#{f0kFO4HuYMcb_iKviw}5{Fc-C*XRSpAeUpA-r zBTWCxdI65d1--QgLMi=Aob>y%AeO#;058y6iFt)L2>)?a`ET75AIiedHEil%>Mg&m ziQj$dTdw{Q%EJAmR42@TTGiLdw?6nWvfY8>hsfXV{+IiG74(N4-bc0zl2@!p{ijuZ zrT|=h`$Ht|a~?6Ne_ROB+Xr;_E)usW?en?!zntZ_kCC*%)&HM)0fp87Gp|1p_y5f6 z&xQE^2EFXw6B5S!SfcLBtgY1um6kRYcXz*g63P7csC_kwZenUKU_XThy+04TL22*hUV|_f!mBUtG(Rs9)}kH4s-v5Gfz1EJe;?rzdDncWnzB>;ED}p zVal#rNb7@Dm@dm zl7=CtB#Dtsdr{Xo97zD{UjSI&>Xdj27tySA3)u<5XgS`T5I!34wNJzRpUe5T6Zzw~ z`}cAmHCol#8`dkK+l-a^vD?mY`}mQ_1I;ubNl@`(2$9WT%~g?pN%7bKM5l#rvDxv# ze=g{^vgwLAb-9z~_pEm`n#fN}_vA6lxovDyFrx20MrUO2VZ zTZF`mct8%pnt2bi)t!}TL#ouMGc=&L-fMRq<9u>4|Eki#*k!kvA-tHd>|Lkn11qsf zc>xAoiw&!ZS@2Gf?dD0E;q`m1P1J#Z@I3~{_ZaoG-p&cHci9zbv+G`Cs8SGH(yE1LA;1agh8uyFy_*amAXH;hQq{Tz$xySdUyGcHKXi$mcc`j4&C~o)J@} z&-#)x)fRdM0^*?X1>jj`y*smA6<}&}hZ%Zm5IylP+0yP>1W>pxi45uBG zh)ONxM3JV{@76D^Ti_(9=}fdrIPHv8P^A$L0`d$bUb(+Fi_E0|hpx8_i?Ut6hX)iz z5K(YINEZIM#H)9|m&)dCxg$UU1=bJ1ff4hZ1#5SPc!+iS=1cZ$M_xHqq zw_yOqf>0nZ0=(>F5I_LRNIdhnM~jQAzZzrU;(m{fcL;K zNLxDOg9Yu684{tXF$^lHhf)_Jcy$tgh3)M*|Jo=U(m3%y-Vj!UQ;4ff#iUNUsPYQf zyd11|FUV_C7}){bD<9ZK_NP27m`}92_75XmX9GT#$xrOaNL15M2vul0f5(CJZNz3z z>C}_lG`-T&M+159AQMB{$>55Tn{?Z@+h+q^9vA(GF+MW*y-HmXAVx)y&b<2%i9uzj zS8)$*%VG{DPv!zm_=t{CVgWsBUqdG(XK>qhRSoT458ep8V4L<2v%$judp%8oy(kB| zEwZ4hFN$IA=__VCI}{WCd`ktCf$bU;wAw@p57N{#-6g>?Ou1Z~12J&@!!CMC{(C|7 zZUpk)2;_=p;(n0(>;vCE%KdWY%@p75xm3%kvsl`m-m+CRgXiuCuttq* z>A{qH@#mOH(eIZX?Ox=n{_Xw?a{XOosNEu}0iddtC1&#>QPa`-$KO!?iYmtG#K{g& zDg4e!SK{k(G10jgN0?4WjLjAoKAXGC9)pl^9&!C z7j*OD9DU$3>c1b9&~NZZ+WF#~^2IrleT(kn8_aq{HAnJ5wfrLo?u{hpK;| zC$Z>AVt}j#MHyg}_ycw~I<<&bs(J>QL(6Z-2Mah(0SE4HfV;2NGg1YxTeFZ5)m&m3 z{#!gR@KN;dfyM%xhKi`h^F)wtf16wfv_0!^*=nrnYZUWIBHt&R$D;~0!rScUGnXvd zYF58}tI;!X7?BmXtxH#h@N<7ykMC58Je*Q~Zl3{!i3fLe8MuHLC7Uk%_knrncikxc z>h~~Tb_nlPa+%4WkWIXfpB+NDKUzuqQt5)LAN;rLIdxZ?WnA%Tf%$cT>NN3i#;K$hYb8dK(uzrJ)93MtHXkZtoG zsxUW97W4X0u~Aj(borN|LNhk%Bg4^kqf=Y{X8#8U?7W6mQjbJ}BSD$iE;T`~>1ucC znnJ#~nL{zo^QR+^$Y@%GK*^kce-T=z{f_BNq%GQ{E#-u?*Bvuy(~R7&U%(Ot^w_1U zF_4Xi4!p2{od!O`2I!dGu)%q%%cD2w_%i4<9?DgJ)8_y4*+s4vd( zT%7CJU+q20yc&I{27BJ6^xPhSKb*-G+&_|eX3)M=tpwL8b840<1VMES?wE#1TWX3Q zNwtu58cATI3UYHGg7P3^t-H?CUu(7tD7PHl^)OyUv$`C$UX8Os}K#bWH8J%hlwkwlW42n#( zw-7qZHeU0t(LDw+(Nq6}_m=4V-k~y4f6Xe-QjGWFdf-dhx89w-N2ESdtHrS8q+*5S z{V>pUm8R}Qo+6AFl$4avL+c=8sws>fg{2fD)d8&G*5zycA0Pp}S3c$Je{+Zxq^rOv zXELtahSfcYXc3;;x~q~TQ0|8wtAsb~_;x%q3(9gr?7 zh_^1TScaQd$AG$OGOy7U-T0Nmpu)B^%InD7<@SwR5_Yp{1_+cnnD%;+xE*i*lpTAc z@Kk3ayeRfrDQFfm3)Qcxu(&${hwL5JW(y79Dl)qo)bH&;cfi3!ytB{|XcFm}9 zs8V_zSR(T5o^>8x!X`#_qZ;$8Q^e7j1!S`XYxak9WJlXF5|?zm12KMYv82B;@(u*m z(lR5NTkaz_M;f^&Dn!%gEX4r7r|Z*ye$N@DG+(UrsptE%U!lx^9g{F6LhOHT{}HOGz2Dqf-O^Bf6@kNQLg;$6~jjF>yX#!;+EOY_?j(t{K>-mpS8#PR2kG}!HOgZVdn*bs4j;kg&$l<4eim_XAXu?*tlCY}Zd;6OCkRj8>?V%ji4VGdF z{fgJ6&r&2OjCwCI6hivPjC9G!$<3#ana$86`5GD;CcRY&{K6O}WR~kfJIs8&toxFs zmzUQVrf{G~<~)rD<-1?R2d#M_?)n;HcsTKxUbwJC*{IGn-xoJ?BL$Bq~gX(_1T@HQTF0TGajb$QyW%z3XhFR`Mv%9vjuL6OkuyeC=t{9E@QS5 zw~Gv_Dz@B&>^jNdxTxcOgAG)Tj|lhOyL#E&e#ZV8J1W;PgK@o`W~Whff|di*pP{k0 z86x*Gr7UB7aa$gO99A8BW!{)2XAO$PJMCup`&R(v~ok4|efhzWX>YC~+Bn7wk5B zo+4~_r+U^o9vm;ja9;yae;)E_OY)?h&EjoqKR!z-Jr{lMyQ?FjJ={OqI-ly$6tDSQ zf-OvXFif87c7Uzp7V^u&pSC6$Cxq(HZi4Z3f?iJ7@gWvjPr{XV0}7>VKBjpL8;q)o*2qghq{SUz4zfaHV;c z@zT3B9A!wDu5JA~o|JbQsr|xTP6AcT;ruwy(zxLr7xB$S%B6z`gK5a^*I4%2z^~6u889xR5R&xJS^g05ej450@mb8U;)Cjht{p?(b zc&C8c(#=Ez2uQ|;lxaGO!mxnsbxiLysT28d$$Jm60xYcyi3V2&GKAn7^N)ks!5^Wd z9^Pw1Q+C5+8GI_k0uy5v2E{Wx6&#-*wN6SOaKsZ^2iLEbb zMr$9z1bn8y8i;4ig(K(PD;;0~`>H=^DG)cbU-yO*Vz=iCmr5Guo(@W zCc*spb2HWNSAP|sH){9h2Coz>9 zvRMA)Up4#C#}7c(-*CZY`4j(smba*hMluv{w#y?RG4zUPQ>00ty`ybqeY=)MJZjB z;s`a#^Dt)ZEf=?W$I(%weB;NTC)L9-67;%^6oq#;$tSJ*PsZ6OFP&W@Z}GoO<)tt} z@u=C(oixH~Dl_)@q4GyvB+C@0MujEBCgVn%Ox*M|)DR&~?D+G&*e~ygn@v-QER*fR ziSp(5Phv?YOT$;56m_^byJQuH7)`<<%`ayj*KBwW=GQ$`pU2xQA~+aFcqTl&sET8> zq&LtO3t?Y*3Rf%DP8ZBw7DE&=sZl(J!w11b+dz=W6@EwZlD3%lI`H_93A7Sl7olBh zpvvsN_FWim&;z%L$>e$#=KSl+K0Mp0^2_|aa;hwhj^U(>^#3VAg4(YvC8Lz}Cjh7o zKRb-_J#BW_$rH-Iw?-%y)KBiI=DY;tDgbiz7o_uz+uV(0j>+4yZ!1&*CzbxN8XCh4 zwUyJ_R|WqTe`>RP&7J#PKoX&0M@yQ|W3A8nk+9OHH$sAmj|y5bXGb%p!E9$#883ZP zGrUie)mt^k1@G~Z<;%~!XN@(KNu3;cODV%cnMyeOoHb+`E6vDvKj1WZb!nh}`$}2f z_}=t`CvP^)o&z^N@UhY55CbFlAhhyl8;q{pDD^`i28g1RO=By-cI$2>T95iUuf#oMrgjL0yolil&wrlk3 zrr+Bfo_C&?Pr4-UYAj{5@~(VuG~n**x|niuTG)Y%*l8ZymN_3$P2FI(wl0i;BLRuH{ zGrB;i$@{B*Ug}l9u~Dvaa)YFZuLAEfHNnZ5UTCF7f)`t=y!?vhGp2KL25_dI%7P=) zy64!D%+C8f+Q&)8&T))h?XR|l3j>@{XJNBlJFl2YAXO$#jU7Km&+9Q38!s~ZF9w2jUL86BDD$m(qWkI~iVcIL)CW7*##KR-5~j z1`=_W{ZRmrID3bPaFUVhp?%z^?5e7cs8v{^m%UjV7!66-u<-TAdN;lCrJ?5gvyITQ zO7`t??F!h0WrlyNt)4dPxBQ=@K9NnbbW&GvCDF>y=I&@8C0!%ZGvdpGlgQ+CD9$$+{rP0*Ce*+r@vO6;a$`s?LV!BHlL?(;+U?Nnz-#Y{bcrk zj%irbnefVGGSczUBK$-TwFXnGNg5AGtnztq&x>oE6>j8&h2D18`k8U4hNHWtCVBF4 z+6Q$eTR~`~0c5(tflaq|-r9Rsqt3yFc(27hR*(c0+dqyJgF?x*uz2H9VmteWb z2eN8T`^q=JemM89?3=IDm{44Q1FTl8@V}tlxSWrA#E!Bve01JUO%DaSKMZH`f531R z)=jgFBUGB81JRfx&Svozzr|b#z>-TTF^QqZf>Ougd1?%=b^#M zm5;PlMjVg#2lJgUExQc_T-OZ`m^^%*VyQ+=9Rt!O8*aK<{U$Zd9xb1Rz}T?O> z8O4wMkOckWsDvEDsw8itR4z^J=mdcLik&2EG0Ny#YnJ51a7s z_8NeY>OKBVNIgUaL_{9#+d!T4FBsYZY?KkU(m74gEyS)`KVG47sLAGGBFJ|%&Z`W= zc|#_HqZ4#o(-mR1mkGX8La*34d9ZbrjV1u+A}@^$33wI?Dr|b}(73G7Oy_gH?Stt9 zUnst|0Q7scy)k*wod)&qNZ6ajF<(+|63T&)<(K5yled1S?S06f=!Q`ucvz2gzV^@H z3X$YLnw1cR+Ksr?YyrKbn`hYupfUd#dNE1myRIU8qexV@Rj#fc^i+VP^|9@-KagyV zG9Nf~>DKT#Zqk@(5Yzi#=?`^0VZM7BF98hl|bu3S2RHu zZ;lgCJ3j918&metJ)*xTaN1v9f$&}gOX(e_P91N=h)7(tQ9!%Hnn;l6V zUaNCK=X3QX=VsDFHtr~8_R zvqvCZC=W0VgQ>g~;)ADOV`aF3qT@51Xa4JHdDB{J*x=4RWC_Gf*NPx@bj256;28_r z>~{Q9&C-Itk!M-xZ`mv(d+urW&28d+LOj2bJqm_KRL6V-C(`R)iyO@uwd<(se&F-@ zBLJa=(>4g0t3-VBB4i95wo8u|6?El>3!QBXR*5(ec|LsXc*}8u!?|W+sW-R;#AuIPR>=l6y#8fU zUz-B27wk5P0|H{+%jQses0^S43_nan-v=>k-)uKcGdt zSC8*A+c=ykGmc*q(Q%04O<;iWDCLDF^MK%MxeKsD$JrCw-mtjL%SsN-Cn+;|%4}3O z5_NPzIx_8{Py&Vf-&&O8vTi$Q%j3sf=cUj+Fc zb-8^1Vi#iMmj}PrU(6b}T2V#v(y!;+of2~Et%kO1Q}um$iyt^5`xQbc?50CH-xy`8 zQiMCpgQ{wd|D;(T^^%Sh>#CjK-Vc37hqs!`M0%ntaec0JuOQs7hxK|Rdvyj$-ra~- zp#}F8Cs9@sJ0=PY3V(6JP?(*S3#wiGO+z+b|4(j16#9xc*kHaMD|uQYxii-$EA<<0*nL|U*@#dMD|%*omFH^uO&XdA zXYYejt}Nk9c+AEXU2~wFu}?GoE99q@Sik^>h8oZYWyjkvG1Wa7BCmfJ=K1}^dGkK} zw4liL85NkvvOk5xXS*@Lv9EL*T+_bea@e}Brc#ZF>tCSqdJgnDUMtqy@x#^m6rw-f z)eZ3PFrhyr!gse(b|?B(?RM%OB*^{J`5hb zRoasObZu4JWXj-cO7D(2z^LG)@~G!gu5U*sM(ns#0LUYUUh_WgoG&R8)zOfe;`*e9_KQYzeo^*rCd*2I`9zU5^J0=m-R|JV8_eYQj$kACyX4>k7iVYN#D9gJ)gQ^c zJU{9_FJR-F86H@d<)wEsg^XaYuRZGpo8aY6|8YF#-Q(0|fNpFkkrRhb!srid z!AAQ0#;l;OP)w(gf6Pd3$rUI%nN!P@(}8#u^=Ly!e{X^AM5Fk51!+T}XE37)o_H{o z_B3aYyi0V@j7YEEXIGxKTiEa@erQNz1F&ryR~a51Qs=*I^i)o-_a?BA&>39)VV&$= zXR1T}R6@V-losN?|4SsSIsHe5RF}bK69B--)@A(e*~(}<+=N_a@(cu2C#8%2??Z3< zv-gtek~I9Qhz?`;Q1EWt(`0c|%*8BL>S&bH?x#1*^E~;{z2WZMOt0tL4I3FxFYSA+ zv0m;0C&4U=;nqm7awUk-W>M5l^~*v-E&n(ubX^>OlOSSN$S^p1~T(64#;MLeIeAfCtDpt86%B; z`T)u6dzou5ZLA7Zc;vmJzuF5RIU|}3?z2{kbe(%+#2R!0(mt0Xz=_$y4!NJR_cH$PI{nn1c20vQ-4i^evF9G4Y9zlI0kO6B9n}pSr z^T%H?eG4ce0NE{_}MY0;VVzOhcjI$!(~?UKBg~*kEhMNST&)B6^AHM&O3Sv_hRx zWA4YBNebwKWi_Buz7Y6tyoBQhkzVR-IV=WRoq3`mINw_xvHTW7?RsjXq6JtNgM4!) zY&R>B#4;ujp_j?FTU8H&Mv51YPOr3xh zCupPWP*r%H71D?==xge|pNJU-4oq*mf*Zu?mwb|e$2IsvnuwZLKP$_QjD0SZ0#h%T z^8_?j$LzUw!)qz73;Mt*woYk!)@SR+w_F2IhKNJP=2!scv%g1{&ScY1^a57zuZgca z9iiwDQ+R)1BwO>4khg&GJDTNZ@W8An7T+f>aW^=-%_{+Z%S(<%;^IQLW4&1u?jnI( z%81AbAI_zyPhZ~z729zZ1B#_-4#hti13cH2wF1$~bAE1txU52|WM`ZuAf#K)HvfRk zd$dB4$rmsqHBH)b@(Um*A6vO-$XNOOYF}$!e$`A> zc@KCUeD@36ztloj%1Tw-^P8WzAft#F=!wtmW({Rp7g+ul|NOnn zp!9

G^M(X45sh-`zgJoSaG}58JPM4c5R(Bg4cw4G-7Z2mtG)j$o}Q0}?ihYhGx& zT3iNh+I*x8&mtI3?bioS-IUtj+=uH0Si99@s^Do}omTLMPft4@P;GD1S!S@AHsN`~ zX05uI|#Jjqv;xg$j%vHZ(?Hi0(jyF}s`-9bzG0Q5FciXT0$zGnbT_hvh z<7j@)q+e&2U)ViZkO*pM)d$5M8=co3J?P2Tofi@9(*q?5+$Y`%_shnfOBL7=6%sq@ zB$wV1C_aza(xLBle}w~PAnb5=YZ75PtS$Ph zWbb-AI7z5v6;Lr$bWNV>Y5Ib4Q`7)4gw_Ff;v?@J*~^m!D$2@clLvHTl#cL3{%rNH zA^ES%6gHlAovl9*vO9HMG=BM|;`J}6!9#~8gQiE7O0$%N&+0KWUw$Nrb=z&|L;3XK(Pn8&%(A-*%%)QW|v45vWLX{M5-ZqUX@+|1=sT zD|~*{c4^E7(|SVAUj53ylH?`-{*k374>)j&@u#LT4Opk|_t9GJP{3=K7A9T*q%A8HMYcegmYcg{bsSnB$8M>x;E@JA8Xiaa>IOzh~xM*JAN>pQQnXQ$m zuoMy-wJ}{i*nbuFFyYF#^;%p?k(*s}b4s?7&7TqYuV5TR8U!uBUyXRI#TK3&nWPuc z)Ql2qtqDAyu_e}3)G0hzg&XKpIZgev`f053vn~#7G1@B9OMKjPqm#HM>sdQ-&C|)W zlFd7tJyP|T#{L9@zh};%aVh zTB~*8X^Av&D}BBm*cjU0b+eDyGjm2b(JfW@-r!TY7kmQT3DvVW*+c=}D*5WIDOq7# zB)ezGLn@;2Tzaw0dcCC)*4i?&o&u}VCaxhJ?V!HZ7=h;cL!(Ck$I_1j zx?uad@5kGfZW|dWVN}N=xj_&^W7{ENk5OdreIPV!^bZOxU??z_eIMy2G-@O(Maj?+ zuCFx(E*$YBtq5W21h@MEv$5bbzkw6k)5)sRUz7d;-&>siN2mfIf_bvU6bvKPkLLkF zPIR|{eKbY+zH?y>1Dt`U+rX(;^SbtGui#kAMC}ccYxB;_**V5+Hx;i0TZ8iNn5U1! zYeunhUP{UQUmsiWZ#2IlarD&UMSSh7ydz#@X_Ekw#9%u1w!35uUv3m5<*G19R%MWY z5W~c?baeqh+Rqufg_0?H2``Y0zc^QLsx1Cz1pW_g6!?^F1~fogO5Pu`qSGz3I_7vk z!z=s#wNbpku?N2upXtqY1114rza8HQ)NLbqXOb>yj)*!v^-vK_B-v4H3y9+cG<55v zEi@PY^qKi1B3z+*J)QTZzxL&KVxOz+)5^W|lJlk<@(Yoj2{)awHi?CsaH`T1D zfQX(Z{#=M@jGlasLnYE|EmTHHT|L~qW>sJ&Dt7KPh-Bv=nS81ISNu1XqyeD!z-Yp* zYs)6ZP0L3Qq&PoE{Ab$z?_XdhNyG($lQ=3|<_p}~nY$n=sDcC}qUPlx8ZQ~mlNjLh z94ZlJO->sx5E)g`Ck^H2qlQo`Ej|YZC(mD5%VkbSh@m1Em3;!|4dTj!a1c~w&Wh&m zKE$rnQX8mO@mjqd`{V=mTluHTi-{@Kf>_KI@|T$k2VyiWqmD#3KJVkRm*`g~&_~s7 zeG1>7tX-U2h2h4w1IHT;Y4rh9jIuuWsY}`;omYteQEK~MGH8d>u?P9F=>rf>ztfP< zkwyw3iEF&r@`0n6#K%iBgI9fP0IIed)pMV$DzA;W+r|Stv}Vj#+$b@tkWWrZ0X)lh z>;J$m|4pHvzJJu{?ZyES(M=RE;>pg=zLHolVJjvkrlGT~|7^^5zex#0;t3YnJ&IaP* z2JvcugJ8aA65QN?{58#1%oWwoE&`c41@&FH0cdRh(rpquQasAJ z@@MAy@7VtSF>!5YU6uctHy~=d)0fDv@~S@{&cnrp)C00mUUldrxs_4+4dT{nkb7)* zar|ocCx`QrBnA&V{zmVrO5zfQhJ%oZw&gM}OvaG^TQ?G-arH&gKbX1y{`LLcpb!d% zasDw^wwh<;$t6T-g5QZn&wsQKdjeAnwz1MrZoqdQX+SkN^)1TV+72=Nb@$Uk2Ae*y z4_oqG#}ZA~K5>~SRCHi~88YjEkThPC!T(*q|Ay}#>brNllknnhg(M{g#JXIC_a>9T zR=UN0oVW7ws zU>IjuSNL?+^XM`!XqBG!#^tSYL+>z7JziqRH=nyN{dZ{pZ7UHBd*tq3_0aZ(jFrgs z=NAWhd&qPU^;4RFyPCxXk+bHyh2pU|JE+!2{av#(3AKR}e)C`-B*0dJ|H zFe(l)l>>`nzJ zG+(fSbmxgp@PiM`He-kRzx#P$SXEO;swv+-0Wy+P$0&kTNL1#%VTB_>nie#r-rF30 zXbL2t{}Tj-npl7Q#ih)q> zx;&}r3q1PeaKS@<&LJy6EGjP%VifP$f4i}dQBh%#`n~8bZ&KPNx1~(=fbN4( z1r_%*@jC-1NIk(sK!QG|=)hWZxGex6-|T&bCTi?@>i2mil(|&CLF@Ja@fTMl2pSA3 zT+;zWjRkpt{bL|@vcsoG7*SIg)IY%K7&DpTm3H5yN`I&X9g}!^UC5ycf$h+o@;Ln7 z)n>ki%M5D*H|(bLZKi&o+#U|d_Dg3LL3uSd&dBN--HB!pdWI{KIUXMte6_&7UTy9m zhAz24ZLii0H}+a&qC09E%z|8f2z8q{87h2%<5?%h|)1nE=< zoyf*7R{sqEL2{%cJ$>8rXSGBFnP$OLE#EAHgcKwdF7c^wKrhkzy~u1 zPNNdx%$j;y?6lWv1iBp$t+`w5zV)YIi;S$j8-Fmzm#`1$E1a*oV z#p?q}zH2xj>e%EhI>N-2kT~XqH+w@!Ta;PdAN|$rvbTWb&DYk$Pm*HFe1l6#jl7I* z7&+xw0lLwujvXRKA1VZQDd2*)EiGPwdNCk&CfC!~@1`!~j-StkEp_OkKDcjG{$)$_ zEv*`D0*|kWqGuEHeM+{pn6xrc1rh} z1gS~^XeeOLOck(X;U zXxv;wrFO%iR&nJ=x@8gp&JgG+E0W72;?PI`39>OsimsCjeuQ05&QA@s1Se<9!z;QSan{0=FJ`U)oTh`S~~7J4d=&TDGV9uTLlL zm6)k^lC-DQ2K2d!pv+Sn78YExRW}l~g^TO^1oU2aw*5%*Ox#jQ6evHs36U~p6SwbW z%NSge2ddMg3w6VGb#JP^Fr=?5IISO0r#+Jp-v-`VEoG2eDSaL4BvJF44d39uO{-RgbRF)1Q+lEn(Wt&^aho-89PU> z3#-mV&t`ER=fqYsW%7^rmAfA8^R8AE8Iquq{L>TCB~~^HhecOB-bq)h^n0lB4l^Ga zLG}HBhf4q7z6z?0dnC1wF*@_m1)j22yJQ{Q=0=` z8=r$d*t{FM@wMrr$gDr?pleSk2{xBEJ@>i8ZoyDUON(b<5fyOCm@GK7U{#w)d?k;9}HB_1=BO+qO750XTBBmaDnpw8ihJP3=v8iq<=z zPbA*9ag@f%ucILBOKPs4%y!pj9Dz~{pkReZd<$~w=o8ZK=@m-nA=A#%ZwM7x{ z>h!8u-W=ck8Bs6OwaecvEW|BR57sPv-L~1(B=MdT01%S!3fl2%HC!ukQgZtMnz2RrsG0yvrHXsm=3~+V_;uma5fg&K@p1rT^uU^G9V7EiF{C!r>&eYx)dg1JAYq#nNiU3o%KPWCQ%_OGme|n9FK~iqWAcVPEJ!O$Pz;RWokcT*FSZUS;rv~ z*GDPN8=;N^`4*<-4$B)3T_js;`+jI8MU~ZsQ8+w2OB|6Qy^%uNBa_w&|5R}pTGMSne;!gTe~!u%P82vuv1`HWuOK(k8F zsgirDN~ei)+KK&iff|NoU1Wde1aPkFK`BfhzLl0yOck4%_`xjGaR0#X#O(MkgWJG5 zmlAS-X|uMD+WR=%a_eOF%%kc}wLj&_zIrA$K2}C>JMztu%&C?%-b`-fEWbY4cm>mM zeC84EeY=u1K$@Zst>HEIi#15i2Q^qr*7PJJK%O(jYkQC_z5Ft!+VUo)&jsIqmp7mw z0w_qlv*s?BL|;V9^VB^DL;k?>jpd%!(g)^;a8r(4mO-G1b~a1Se3#u9k=-FJWj13c z@}Vrd16~vO6LrHnP1_pXv-Gm3POLl!EnY(LG|=^uIA zDR*&ho~^m$PMA9;$L6w}KD9J{seG?3wz++?)ZGu3|DqA#W-*6_KsvGdKi%Pxt zwrl-a94cG$ve;2nysa@f80CM&W|K^Rn4ix;I^&GIpf2<2Y~Vm7Ys_C^+F3UEIaoTS zaQNv#R}FL8a(-t%L>a5J{)Vi~WA-SlkE?bO&7T`$9eU z?QZ^hD0()Y7v7o`aew!5Aw`>3OY=$0_n^LPdf!Up+6fPk%};Q2+hZ zZaK?Ejq=@{Bm`D!Z^>m_5S?cdY5*^2S&w8>Pi`OwhirSz-G^|V9w1VSOLa2OJ(p5c zNqoO|(FXcOuCArr(XIP39Y{VH<1IFa9&3VQ%MC7tytS7Ta+`d{do^_UpiVs1+Q?&n zX6z2E5Ae-202_;~3EPO}S(UztFcjysz5;)I#B?NWTW*D4rcI~TmLmkY%`YRv$KbNT znvGrPszn~Gycq2&v-Y>9A=}AShl@JazTzkg-}bubRy=;Y;j7n#%NTdpl+RENt+AJ; zLi9-|C;Z-OyL0r<^H2a1d$99i-`4-k5hd%5Xc}~T(yGVGht}Z)aS0}wR?egPLKq5Z z8!C483tq!hUC|zfg`Xiy2>P97!26t1@~{GLi(l#_Kb`SgCk#Y+2dy@H?vT7}j%7%u z5XUYn7S09a0-XzT9kSKor&M;mH5tEBIpF*x0x$c1Aqnk_I0eY-z0mt>9 zb-r6O70L!2+c#r%hJJ>5Q2U>#W{BL0GPs`~JO);PI;qUe#J;M$uJfyplIKG~<;P1f zmKZM3#-1OTMf<(RtJSc#N7P`tl^?h%J^BD1>L`-jki{5rxvI&mBq>7w@q?x=y(sIN z4pM^wqhPWxt46*F(a6}M(}NFy^DTRg|Iu5uB`MR!!o*S$V;BAF%$WA@Hv&fT3g8Cv zz5QjlLsxHKF=eIFt9kxppP`5mac3a$pA^@=JLyn-?tY~v;yzFlx>i?)fJa)iai>ArX9`bh1F#n2~wY4OK-t_|z}nUf0+B71H23KUuxiGa}sPt0^YnQtqTWaWl+?#7u-K zOD_P`f!MDs9xZsVspdZZOxP;IR}#Pfs2kg{(ub(Kf4$A2cH0?O)+)3WInPsejwy_{ z(-7Rs>(~LRADcd2w#tyLvFv!a3%fC104ih`p{n@>|MLPbJ_=>IQehxx{nOGniK*&7 zO~FR;iF8j`1MKqAQt`_j5+(lJeOq$Vpeg&tsxd)m5y9Re6OT+6{>+KdX$p;`2n0*a^SPpwQ<)gZ$4l}Y!=^lD zhdW6>Oz(Ul<)C|P5%-L4=<^5Vd@aG7bdN)>M||x4cy%z|i!7E~lTIUU2ZpLNtam$< z!p*vbPWz~3V!dlEGo{iSQ9dXatkeeZXrIoYIo4q8b4-%asKmD2)aK{2AJ?Yrw*0wZ z{#c5mY6XThDR?MFtzRDpz-HHpq=-oTEVOyz+z7!n(;4JYUc(Y)Ih?w8NKwi)7uQuO zR=r-i)Q%ep>5iQWqVrQjo7y@UVNZ|x3H|$nSP}KcT_hZa@-tLG@p&GE_Z&*?dsRow zvT4~gTaOlO`yC^2w+~b696AckQN^!G0jmjO;E$GqyPpXjMHUiedGTTAGx;m6Fox^( z*N-qa!8pw0;CBX!xEHag=FN&;U7bV)P?~=>Y2a3W;fnti;@q8+J?(|;dBL;AaT(a| ztzvYdIF1RdYi;00aw!yA2HM_WDW8=)a zDec{?r$a-NqJrJiXhFg^{?yL_&&v3Lrr#6-DOa4%AE-5` zgdHEl1sU7|g(8o%45_{ zw)SF+e|?rU@PD4nM?9`D)4W?O$YPxYb45(}ma7WtT=5~S!?z8`XJf4Ao8qNzXct#_ z5LoS{g0+yYTa1^xQr4whQ54(Awj$jT%7CIuo9xo3fENe7B0tolse;+ zS>gm09hp95c~Dx)_LM#Hn&a>(6UO}{n2yzY9LSNGD4%Escj_8D2a!9?#3T~Bg+OCI z&x_#@r}=W!Y_rvX5@;PCpQDm$Hzlf<-nt9oyN% z&^J=;O5pa$Lk}r6N~^l&E$l7q=8!H1OKDa4K+O*0{p$Z??>)ns+M2N8O-H(gCQ@vm zAVsOtt*A(o-a!PUgGh$}BA^1IBE75h5^AU^fP&Jc1qcv|)DQwf2%UFx&hs37j(*qm z{`#)>hkv-xklAamH8b};vu4ez6<8174}ZiV;b3S4$Xk5Ag{IKW3~!8npxvcMbk*gO zS{|0sClH%iX|*#Ld|b5wb{S@meMFDWGL5*92FOEUZ>6f*@v;J+PyF97y>d`wYYwu!_1Iu z`4t)b5`u{keZ?~AYUO@8e6@2 zT+%t@f>Mu}0D};#XFBAO9LY~-kQcY#?t>XoTvsFsmc{v$op0YEqRmGMuzi+O3~I*1 z!)=P1OjV45wsbhM6tFD;^C*oe-Y>x(md{v8(w6z07^u;~2H-rD_Pzx=*EuSE`}(kr zdga}+$(xBhz3-&B>==@n0YM7QTwIY3o({VzE4{1MO?ct5=cV7(dq?>}!C3`|b)1_9 z$%Y2+U{vKe;br%NE@+BXo4=7cvax{|)bSWno!Qlp#|wlwBLgm@X=fd#8^RdRB;L4w zj>oCH-42_4p?id+fiLR~Z)UcUx042{_#eE*yX439{-u_G{m@e&1NF|qY!G?Aw@PsI z$Q|XkozRcQ+T`y(K6bvwt9J~>zWd&6LU$u#+V8u)9OFi8Q64%y$=BI*WWL>-)%@O7 zOltX#P>&@`?2gJKBj5y&AIwSrrWJ?(o+ z;zOF?p8ArCaO}ubY$ z@8?1)naf(j3_-+^^qA~^dP6d&!S}L;I6WLI$>W=!8i7p2qIcb%j-#rC2(2m)URzo> zru>2uT5L!XeipTUZ`qb3DU4U~sl&{1pn&8OfDyVp)YxWi8<+whhq~-FZPudp6IA%t)r7RaoYIB!%XgqM_(sD6*JtFIcMTVG5&y~ z2+c^KXS5g|9r&Q~WwD>N5j`wSg1Trmf4fC|C z$*xL%uxjt{w|D{G%Ho+#ts_+~eJCe0GbP#}RRKa19r0cNxfw)9MI~2&X{VSxv5ipg zRSy;qU*5CJjQ(PAcVdBKTX(<2c0wCwLx_pVu_-D|76t}TRtuR44)hdf7^{0nnWS<& zuVEcbF4KozQoODer9r%~+EB@SM-uflYrSB zzUdKe!wBj%B0g5X-kcK2Ctnk@?63~LJcL`eM(ukIH0MN`xdG&K4T3-gzeGM>fqRWB z&C7-&-f$0`5MD6ae&uXUgQ8<+Z7<+?WGT!EY%^c4=$Q8uD{A%>6YlSZH0~+phZ3!b z^&g<`$M(N(e`Lx{D9T%(=Y;83KT)YXTs6jte$b&Oat5O)A9SSN>jX+kF!S#%QLf=_0Ol{fLsAysA8KBcM($d@L4Y0u} zmoQ`HsoC+)$c@6HUsdsYi4A96|32n%?T6%Kc50NR-Lpu>dudPMl}$i(3A0aHpdIY1 z@^ir}ZymQZv!~7rd|SiEe1plW{1>NKa(BpC&jJwA`>qox9Kkqhk2qyL3MG>VFEl#CP7qt^)jbI3-&)p_H&P?)c&5I26y*k_Tf{v=3 z3UyW?r$oARVcP~*nj26sp8^~8RVB^Qz6rh#FfGQCKzvtR$vm&;3HYlKf>(mv z7kr9qF~?c%60gS(UpcZ9PWc7!evLor?^C6?bZ?_J2hslY$*16eI_n)Rk$K#PLlKJ( zZ&|&I->blfetKKSi;WN=jKN*TiZUM>OKj8q8l2)740jP_3USte$$&x-ag1bcJbbEX zKG5tjc6aw@N}tpOGj^G7-R>(i?4=^eB3`h7DmYaiulN-6W$d)a z;&_z9kd^N9<4T_=TN#4-w+(o2<<2+pn)iI}Fxa!o;~rF}sG1+P%eWda_#w^#DD)sI zen9(@c9|WYr`1p?wttn@StBKc{nys{O6(7@06FF^`z|?alC6+KWUfQWGZi3DNlCb; ze}_J(vLWOs|L~(jUo#98bBS_v$bo`}o?|ksIp-tqRp+AS2lc{RJZ^2T&)F{&9^Gvk zB8Y-M&3dl@_a&(TQrE~ss0?`xe?W7(H{;>f@lxvZbbeV|z9n>3E{I(bw3VhgjUKeb z#7HaC0tOgt3xBzMURj&vL)?j{?HzYFGq>_&r7Inmk_a?ey^lG7?c>RI3ig!{*gyd` zs`!Emtc={qoZ^W`&AS}TS~}>-pB&%06Jn9o|8_uD(Uo3_;T&ktPI@-LiGi_x!aHA| z@IYE(|K`cl&gk>U&XHyMAU=dEGH5D1RN64=rC5h$X};_hERJ3G*n#Z4C)et~q8Du> z2}iUR&Rr~w2^fd?B}o+-Z*@$n5H-Ds_D;*$_m0@#2+cMU*eS^Z4SYhHrXn@zYHbO% zYgu+hphkcA=^Ca*c6`lv*SpS7SmRHJf&!ki!i_GC4}?qQdlj#1(4Z#51($$D<^b*M zSPm_@uLBNPISxwo)nZ=xM*o#*bkbvr;CyFjQea@u<6%D6PxE9TroC}O-G!?g38@1q zBjMDq>jM^Lq(7&`<=xz!c+Pw)2D5zPKb(|BnQxzxHmDbBw?P{8gp96MjYZ zf#DLPT?3=3mJ;0~)~Q{@f{)R5WF^dQtU8a8Wf4NwEG`cO`m|Slj9af3O;3c|L>4YJ zY4jVKSVU{h&f(JScfYI;3Mfi`azqR@J7?55l0^)tI@}0-Vn^nByXy<7wU5sw|8{Nj zafb&dlBoOcb(n>Q2pgZ6jN85MU}rY;K0UdU4VJGH=4-P()&zQVrtVlL3;BSk%~FAM zPs~!KpB1k9xnFAO6puu?`8KpJx-VI6!g#Rp%4`|8cD1t%_dp?|ANiKYi&`F|u5hPX z0VraT+*tMU>R`5dV1xYkjWbnk5uHlnJcR|h0S7n$dRG(|)7os;K1{BqMp?HjMj=R2 zv_1{vf;lGwcU41oax$F_;0}QAUXxpXm$YCn4W0;;#s`}CTSGSr2-0TQ-ohFiU1`A7 zVCJlk>8{_i^-S!PnN+pjDq5>|=+2RckYchD2*Gby7FGF#x!S+W2QOeac5}5cc&L$# zr?RlRDA#?3qz5DAIG*KeTpb7~J|aVxA3#rYc1M7GybHO}x`uT7;J4`*XNmIrx@kLz ztqI%HjB5Nkwj2Jjt7-dvA%z9}7DtM09aN|J){H&(aMg1MBX(9`-=1cqcRS6&X^EY|?>~KIF+f)HZzjJwcIrjz|XD2F*1q}4}Z>_b( zL>uX^=8~Og)f<~{B)3S7y*kq3#FFnB$$d=C66%8B$xoA3+5pPC%+w+gOHkkZXvK>| zQ~^ewcebb6c|2d`JXkd+l2$b?PZ*S|#F*~(Zd?Ru6RIFcnN-ji!XyB5vn+oS<>eSX zR_dvldKS4m6PFk6u+hx2F40f#WUqSN#BF7B#i4V1Mh?w|?pmHcxwHC?CxVU&3<=(( zX>*L68<*R9Hgoez24ZXf3EnbK`MR(V&xD0uEsSQdDjpZS`*ozNJzz?pdhF|-NfTgT zeQ9fO`9{{&Zvpq}tlD2gFZduEiB@y#| z77}N7+G?PU1uE_$MHk4&yT^EwsV#eGPSV{95Y;7;BU`CILNbc~Mi|f$t&hBoZ*^F# zU47Z<(M&Je5?mZ-O&`=$cELzRje>5yeqnO%%lGuN0jaL9gs5H$a0f=(RrIsLT1fYd zXC{2!zfx6O6_JHbeb*Pa>6@#YYM^9&BnUW^Y}z=#s^RMn=aB1eZej}Qfee@3)PbQn19RN)RlKOb?X|Gs4X}eONL$BtLSCI z)HE!ur7ZPrEm3KKN{VWnV(N$|8X7&zxO zr3eHRm6={;9xo%d`?#zDor!|D7oZqA|Kho^E-K+I6{v4Tf62-8;q-MJh9dms3*?gm zA3BPrz_$(-IqtG)DTfjE3Y8@SsW7g`re5sVudC|s+y${N?8(^cswmUaNB8e+<9p`Y zBaeTCuqq8Eq*awQTwS%H*}Ac`(o^8uLZ)rNbIK~~t$r6z7}Igv)67xD_qjv`*#JW6(Qgj*p#N+J z%aUFyJu6ct85-h%E_OofTka|G066c)9{!=18V$>mrlPIqeD3vCuAdwQG2f%m3+&dE zD7hWw7>;i=Nz4ZoND@ox9H=ldm^qbnboas++#LL!*M8=;SH1tqov;{4{smLwWMT?Iy#%JX z2ecc2jIqqLzD|)zEWc(i-@^$&2D!Ulhd;R!iL;!e;4jMIn^>MvGu7bVeJ^87k9*F> z_Udk;RPXvZ$Z)80zI2KsNHEe8S0*orqt}fXY2Nne4@FnP<6_LGNtkU5!>$-}545~_ zjzMq8mWOnIfo|^ub+zf!IyX-V15C)Rl%hT7+g-Qe=dlT^dN(cj_X9}I_g^}WT{vC6 zCh%^Vq>eF`WvH!)DlSJn!Xw{}=J=t#ElwkgeD7!^eNXYhu1BuH`zr3j(GQ^Ar;Poa zXH;h{`l&VHvdGf<=y%3eqLZSXI)=fJqOjL}k*v^9V_LAU)^w~!+3xwfVioU5y73&P z{Wsv*F^#DyZI|m*IVuuLgTzP7Xi)HJ-k}Zy*`$=Of``d3G$7by7*lpo)E1AJd zlA+Z(X@fA-Zq`&c4a3wTUlbI6QAJ}aJ1tI7^xd|^&U@at!!;kn+$MmxkSQ@hZ`2?( z91$9v3L&s=%_lTvn=NAy!#awZI3@#`gU^s6kocWmKpI z1=)>ktZO{e+*l zOwc&hY|0WfqEFV>9B$pNkW_(eQ^R9(Lq;q1GhL)Ng9T$0ns#N61H{BUadAjX#a#-H z{4_XqJwr0@xXvowHa8ke31`OnH)Xr`qjG5$lLIn(T}`tO{{xNRwSxee-P*8yw!7v9 zj`7_T)s718V_XVB?%783LLz2mA9psUx{99$H6{ku&hrwm0ZQ1gE9_Wq(~*#c(1LqBp8`(nW%OWg zGrDcALK7B^4%{S8^MYL*fxSaY{;dW7vj>3XauxvySwkP7y5q@0k zmBv^(Gs&ok?QNYtMBDuu^6_-Y-lu*IbHlV6o*W4FSXx1-$MfBFqxGg8s-BmT%A{u_}+CQYippxo5we#gj}t|D`1ds~}i;kffMC z4Zsxa`ug7UJ5H>+4i_CQEZ{i@@%gTWv*!sxg_ix5)ezE0#lKmGzUu+oAylns_*^&* zvYJaz9!URp>*637(&Q(nM9oK1qQIYCG^!x~3BGgAwIK`rQSx3@S!H5ZWr&a-G|kU+ z;f{Cf^rO#|sOiSeh*SS0P56S8Uw|W`i%eDfPkNUU9B%GYa>0GgPXnu?t|3H|DBK-y zy4cBA$Q}DMu6i{|)2fP)-mgFMbO#UpevA)LM+*S_fI3pn;K@I6+RqO<%L4ul^43pd z{ds2omIv0wfp5b897q7?c*)|>KPdXM#8~A6Ek1P^I11!oxi4J#XN~^Ra~9={BeVwr z;u&%akP6m?oc(#y{uz`G`2kUkxc<|t|0LpXvB7uv4&eJWZP1~=ocw?GjeZ^vxD1C5 zkU;bZnHadbqYX#?Lqz{qm|*b1+TS?!XOjNkn{$pEZx|tGIDAiXJ;eB zt*Fu2HF#zD44U{v?T$jta6Gnizpl^k{C%20QD)BwgN_a2&UNEBZ9mS_hHKHs`ny231M>1J_0+TjIs~UZIO;`yYa`bD%a|VP8T5?^ zHKM&kQk1j_w0+(94fkO{#hwy%w#Kj3BALLx;|MX_D9D4&BxSD~^|x6>FOvUilLzL_ zYEV5Vy}I3#WrH8CZ1*J&oJWV81YT|&3Tm5|+Hsoaohk6a*68OjT)%8eX~y;&AsOwI z{+l#-*Quz1Dy%Qm$YxvQ%S+mz(~@A=GooN!(NRxeOZcQ3*G*p?DL=&co0n4FJhU-} zlyvA5;{vY**l z{NRQXxsVs#+xj$DffJ*el&II&YIb*4WPDf2+yI5QytH z#Ppfwcpf6@z>>lFOru0u`S%_GFZ_krva$CVI0$MoS8x5dQ;!Fa8iZ%^RfGF-+4iyhheFy`YL|O{=f8v~ zk8SOhw(pTz%49bB!9tH!G_Nq3>zOOSBHnX5iGl;RDvaD5HNraj&GocmA3M=Jk_}laBrtW&tu$aO!S@ z*S+lK_S{$G7>>G8y;nJ+o~HScAX1_x{`_HloI@4LB0JGWQj z>-WxX0=2U|ehCvz)U*4y-NXKkgoXDHFpx?B5Sisl2dYy<0a4@~ItIAi2hK}t{9a3b zOQm%+gt5|s4-^9b=A6ok2mD1p9{d{N5&8Hd1W>;tcwQN(zhma9e*Ax--GcS#0eg@k zbG?k+u;v7i`+GDqf$4#kGol6-0|iL1fNr&;V;~CFI?oUH?Bxo3&9o9&KW^hyB~DV6U3J#TXcLm0u~ z>cMkt#v`WIru*^cY)M{NzpnOee%Tg0Y^WI&9hd!ryInMX{cDRmp13vQzrV|DgRgW* zW|SU8?fB(zYtxYTNp5{_gN_sz=oHBmk5`UTFOLz`He_fb-75#l_R(9PA^I-lC&T7-SAV!3%hhfaZB2VTiX*m`A; zhPT>p&fF8bKV~OT-YM%)=S07qY2~+CR5iNifpn~H*s@7>f_bvpVM0k*@YjX<_#ubg z1{&TZuQ4BVAJiNx;W)^L+m-4Xi&kC4Mb@l}xD%?kM^zWAo7QdSqNJqVvJJQ_WI?? zwwVRz(GIZcII&c{DU7jQ!Kx)8aM$5|mPNnBlA>+C<#Sc>f!MhDRcVn)x~5tdebtgouttyZGLUAfG)VYNEI@ z-$Jl%zo)$0#Jt+Ew~dc+uTC$eNc)A3D%TwF??o`Ee6(HU{k4Z0wLrv7etxgNDAxA2 z5uKCfEwOZQLEq5AkB--C=lKol`&>@dnKiS;7i}VhkJqYgV@h25gsbZ8g#A`F?QAOh z^;YYmc%v1wixO97jF&c_<1vYf=ylg#x`(33N&D6ArlXS{yhJW9#XY8C2saSdtI#+uAv4ft5qI@WnEXK7+Mh#?Rw#HY@J9zw;G~WTVdIuI z{vlVx34=kz=DKk?T9Kx?oTr+=Q|=ejytMhs@^rf<1~*tm!90jP;XS^0b7Em_Uc7x( zwEi1=qL~8pVopk*BE+okW1+rH@=aLwQ}FSMIM>I$ z&Dl$-~pRnvWwB{Mb@#(NX2e!Ki&6H{yv?vT9WXGXW66o#PP z7s5<(eWP_sdmAyFe&|t7D3(w=mTiie8p%J(<2Uj!HBUP|g5WYrW1HfZWGtdWg+t)0 z-KQc06r?7u=w~;H&i)#!3l<+hxf3l2eNxg27O|TKbFqUelO6<)^0Gl#= zR1#jh$Z3-Qv7zI1nDrWMz*_0^;_wpe>pREJ1?kFx-qG>dcCGmXo`4Oq^75h(W4pA&_N(ML2G>Hu~&7Uegb&*vaD|m63KJ&=yrtpth z^pKr-0n%~And=;jIN}>JSKNE!#4A$I))nf@i831NdU{Y7;@-N`a>iaZQLAV~JNATK z*{tG9Ku*wJv7AcXa3dsuYACg?aBfp!C!4F|u+%yIHZ}lzaf^-XJAokWb#ko%))ykW zpUEs0#=yfNioU)v5$-FC^>SG^`#3>JfF-XsJL*FXdw)&$v7p3~g6@ASEY)?H zt<)xQc;FuPVh8lr@iloGbw;SY8lI*jJYO8*8G^8oRgdzxqE#-K*s<6q2WUNqh-dFY z;*!I?aF2KCkQqbwPM@#v3|6c+-dej#J(V0|?z%O_Y-LeH3ui^1G8=uw;z(^6=MjSojL)|4F+dkHuH?KFd52pr_8jvi1+Y1QL^ zMxty-ipToq%2%X}dy=6;QRU<;WOAy;UEFsBA!e07vV?;_&=`eMYc$y!7@x{Wl+&YP|(_^H!IqAd$Y%Z?cJ4MGk>uf2dP6F5b6C1 zaS{NJt=~H{C%+GDRcG6ncGh~kYf&Xt&ZmiuTXHZd(H&= z_%vyu-K=}_zI5thKw@Fuf}Y@{N^c00*n1Z)-H%2>Y(i)Jw-V3W3=|G6)g#iRMVD6U z?iW4G2PwYyqC%~?lX@jw!`+Ea0*c7Ct=}49#-8t99Re>==qYyN9@!;f(2?*dsj73F zK;YJjA0%eO4J2J1hO^hNxWmS^h4Pt}KE*%wz#L-(3jCi^x2nR#0QI<6%Q#PXSu*Fo z#j&L@vgJ^A(|g|lUkLBS6nIe~&et8BpNgdV37RuQCuoDN{k%2&clz+N#sQD5Jp%IB zUDF<5W5(E7nu3~1aQ$m^-K=^!I!%jU!f4gagy?9tX_R=vprgioKoM^<)WV|?_ojhdXY@g;!C;X*i=WDh_7Q>FLcq^-oB4rFTR z)Pv}1{|z;Y6dm~4#HU|!6Gq^=t8X~;+76`=jd_5aS`=YXZM}wZo8&MAJBt#IozYl_PD}wm|>l# z6UKcr(t8^$QgJH5@N6e+uCiAl9joAW_Gh> zIgQp&Y4#deD%g{=s#fQ+zk}0Q1xY=|FC!a&9-d_9>DpVU0B%R_nl}BKTt9P=?LJIC z{w;NdS&6v`Q8MPB6@C$4!;=P$C(_sHMD=X z*Czba>Kn2Ww#TJelsuJZsrrs(4^&y=^Kw)g9&(t~vMxrux|Wo8Ej%o)-noa&?TcQW z?W#J7N31{^$@+Hg62Cc>%_7`h8G}{9^6T%7xa~lIne#Fp|H^!Gmgb$R88oj;-WoRe z&N3J;@qYfKaC;8uGviXbi;HTCHAJOTnaP%ko+ZCx} zSqt49`p#<4$R#DFp{UrNa5-787#i=zPZ35k!9^_y(SJRj$U-t2~%uNmHuZ1UEr;S`IR`pvjxj~i&!jv-r5 zi7&w`vT2a~c~4!PaI{N7iy^dKN+4zMWSXSoXTIL=pPNQk{b_?@u547;3M7ZEZ}DT8 zmD;6w19nQ2O{<(u%fWL*b@Sk{lJJoBv(eYOh?xy#)@=s~mU3Ymo?p_1I+_P|-pB&l zIipbzU=SYA>BBzQ(3uw1HJ-ULb$7~iUldXd?IzX3pf&r!G^6sd_Y#Pc4Enx&m(LlN zsVoSUn|mlkvI`rX_^WhU*_qw=P9wBxz({gx-fPUaDc0?omxaKX4@trOK>@2ZZxZit zI|I`0SzcN5@fCX)1QBKzcrV;rX~_3`vk=WuUdURh-Pk*8d0P-KB7JqYrCi3OvzzQ} z2QA!+)2Drfc`;kL8$Omtzbt!WoT@G|j|E2O=@!Ic?p~Q#e*M0EoGbiO-JuR0b*r9l zwv*OhWE*7>aVorAB=xwg;&^PJA|a{6ZY1uKy=NNNN=5sQkBN;Ev~yuU{837(Z%tARrU*Fvnc`D^N+_~n2}bR z@BSJ+hJtkvFGc7NvN&m$K;bp5Iei1;z+GZT#rc>K!38S+yUCtzH9&_>(FnhqXE_<> zl(=*0?7w z^ujtyvjdTeoU1!A4>k%de8CHLB$FM>N`1hDOUGN=oGo1^F@r97r2zW@v&NM>Z31tm zxh4FN0VJs?E@>(E*-pvcv}7KdXb5I<4H%I6VuVP_k!|vD8vQn#-Sw==xI-fj)lIa= zEPadwjL7EFJT(zrirek&5Tb_@TNTYx9cIxPn&kp|Y@ErlW#0bUC?#RiIiY_0y@dj3 z$2De+&j#xsr=kihioU+maDMRu_ zugH!Bc15iyGjpi!YA?A3u}>#pq-4~O#BD=>>%GmTjkojtTyofEu4LlN5NDT1akPf_ zxk^3f=GL}!`O9`?^N+8@J4TGiQ$?9$(qIc61$rZZ0cJ#EawgIYkreNEkn7`g>y64b zgZpwu90Zo`?WOojPc|c2x_7II_t&$|+_9wzYad^1&&+65 zC6Y-qc(&=JS@nHR-YK4Hf$X}7RgJMReq&?0#}2g+sP!ONFL8SzlVkM=8=vBBYLZ$- z;qpQweQFM`;Pi5-`g}VY)F=(L6bl%}8AFZkXfa;Oh!+&WjMOo)o@c2V@;CFvoEeR2yeW()-$8a+ zi59Bmfj<6wpV&K-ty)CC3hG=rFSCR+XSn~ccn&nn#Mo!jy0fu1eZ zncQ>5XM(+6i|RD!cLP4PF8xAPkliht5Ju^9s}8yx!NpTx$$`Xha-JUCHyCYJ;a&RG z;)MsU@4Tb*g&%cp|FObgI{t%LgN1yY&eQ6V%)is(e|tVnUl2t;zXGb)NJspBGT)y9 zmp^j;ujc2~J`Diu?_bzNcZGL&-E*B zvuSf_rH*CMo_j`j?#a1leA73SwT@l+V706HI{R3|t%oPq)?h>5lHJ2=UFD(JyD06ax2lUU9qZ zM9ww`tPanjMKF#d3Bx%^S{6R#Ab^aV@~2;N(@@u<)pB+1l~wn^#5c2V{o|>2cl64?GxQq_0rE|Fno;qV& z0JE{bK5?!RjNG!00;JkQHLw0iIG6`vIQ?w96TNm$7elXYCtdk$MdQF%3h_fQqwSv9hOuqvv-q@CS4w|;`= zH|y~BhDG0JOUuewy>r$q7XWqR=Roxt`1JJo-lmVUW`#-}pC_6cOEN>6#)B!YsqRCF zyL!Koa_nrkV&Ij8-T^k7_LP_%YQGk~W=VbXvxO4&-dfT9)?gX$+Z(`$^{N3(&fMGQ zj`z|hef!YnacNJsOhVZ%(_63t=zkTGujB#wMTVCl$IJP=iMo0W1;rBfU!2R1b+G|C z)#T$@gP(mL;dVY_`}NFDMsf@r)j6Vq;<}N6JH4W7I9p0rjSH#QewF!{itT~{%Zxw+ zVP_L>Iaa?0*X_0GWa>gn)abb;-Xy0F>V@$EX0-wLUwcKn?<@?t#m4lSOf&&Gw>o60h?F>gvH5cl>xExG{vZFr?un%gdC9Pe>hq|~8hwJK} zI84pIy4ws4Uj1cc$`(F{pPdfIyzvP(_qH~2l6|&uzuMy_)M#T091~O-FwxX*kKW@h zA6UrrSmv8>xq=P7f9Myp+Tv%qHa_G&6LzReUcXL@^ClViZGsLkQUx2u6_m3hKYc|y z6xLpKT62NA%v}8+7x1@=QPF?YLUkd;YNY6@8AP9g#kq`E!H2ha@66w}ym{%$`tgFI zV|vFW8&i-}0n9JX{^CgV|f?y1b9&xBMz!ids%vE+LRJ?J_V?bXUv7h zE6DHVb&rklG#A(1Rn~o3d><%TrG|lOr1rOct zkdHq}nn3cVY6|)Emg4xi-vwUL$Taxn`()%DM<2SR^YZZQKfs3>J4$5xNH2X#1;>#D zRI^9raK=9%Tb`L35Z}Eft~?s@ZxvL|a1EAW{1_6gpykIzw%lm0f`sg{jn%v*(FVm| za`md}A|HPzch#%QR_QlmAESMHmUM|+W_O(u1-JX8R-Ju;JM)mP8~tyF=@DG^%?zw! z7CH=|lV{3I&#S5!z$*2Q{~}hopQ`nZA6Ud3#}A0)w!~(gKBg1!>BukcK}RR!LQOm% z;{;YtKan*ul)ZYTU;o0d;%@v$9QA>?_kYA4%+Q~?`=cm-8`&SL_<{9*tm2PV{IQCE z)15z7@y9CuSj8W!_(Qe-Cl*!y6Ic9+$^HbO|H^0lv5G&Lia%+Yf2Y6xSj8W!_+u4+ ztl}W6{U_n}C*k&Izv4f>;14kV0mh$!akyzJoeq!3TTU?!9HOA9IJS1|H~X)A-SWXO zAN+*UzMmj?h3HeYmg3%eF4Ckr`S>yL&`v~iZ=@PB+_h5F4;O8dpkCYR~jc$ zzvFzjbmf=ram^3PQoGmu!`!R}=)j|j7rwha0c57x!3}nXbZ~<`;gUy~7K#c&^Me21 zsVEk3KU!+b>!8LV^=pCDY<563*!k-dSa*_nm`Lo|IX5n;XMDM^zVR7itcUoofbC#I zIIaez8j}-hn;w{_=gfI?znKQyfbIahNy#2tC$(v3hd=Lv8wi=xnhc^dEdGt+K(HCz zw}vtRb0gHUBG&%jay z(xgyjJmS;$*5%16e>fE?FAR{u3euT$MN__vJ{&R*o;wOVSrii5Km`%~%{0uhJj)~$ z4!JjiD~fAykvGbIjU4Kw3(^Mr@(!H3v&=b53E7+eQpw&FJMJbAw$%FfR0Q9k`^b(c zg7wf@E@uQs$U~onkdNz_0w&jS#&;7h(!Nx>k*Mgdm!Oa%Tv1geIzt!!Yk30gg@E9= zxVUavZwn5^$G7lR=r)cW8#++VRUoC3HvQkv{A)M%=0WGKSn}~!2|L!4zbr4GGT%|K zN7xba@xmJ$XMXc>#wBuaW4+)Qpr3uafcDq-A|p=(3z1@309)Zkf!}=`d-$LSSr$-z zNzLfS4|x8O@A^y$F6mQ1#^JEyZ(f-tHxiV;D@cWkwd)c5P31?BGC$Z-4eUc_7_of& z7tIIjORPcp^ZMt3;=3_=hkscYaLAX)$Xo?a0-Z)rHGcQ8;OT>wZFk6At&=KV{22BR zgMW1hH0r(rhE4Q zlSKZaQ@>l|2jCL@QGq`y@W%`M@dAH<;QxOh$gm}+XS*;r^t|)bUkDn(GKYp@PrYOd zyai$}4f*&a=AFO~yig88-D5W}nZvw3L?0f%6`u)!uyaA5-0pK-bzxPcWeHe!26DUU z{3f6OsmZ&LsBE>2sZJeL15$4P1=hix@mr_Q{{^yfR>3lK-Ww&aEsJ!~j8NV>5AUu40-Y6_L%TpraiasuZfHv8 znlB27l(7mX{{w5vA<7Jp^gy3SAm_Z zyyc|3=s*|GMaPF6agl6J-16rtD%PNcsxp7NimEP+o9mL$| zI&Owt!rigj;IbMo*xPAaZo=+lDE3rgQIO2Do4wGpoUO5YHZJB79)A^D*6UHe*|#+8 zM(|Zs3DeTQQF42Jg^)wqxx2A!Ov>Bsy3;~Ce*c;Und|U5kZXn@e=wV4g3FC<+Kuj_ zhkG^N*qf4B-Hso@0`x$LckhjfR%2-H zs2nwt!YGE9pEe-*KAsb%d>!b zKNadmg`)KjZu0riH3uTs`)QF5jzc3HduE1Qn|@~a zJ>lESn7~)xs=_8j52(?@eAG_OmuKT=XkWJFkmN5d@~V)>^HG8|#pdOJjK{L{KLjxN zD&=GfGFr_$TMxEe^$MD?e0BBYa`iw+1XmoY}%O2aFq~C!R z=$P@*2T!4}>5z%Z2kPTQIW-!skGBq{5$r}1OMnR8`Y*%NvGEu+T9k-l)^W$xZfht_1`#9n3C({ zt2SA^SL%HtxEsBgwtVNX$iPhPD+g>#1E{~=G5F<&UL^^<;@y?A!ArJpV&sRXm(<J8T&1bfk#Qhk!}Gy9}Z2tDpxeC!=erg&+M2k89k)|<0;f5!B_2vMx=`1;I)$e z7dffqeeeGL5YID!nfi82%RfPv!5&o^JCbv^ZYMClBlikeLM$!%w2cPkw&vo$g3+zo zZJz`0w7vLufTw!qRTTN&awl&doTd1)7V3bd9|c6Uj(T4Du?jPX-EVq9josorO`v9kp!$9ecfBkJ{+9VFYq zv-nCPsfM#*0#{sUt5Q9+Im9fKEk#4X`fc-iz?;(x_;mOm2YwK+BtGrBn*k+r^*aJo z36L$Tx4`Q>RmoiWaep!RxGZIcps7dO(k^tuw}Fu!rNlSq_#3~x2^f%y`)&?q5)6R) zw_Hh>ALkP0)Rlpe)OH82z;y6Vu&waNl*@kh&&bEo&c^rL!6;fIcysj)@3+dza4J0g zo6DoK0!QmwE|2xr_I>Z&+wJ*UA-sFF4HefNsJwqqPl7(kMGjA@Jd7HWU|F%GLbXAh z!KB0ay65440~Gka-ojv1VNQ?z{-$3GsDEJA32LD-D=`0Gu*j32zx8Qzy^5j3yZV?@_uyS`~DQMpf0ho0HRjQ(;3xc)F`*d1}XI3 zdpqmhad*j9il?FgGbV&{^sOM2g9%?4eAT9les!kZ;l;3#^9A<2fEgNg`9tq1;`~4FX(l5B)vsSH#n}NFAz>{3G!l%~5#) zTM<7XMhgsw-hFE`cE*yAZ&vQ}+dHU|j~|UA0N%H7B_;h^P_WxXxsQRzM?uTM@k~o^ z+;X?9g{Jq;CxIpx!ltSB!^Yj|-BSvjpc%29?p74o3?414ARnUEBZ~sZF2!$@NbvDbnWMxb{EIVooU+nBAv5d;3sFSPjBhd%d2^@&7 zbK!pZPxPq+s*6btw4#f3ApkgGe&j7e?4i#IGI{^G+!9i<5{u`cYaI`l;@aZ-i4-gZ z+A=Hm8k`?%mIS!~XZ%^0wn@WD)k$hb-iiw^jB+E3DaIj{>?q+jU@fzSzc0;6`I6Ej z#E7H9{tzsUND3#aJaUy;4RY!4 zOcsX<`>#*Fmov3GI7(p6W)L^wGNY+OdjaS~1cxe7p>6`ABZ73+#zv1#A&bI8a6~l4*x5wo?GTUev9T{i+ zFK`p(oYo_kv)W!7&Yh4upcyxVtuNxQc@ahK%RYMvY&1V$8V^4CvN)>2c0H%g)@dDb zI!IgVbWrkW*+}#cePgCFDecN@M!RMAouOYa`#AZAsBXi7r`A@hm1*?S{vRSW9XDXHA4o{%)q=M1= zOZ7FD@!GxYhU?R5*0oZIWv8X~noz}_jLf$6Pp;(SOGxL_K~caG!b9etbc*KXU~6tb z^q~v$s%_W&SZN@#`_hM1=!93`Bf`rHwZ!8~qf-IIh?cZRMh2VQ;NchKfWDa!*|G}O z$JHBCEsaJl1#0-8+4&Zi{&dLQrjO)NdC9XVswsYqR5P3zsIclPLkM%Pl`T5IeUriX zqRD=i`2ayOuwkbJXIB>rJCjnz0;0s_@H8%%neFPZuz3XF_V%QoDt@Q5px+~s1@auc9-^e}1SFOcLqyhRy$v}iGX6<&ydGfYXDW>4UQJuzO z^VtCQ%fxF_US$_@p0EJY3to-~j)c3Y;h*y>%F|SF9>7lD+4wNqz^xdbx@Ix&a$a+e zu;MD`XsF@H^VMuM)tdlP=>mx1o(qF6DLi_RZDV$?p-Xazj3VI?@alQjMc zZ4zUV^)x74F#;mO#Wc5OE)a2}qT&Js1pd_heD3Y@|K0Dy$3x+PyvOTx z&htFac%L&aUn!IWIkCMOL>lTP_&1a^!^StG9=#v?!<%Y59BrH%S_U~?D#MC`$5Jg# z@Y7OSS+cF5ja;*~%(}HqNBAD4-BN=KslC@Bn&C4`iGetmrx(CGQm<$uPj}3}G`uG; zv154yyY%VhR(Gb{yXval!gzO-t;e;D^B#W9?8I>bR!PF3Bw%Ku5B`DMER=yV28`(! z{>#=~5o#2$ykDLCm=*Wffs-|wO{1FHja4i#Kzp%TV`T#zw0lo!4!UMkBev*!VF4ePkcnTQ0+*;`pydK@uJ zYOW@rs?H0txmotD?BEl6u;=2-$@fKO#YC?!uZp4vK-=*+T320VvxG9^65FcMa!9)2 zV(n70Ew}7ZqB=VQoQ*HAoG;q z;nfgvbf8WJ{Tqj#t={|{!~Otq|B@ZJXWDF0cxqATRPFD86?R$%FdJEmyqNcj3KiZI?%YKsI#JCCF}Q0q5+Q^%~{s zS#X1Bft*!RSA-oEurYL7S5yXZ+u#!C>E62&jgM^zwavDZ6r_pitsu&!<8t+g< zt=VlTv`2)Sy@^>R!8jw!rn44iMmOOpf{Q*O=j%8NGX_4-{f=N9o@zx8CZ|p6GrrxK z^h)IL80o?SuDlgfk2IEXV)t|t<>nN*?1)j>H090R0{3^uB0Sc5%9<7(n>($qeDq|a%u;x3x`s1_u>$=9rmP27T zh=(<;Jgz@m=8lWdV}yVhc;L0l=27RAv&sxJ#Hf8{S?78JgI1!Y)?~+4NIm>mKOl+=GTTyAW9BjEV(z*GiuGR z;(UWlm!t)Rb{EU`Fg=4vG=J{W$@Vc!yG&z)?Or@PdGdfR@UAo?laS9NtXTrJ0e6`c z>%iU*YbOCKcJ~0M{~uGJwzE-VW`?T*op}2cyQDa9)3LGeAXanOcK8GLk2*i>3~NQK zGB;GGsy9n&C%oK9vV8PoUO=}-y&h;Ki?KEB09n6OU%T5Th|uTN_ZAmA4Q{9l;>h{v zz}o2q31^V{*(&o)xmXX>Ey=o3=RBvavhBy!)UBn;<7UMT3Y1s!AZrkMXuomnEqp_H z4WS}1-*(NJKv5upW2lj2ZDJMJd=I=!J?T#s8-uMOF<6jCjbn`z znu@PXIx>f$F1tG=D;y!vZ?K|6Hb^mU99q#M(PywHu*1d@(Akay8RDYOvzm}`-)0K- zE#G70_ACgR8U0NOCaYy;Ja!{TlUV}2g}I?k*=hdLU0h}-MpS9<4dWn8mLNAQx7?gv-}Ll8whpMP z=#DZP#ys{0i=!c&g509?L6ybHjrchs47!spG=U`6n)#jD)SU z^@?N`pY_ahd8Yf2xZQD2F$R_!{1&pkp0B)%jAmkATfzR+>yr9!FMuuIx*aA&w+Dxf z*D_jM>j=LtK=6$umZ(W*h zz<{sTz0_^)2tEx>l=4dk_9zg0BRSd7WnCZudQ{{SJ)9l3fmrrsZ;~+*5GdV?+~%pn z38MD*o1?bwYR?M^4JSG&DaGH{c)(&5Rd#z15+T-N;;du&`6}G54-VNW!=HhaC$q%% z`5t+w?;}fCJwd`)7R>pS8y#gLegC`o(z6xA7V0It<3s6oroHI$iwE-M)Ag+$u>OcyEwl#>tP&3Ghfm)f$ z;k4!zIN6m;VfBm?683tbYLLq{)*kJfV%bpD0YY6oE0Njgf{oIJ)Yj3rOfGtL**Pa7rx*t5zj4x@i4vt!d zUZ9Q2qGol8(|Y2?kV_S6uGJdNscE){@5lP@Ej=UwpwEt%Z%cB_>Sx|<=ljkzP5elkE+Sxlehs!c-3f~>yg z4ilIcb)kChpg=rsa>36zHW>o(RjUuaA5=gO;nI`$$HHxbUg9Fw9enFM)AtLj#{LU6)> zaPj8ixdWqXrd(gA+O5=GmEE3{{n&};@av+6LSiC3c5wppIy%uOG~SR1v1jA7bb1yO8dj1YGsnh;jj1tExNG24nf){1PE| zw-CyS$VAf>^P!aspdOvA;?-6v7z{dO{Drfz#xmq}>A*@Sos>2@CLdfmn<_-vUBH=^Sv>+$@w_$+E&BloA($EWybzR z^M=jq+7n|5oW5XBa|FpOR~m=Mg@uL|Y*YZY7G|sse0mD7oyoakP+b=M#;!=4oi))H zu}IExrkU6`*d9J_dN4mP4ofe={+&aQ>JWK-9>5{e(LlRxsz$(u*0{gvJP~&v4_Qk9 zMRT*mdE_|j_lGeEjQZ~T5!I?xV0%^uJt*$oOZh0o)-Cbh6dlZJPM-p-kQ)?j>G($q zl%R@tm$JygEt>e4yy@1MlR<=o&TRTCW_fJ|Rbx1o=bGKlOr46!^b*-1)x=1Y)_sQb zeAQas7mGR^4zI=T%{JOIZ2n}bV_lO!xKiP*Zs>4Ae*kg2JE%Fij&YO7Y9(NE@Jkj4 zGP0x96xrLakA+6za=aM!!IV_p;h5gq$t6_-k%-ixZ%J`~Hc(rL!`OFjE9g>#E7+6m z@HLEMvh0&9ZIO@D9$kwpO>I>@z4IQB$uV|wxEly@Ji>ga){QlAft=7Ca|&h+Dr{}L ziAOqjrnbwJfVAhk+$#^6t@w8+Qy+^THk{d#$-VaRmTQ)xMo&Q~;jCt%DoYxTl#>(P{L;9Tfmn) zVQxqTkLhUrgipCFxIz}Y%iQ1&F+nL!hB1K4Y8>sk5|8fbd7kU@XiZj;a9gaDau^z< zOJ5EQ(Dc)}Rt0M)J3{8GPqlJ_~A zb&dTn6 z#tiUAozkLw!v+zm_eshFa*JYgQAGo{Mn8IO{^-2fAb2qN4 z4O8|@$lStnniL`XY954D@`z+*TXwws_g*x^coH|GCB>}o%E{>B;?Zv{5u;&k5!m{o zVp%k|lQIPNat4gSkEII*KXPM_n>zl81$_P&htg?JWP$#scktF7*l>eTqMed^1od9^ zvbN=lJ|)a+{dT7R-Y>!Kou(?EVA!?ytqbx)?B=xQd3|~z5sn1Z!s(uwddJ3)Bo=vg z6F7Fb2EDjwHgL0Ri?X#kkq7(UYt5DyilrvZ7Z#;84n7X8T90R&?SYJ9del0GCv z5l+ddY@yW36XU`BSZgZQ?`xlnfx z_1Kpby;A3ul?+LNGm{9q2Z9HzmU$0Y zLT!jWFgK9FR2ww}>e7>aa6E{)LIvm|kMyuYr!C>|Ufb|HY7Jktq>a*DNSct=3m}`r zq^k)mgt?J&ZcdziPilDWm?S_ep{%F0-8|}*SlP56(RVw3^l@GhKu0dTS9%V8JnAnQzQwEI~r->;9Y!$SNNlq2gYg^D2 zy`wBxS^?@NzK0udMJ?uvrg@;AN`g_MN+}*viGU5z_3I#uF3P&cx0OO3Kd7039!bV1 z>yG1lN0VKS9S!h;+ilf<+}YUf|Gh-XpR=45W4eTwfnq%RK7j zo#r?gP-K7;VyQ@`nrojgt~b>Y-KZmb37cp2pKV^IVy?~Yw5!_~Yh0Ux8L$|tY&6o1 z{wbaxJz-1@3*?!2>Uez9MypG%v{3^mfa+VBqS(W_70ki;`&*Jj9kHnr0oynfK>N<( zC}}w9rc?Jp3-J8R`3+oi*Q3u-2Vn`HWo?o^0jJ>ZKpq*0IWvr_f)GLaftIyX38rMc zsoU(gN6NUf?Wl5}kdW5S_Lm(xfArU?fN*N)H%pZgK-r)m9&xnV4&V}!ZdMk3ShJ+l zb?I+a7d{lY6==pHDC{9QTeSV@`-If!pi$p`po&-;fin=ZvY&K?z#t=?3j&y^iD$bO zRR*8P?8pT93?4Lwxf!r3nWf<;vc+Ca>#wWeIuesSb`P(s;KTGnMDP;HCx5HI56RGT z)I8V{{piVyr^q)hwMFE5yq0RZ*!hI;ao6s6ogGheuNz%;QQ7CVI}!w$EJ*GrWka7H z8Rv2n>QM$zABex-bm0Ovxn@20eYb!07_B;!yrHhblb$#=3!BH?t1t7paE_G^WG+_` zmFV${%Y8TWHehQH`@TQj8;4SFeN3)SZa^idOYj2sQ+hY3b^xBPA znCRqEopOjBBs$bMhH0SP zSQ@z3OKYVUoC~HbgfQHg_2ZNUlHHT3Uio@RmiEN}^VB8Ok~;GEU#Sm57(`9&R zPDs1$gL=`14br&Jw-V}t=(}DY%kb*J;9&7h;_B??=ybxi|3OB7CS!la8cNq3U1D&> zaBQVLDL1W7k<>Q9{4+=)Gg-(~<-myH7Y~`ruO6Bz|AJbNloL+nG0So&n4XKMG&?d z!YY*kW+V`r`du2^_(Jl!_7U@N ze4+87W({&9(dX;+<>D3o3G_It$sD31)wB)2FJ-7X_I}{&_!m7pb{U}7th_}j-_lOk zJyo#DrUV%>@@TWxY?zB#;|iyZ2l^C5#7k2~o}{f#YC+!)tl;H1j$2=Hb&O;Kbw+05 zwP#x{;-SIMS3-v<(0!#yvSoH@JIn!UVx$ZV`r?zFK+@uP`!WSy@?eMPZGg(wbGtUO zfe$08kgFiw640FM*z#*0#N>A2DS_lyEk5l;M;?*zN@%Fz@RxA)K}W-vU_iJnaS+TX ztMmCB*_qToKyJ_pWm4MV!_boq4OZ*<6by4C84CtptVvB)5bMe$35t4GQ^(1eZaxMJ+P*+~y8+st z^JWwCCom6POF4=3G6&t@I|^7SEqRpZ7u1&4%F8mP#eNR^CxJd6b)lcn8zTBlyYJx? z160_%EDc_&>4qow|H%Nut}kvjMhV4?nj4Hi#RVA5#%mD|F~#KW;zw-(W5Z!2IIx&a4l#~~mK_7E@ZAYXJDz+{U!3vo1+76D)pJ09e$H^ zE(#4PMy9k%gnikV5+*2uA*WE&%2p6}W+o;)NI_+;GnJgQpEK%pYMX|Z#-?Ko$LeJVplwFc@Fmj?sd=ngnKQ1 zZO3(!{}#KHWr^^(1l<%O>xZ||H3AydD=KgK1h2TH4Idn4e!t~VB1W;{(S5Oqxk6Po zm_A4^p?@gl8tS1HJUL6}^PJ}Y>{F47K;XiN4I}#-BO2(2#!%(!7|WIh3ZaG| zFT+Cj4hAh#2@zPOJK$mu5*A-84=sjVtoWuA?7IF(b%N?S(9~II;*}kZq=+e0*%#bG zc;~L9XH;25N|wqyG`eSz4CAuy8b?B@MCd`t783Y9Q7eHK@32@f&O`CgKZ9>O+RM;q z!EcAU>MW-l#KsxZlhay!g&}XX6lQ$ci0SXE9VJ?WHA2O;zB<=xAyqC) z1YXXU+yG>?K5nmMqiOrtNv}Hb<7==L;EBBo?K_iajL!e4H6Sm)lI(EToug7aDLLNY z+LKZ#L4A0G!$a1OOPHKmUp8AShVGTUT{bc3WWA%YEn+o#b>&Q8$BSi6?|8+y8*>2k zR#^i0B4!(I3CkTDTPvDnsGiP&(z-#S!yJu>1^clCQ|=??Q@5lLu%#T@*8{nB%!9G2 znd42LrpK!AqD8nm2FA=}P9vhNXd|PQ4aBV8;jvN99o=I;MS_K9=TClpG(PLjFj@b- zt`i*b>OqYPB*&*O-2u6$<`bnOEoE7c)aOTzqAZJXPp0!vo}s2?%C1k#H%}h`cAAw$ za3&6bgl$S2tUdG-_KlN^BXnaHM%!%?BMhx5gCTib>I~*ky?LM=M;%mhDJXAdt(}f` zTM6Sil`@!V$t7pgp!_BfV_Y7~@xm$Uo;m%~6IthTgB*UvG;F9BFZeDwq*GiIz!E?V zVv2b1@k5g3m`}?Fbsp^@!<%1GrOVIir2+AwWip$u2d zYWf6mI}p-fl+Ffuw8!$$hFB}}ceTWc+zX@p6DKyiQY>LENuQ2XI1NV7c9DVXba!<< z=thY{^W%c=2rbNflBzql{72@bXG0}=fot-#@S+l2#>hQ2K{c)oxhs+tN|ErwsBcqV zAE-1ICWmw0l(pK04IwI1+RPY6!Lzi@;XiEJ;`Z3shMEMPIJdLWErK~;HUt5F27+-) zKkKnt4oSx^_}p5iX09;!|6e5t_`09*4y7!yT+1R^4{Op13OB1aXIU!EB zYbR=UVR@ZcuiJg5<})XGO~gs0nuxO@4mbk>O7%=w8BsPULQ?YtyXorm%Ynn#GD$1h zjml|qzPZpI85uO=l~=6CFh%&whKkrrrx`51xJ&XJIJ`5ax_`jO?z>n66+8Jg8}v%H zbU9JwaA)ea{-J|_wp%S)klA`>Ct+$sE?_jR8Iu$eUU>{;{$xx`BYmem-RsPczMzj- z-g7YX65B)I;6oVJm23=qjv`zDop-DDn*#SkFq8;|kdQE@VPUOT+nJ!f1xtPpB3{q! z5gQXnZxjto=Uq{5gG>}TARgH*xSwBKSBVj_%dR-G62{G>iMFBWh0KU)G!GosAQ;X% zy!nNp<+Gyd**Pdt4jr+KAX8sPEe_LkG<6@a9`Le;c71VbW>?WqZIdX!+i?E8F0fWz zq{BJG3rvraO&#dG{9S3w^7gaEza$dxMWcB$(TZ&k-8zeFtS6tE=(Zb;w*>|c9VPC; zE993}&X%qP!5mf03xMskFTJ@DD=*51MBQeB28Sw79zCSf2b0|(b&L6Z>|Vgi>VR=w zfZ)|`rt5h|?g4Gx z$sm)rY0y`=ioKDDYes1~VG~lL)6q&?TBkQBo-~L+-haHiiw2@NI!x^{|8C~78(Tr1 z79N)Ja~U!^K{I{W=KkDoTkcO(@bc)`>jONr(^Y}A-VE?nBeaMb8V_Ozmx3XCCu>!H z0^Hgd;#j`D`3)oNTw1!HON>O)$&*75eEij}7`I(*+Csq|cn1eB)|Ha@F|*M`*hLfR zuPO|Qu~~W>we_v$(Awz9-WXB=YTuA;ND1@ALa?V^4NHpk{VApvj{M*g3X^mP>CQ4% z-M?vS@lw z%-gZxr1De@eW}_~AC-V#Lmid&IAlaYfUTSgf?8}%J*;yCCfG@z1jp;zZQL|}6vEYR z)x5;U&3t&sn0@=mZfLp9(+02M*wf|hsixl??ZV9jIi)883^pbzb>dqI8^vNV?E~L{ zcK)GdW35cLgk5Pekc$!KGNU0ljfJnn;gW%r17gu9V~X+T1xk?8K#;kDoPJ4-g%Ps3blF)Geaq_<=tc&^tlbkfI*eClS{vTWzBw_ zzicHnnWlSescHeQBfH|ccY5i4WfEl~zHWd2C}-Q{G^?`xSvm>{{`pOcB-TxFjwT16Z2KGZLcqov zhWwi(Ms@kiYSSa;s}JQ>-5F`TisZBJ8dRLlDFNjAbX3zhc`Rr$b3KmX)+qxZ35>Yw zLqbI!aHN;MgdS>CUitQua)W+SZm7n&1hVZ7zWsEU;TE1({ag8e>u!W!Uwm84E1i(0 zkBcoGz}Z3adaAydtL!q=vcjMV+JsB&3)qf&u%2ez_%u74rhE#Jph%k?Ut^}NY&%Lq zzpeRHAA)7s<5T@wyx6TNpdm?tVW;e z^8wPvV#KY+?#V825HI}d>C5CJivB1F@~BiCxZiRh2)Z%ODoZ4m{M8n&47wnxev5ae6F)c5)^~F_S+KEi)X;^ zh6#EYpPX64@-#FD|;=!x|9-q=J1K5~+B_X+ug32x{& zi|KGABk)k}v7S$1j%xS0S<*cses~>ox4t+{=m-)dwKv%GaC2*a8->}5L@H=I!&P8( zg@Hf(2hHTJ&0#qA*9B6(#LswaH#L5NGBMtd*9D3`l%Kx3^Jq^FZnOw7I~G6#KWPf+ zsu|y`TMi4$?9=h}o*%C8FMvK1Qv|GVlsYbvR(f4IuR1V-%1OMS0nvNxM+xpvEBKc3 zR}JF2Qgcgg7C3B`^V9|_?S=k;zlPdu1Hsl5A=QxZmKraS%p68GGw{Lli{t?i`bbyE zT)P=-x^?voSYn91)bFrW8)Hm7qYOwGrqjmPaJ8t-0+6Dg6nLLANI$P8n|+Y1?>~J5 zJ95B$>72)vKs{DCCrB&C1ccG)f^3(&TS`XswKdnnASiUhIg8XbKyb=IBiJ3f{wLFf zUfa;?Z}eS^3LMugIm2Kl0uEj2#dHXsc@7;Mnm#889P@;$24B!2G~Q7G-2vXiFYG)< zblr_LtJA4|?#K148BeXASbYAd{+Tw>C&<(hupMPdQb@pj2K}fD{oD>mnP2~?7VP_N z3s)sfAQT{2mUa$QUUipr^d!&E?`%h*rju{sM#GC58eGgvUtV0r6_uo2?=QRPYHFl! z9?V%|em~5M)!!l&XIytW8@L%;eey`o^^b6?KcgEvL#@>rM;q_AR~@P(_3TYl$P2W* z^V=phJ>!;wY1welDYZ{#_~9K+|jSyLayjr3lnftB#ho7*oy`e~VT}R4CAU zY%RbZVNSkp*h`gp5kpI={tW@xxA!bcf#mj%KWb|Fa=OA~1YoI?*ic`S+#YK=feC%$ zdeiFoqsw;FYP#vr4L=E$?IH@JzZn|7$&IlA)@sOX(gd1g+x7Ap#}X2{G0#pzi@V5# z7zfk!F2asRQ(rNXxRnJzFSyycXe|v!(bISp)(OaW)39vQ>GM-EjeZ}G`|)YHoSLu$ zJxof0HObo~KaNjIaVq0kZ{vTdXMcN&Z#60WY%hnYHTj8>ZH;;F^W-@*YIwe5T@nCQ zPygod;n5RV>ueggR(Z^q5+9Gm{wVJ=yY^B2nd$E5Hqv&Iw0Xa2Y%eGL-kZ&D1G{XI zdP}ZGlE(pda_GmsZ$x+->_WePIM?UyW*gDRdqi7m5M`#uubVmkdjf}`l+FtB@q=hh zr{hRfusU@K$VprE6~aK+?!!7Ks&=n1VU_v~ZAn=?-L^CRmy)^R+W;97HDW!hQX;et z$MvFc9FH|D>Llcbk;ai2N=*>b3ID;###Qhz8+-L?+_R*N6PKTgME&u+zvYjpmN%~F zF0-*mu06aS7i-km0u;Gae(S)M=g$f+zdiwt{H^bH{U)gfPY8rk#&y+)HzINvJz1nK zzZ|0ahMpfWc}c(5FUPNEBWw7<{0b>2Y%U;|g(}ajukfdM42lGt0i^01f;M}$u)SmF zp;I6^O)e9Z>sKV+1`Hqe%5;P!=dBGcyUiWoGRhcmFUZ;c8aKro(GG%*wqZPA+0b0m z2bnf$VOA8o;OJS20?#!G8rREUJzc0^(dAzG*ODW1b=0TK{eYqte-priBY;CSEt>oC z4Q}@y+V`$;*WWYV-zxEkodiI(#X#;o2HWi|Hh$~+6m>;n0Q8+FJlFpWfU|2jG1nqU27+eCdG|Y8@=@&X*>V@~g0zPK)I&>_=U8ZF9Xl#0bDG}p$-}F?Ik&)# zZ*@PCiX|wnXo5qQIzKEunq6fPnMxl)l5aq)=C*FGKI7^q&bc2$PhW`2j6p}n+(40Q z&4VxdVPCqZu=E!OFRL%KM=8eIuXN}UvS;3whM=z_YtttPraSvvz=t#E!|LcW4w-NhG#kT z2SPA9q+&p6zA;$vpXpFfgqL`IA9fDpEM5bk3dTK;^R6Vko!Cka=>o^-7gPO>Ql zzM%-AKXmh&Jlr@|Di3hp;k|`?s`SsSB~#wKSCqfk<7JV1Vv$ZoD2L6u6S}&*bFqz7 zf84aHP!wUZbOB7sXwjfgkfv5LLA3#T|{vz#V1mlqm>t`x!yN ziWBlhuCbaZzViZa-RDlJF5!;^yVwT`t#cO)9o>%<<1b&vf5SCu;mi>(Pl?nVYg;$- zdGaORKKHUli4|c0c)MImF3FIQ0&;BiUjY+%0r^^+)?NwC^>>!y7)vkj* zNtKAePyr_vq+5w{VmoVnGITxZHaeH734o9(D8hsK@cv?8IglT*MHE!l zlQ{f)ByU|$M@6!Gzx8~GI`11iu+38>ry+O1X|Bh>#GTHNuGeRdJe)m-=f4Cw^$@D_ z5X?+FLbqCE(p2uPhc4?Eyh~E~X9I;#Uz=Df=y{`L3C}#xmY8lRL|0inTkB;iI1@J6 zHR{(-Z?;td-P-!JNi^^TY>y|hlNiK-#5dJXX_kKsUya=5_-)^h&3aqY=t-ROvV_ec z%?NIC;S+QnaR3~5ucHU5l0Q3iHU?+~>tQqZJ?an44y&vTqD1Omo4Y3_?T`S|Bp-z%#YyJ7s?Ytc1|z@EBLLBo%m&fs8wWRvP)0KE(v&zL0}@F!zG0sHf*5s?T4qT5Sv^Ww$_WAxWk6Sp&dBGbM?`L{(-FqA^i z6hlo9ceS>*26MrC462L$a^FQ*^U0XL2#xKu?CYR1`r2?8LWQp)*?YLe4G)UUK>y9vkCgnBgJm0lXKqIsiM0zo~os zujT6dv(X#R*|*N@^Q78$J*9;8jrmP^R-)0)^q~~7$jV%kCzvkv?Ucv+0c~E&eBOq{ zncYwSM#snt_o6l=lrvp&!j3MQ2|u`3p2;3trPI;~4{H+SO3&>NI#}i@P+nQ-D98Cm z%t&Ojjo+OWiBjtSCh}7TBO_xm-!`MPFm0%1D##N{q{i^JsrM2Oj5Widi*u#$Pb6R(G+)bRkhN;MQ;LRLo8VoadOE;&Kth zi2`O!Ag)AgW%gXK1RMZR$`3Y1u#&yo+iFzmbQ zs}P#-gdQ>OVrinW<||-t4b!NK+OY3SBC+AUw)6~OXt#7%Hm%mhl2tnDacF84p=HM?I$D%^ zN1&(n-EF|>WPdwOB@Z)0U7oc#^anmS(=e~c2$cc8CfTum2P8;t{qgtC^FS)h%3en> zRW;bvk{=HkDHTq=5PX8Ke9zNa@NHUBI05_cy6jICsf{EUxK^cXzi?l($KGb}6%=o! z0IV#(UHkg!VnON`O8*1iJjx z+UhbLL&3LOm13r0#|7=SGTQ`xAZE#-XO^wk-XiM{3!#dNDsYxP#w<4O_Wc`|z>g8N zCOqBejg5NAlAG!I#Sk5dY`iYGz0b;1Jf^8)J!sRI-=QS2V=b*EDr@!Ug^X14=Wh-j z%9wsqTLfG^PGTCr*{t8RdbFkVQ^RT5!Jo-Me#OdX+`t0|*OT2N+QIHKA3n%b3YDGs z>j*#Y;)ii)I5NSpxtcf)Js$su{Y6PO^07*=s`1Z{b_y!2R%2T(QWR#g1u>x|QDK8J z?_2?=mD1ZBs9Q(Sb-F5_M6y}bJY$u=h^CT&efl%bYzxRtH;CK(JIi{(w5{(p&%oV- ziT`8Y_ylQxM6xJH)8Ww4oyjt9N{)Pw{`v6*!KrGDowClyHGv!4@G);bp(_IRqr8b^ z>&F*++w{d`6Wgwx_h!9+kYjSMh~GXvkK=UN6w!0g8&2BMxFRXoSo-^abo8gGI#OmS zD9(+&mVS=UTU7Mk&*il^q6@HicSSHWlyY-HsBuNTzAXMA6e*3I0zp-|{FW6Xqh|fEnav1lIk^JlQKfc5R zH$@(2n?`&(z*naCnR{Tdg)tM9(q(@n_mM7p(hG+M)pIf|vy&V`j{f!kzX~$%>y6@~ z;nOw+%f%L5_q{YSvXKu%d{GZW^U3)}w~m63drW=iF@2ESk=eJ`@vm1>KGW;~dR07O zj{~ziEUz~_PZ3;*{{J2FKW|IK|NQcn7`~*NG?h_(kAET^+EP@CKC^E7)}#8nK{}~N zbYjwbcn(=1sttJzIwMrGT)HQUQb+FbVZuF5{$ip3BS}A1ip5{Ct1&+jK)xGw=0dnjfYtF&P4HCD?3WXE!v`C0YrT$u z7^@&|_;-7X9W9FXGN^xSCPVz@{Q8$W_(eX-6!=|waB}zZ&FfI6hzK&>K~wqoZfVIUR?@Jhybt+nLzO14`+s^%vd8ui`9zGCmytCEQns zA)zL!Q%sqMKRsKq8yz1YoAW=a`_CD4l)W9p+QM1S3!I*UE1fO3I!q10XQp+m*}8Ry zvM-lp*Jt?!p>7S>-}>m`{imqJTn)cfPPdr1VQ&%7Vh5&^j`2_Ac_`s8%MfvD2zQUg z)&FCO`h21!dcfygdUFv)Vatoe{?B%Mz}2r$^7w1F5+IPG>oq1sqlf*^761Cm-iSXj2l8!`B_Iu;y92Twbdz_Mi|^}H`YgTU3-hWc z(nq?XFe2+)-Rsc##5A0%QA)|~NT*WqnI~_G{CahH1BoXiBArlCgk4rO&$UCQYDe|L zuXVQ3?WKhg@p5F%ec_T>*ZxB*|L4HMNBTUX)?k*n=xnPN@KrWqoSw2GmlC3AN{{{*^!^5 z!fV-?1Jc5=wDyJ(CNx6yFl=Z{e*+z5ou&jh)Nrd-31-a#bW)?(M{4ulH`1sbmRaXm znnU@H=wD>~mn*&yB?#ZKc6DQ62HHl&`Go zRQW?KmyG(`!ya>VdM^QBbx5$&0K@!N<0(bifpXg`H{xa1upO=W;U7x%tMEr92xmbS zV&HU7kCVGsCf)9hfCZd0H+UpZyW** zwIhd*0fqwe0KvZco_OHZI=326+&RSruPbcE|Imzo6na@g+mD7i&;53V^;XHbM2j(@ zr4@WbPJ+m}=$yNxD}^bH!(&`?kK+TB0jceZ{KVIOB2m>hhBWu#ob3fB^7cf|E+eTU zsdY|ncRaEG#G(F2neU%oZDzcjWB8FgDqP~?18%^1;fAyt=${DB1%ZioMUk+;B4H$t zk1XT%ZAl(2yZJwM{%=@#`+?tQE3C(W@Pa*|B@KX&sQA{Xjq+dW&EM5u9ZaRvj@JZ$ zIZp^YvqDLj1g1SE(>ki&L zJHhmcV*76N-|)kiw2d7-|06o|tIqxPHtLYD9&7vj##Br&UWic*v1Tg)ImcB*9uWF8 zLU_%S^2J^ZEYvPv3gC?3l#8xQYZXNd4D0L%biUUpycdb`Gl5jcMJ_!<4vl_a&aBSK3^RyJTPaaG1|H z>{5$XO$Dh)TF-hahoIeGybc zc&N=AYl*PE3pb55jwjUIp3QZ$z0Y=i_WhkZ>-)tg7Rm~MR2Q1SNO6d(&6(;FXpW|5 z%Du+JhY}4ZT-Aj$g%dA1G*DWZ_2wM22Q`yM3q1J#TWb)er$Fq zxJZwDNn=BZV)XmJB4F-4Sb*TRU$1ktC4Bwg+egZaH%$z^=o>1LXHdA(M zNqR@cy=G$jq5ZzZd4|AbsevUlJp>pb`)H=k0sr`6i7(k>pi;l02#arBpELJH=#r9T-~2<;ii+>%xqF*SfyeT6>G z-A=9aDp%w^tNL2Dpf(*StT^Lz$^J1=^o}9*o3UL#y*m8U_U8e_`i+I3k)U5T=EpUZ zZSwm}+;_?lhlENkepk(lyh~1Ys$R9UaIfd{KlhPt9}1-Nv32x^zj;XOC=Y0!GrB{~ z7K_~R`x#d%xx#{v<#-j0fXaN=0q)kq?Y%@4^eFl;gmfCxKxE4di^a0{pZ`~q_tu(E zP(Tyh6Ky+dE$*VkhAbay>yIg3u4%DGgA?-n?FQDG>QzJi-_-K4J!PySH6T0e0n~blKaRgX%qwVFp!tw9wF5u?sWWz( zk{xPz>fea-p;LcK7^RB%bebt}#}BWXS;&|(uk+7+Qbjm#DQ&zNb5T>mnDtg?RdpGh z!W)EDg<4AR+Q{Xni6{_iR(xEuK53c(WazJ0=9ea`e7@B@?L*(j?Y~VrLZ?xH2y^cJ zj~-0n@Biwa@bFMAub}FN8*upX37Ot6V$e$3c8VN?Ran|Oj#+z?9C^Q|((ds_#}g3Q zEn75lhvC!PXKdg89D zO@Cm%6Qdb=gZE&s-lwYUs>Iv~X82%@Nlzz{ZrOINCL@{$dI`&NWa>@pj~=dZAIZ8B zyiQg-^X}K5h#{YfZVdI}%K7Y*v90d?XnyCk@X*kGrlXtwv43??JStE9jsgI7x0qbM zc=xvx(xGNJWRq7os{a40f~0*<+x5c(${GaF-$IVzDx|c zlO|yXIen?r=RqknNo0(>ap^D<9YpTT#7r)UVJ1xOkvjXF?|BY=XPdv)>}TzF?{}^B z{`OkGwfCELCNO*Q>8j^Kl-s>zW*2ul6`RVAnvw0cCU9*NJFa0g!J^iwZ^(h`JJBUu zK-&S!F)QU^Hw}HzyX7$4H5(uK)sW=vCv8g&0UZ*I<&FVCHOjs^WR6M(8v~^O)j}%Wd zjS}G6@JoPcw&x2^H@5z6Pp9ER-rh+CUc^cxfxEKm6*iCtCYkr;o?gVbg7;p5q1nWy0%mdVTIEeAhF(Yw4QvBQg_X`DLHtoJOXvkF9%Q-FD1sh=Mj< zry#(;-6PVcCN%|@iB0j#G;~kmn5Y0-;^OJJY9nHpf96lz9;7p@Z^Dl8rt<3cio^)h zssd}P<_WJuT?qyo#KfuXm%AH8CGT?oqjamfG3r}K`P}jq5B#?%D+>{3D&3%fO`Nc} zz$PV|yNu|Q=#F6Wqou9fnpVUeFk_n&!>B7Cuc`;~Y%++s_4}JU-cmp9Os`4maE@B_ zG(iLaHc)FEd7r{M*CD{(nsPCKxB947r!Yoid9}|)hKibpnVrXSZg!N~=)2lk@i*av zLM-hUoiW{lFHs|mAHXXya7g9q#DT)o3Td{<#pCN(;jnq}l^Mq6f!vyOHi63bcW?2^!Q%anmPs*b1BYR3)ehN{*SfK9P}=pv7zgNUnh zjh614?5c>kd!#F7FxMQ}6hDo8 z)G7tag1K3K%LX7Io2y73TWpbx+CM~>pIMe$R>m!JO5132uN4EFI4Oq!xqaJ6<#WT$ zZ0prc#{;i1MQo(i^kl`u-$~vBrIoucK*3p=E&d*b&>7+7KYw?}mz$TzQKWgQkTi|& zjUtU0MAnppjx6)>e!f~Z*Lh;TYVi#sX5{OHsyyE!Hp9y-fkB0=CBSYlA@(dHa&(t- zkCMa-YQkBI7ki9EQf3KkUxjg0enG#k(a=_1EdrqBu9)xh;G%rBT%Ky8dIb6{Huv3l zNsYVCR#c*@k>oqwjz>Na8L=2#afi3DNK1CPImrvo{4_czG8B^L(^4GCf;oCH(>M~R z0<^pm#AWnjTaM-CaT+cV`yYPF@84I8RYoPQg#6!w^nZU@_FG=9d~TMtB>C^L+om6U zOJ*{Cc?mT^EsD^lF%5Y=#PnK+*jDP3d9fmS&+BERli=uO3oaa~K@SIa{$^@WIdR7L zWszm0It0w2`EZSwwD_k~Eo|X|XYxKDkDZ>ximDfSyC$5Lifjh!42hM)T@tMKqnqhd z#l8x8x?ByPLPR0AidAfGSv&=A5I;qPDyQsR@G|4^@f~j%!H4rU#rYr3(>)rMd;9z} ziqAVbAN=m?^Vqh^5|B-k_cp@y)=y5ORz?VJ-3+UKZ*Hzu%D6^#Ak?sARu@8c>$R`} zD;Ou=U`ijXk#!x|lOAL47{=rokYUzQ`R%H`fAr#8Unc>$?3YF~+7Q=wDnD8WhJTwG z+~4?h5!TB?!@Jc-=pK?dZ%$~gUTxvgCK%u|GHfQ<5^F*p=`m|LD$suqL7>7VR8nxq~QsuL9TNMjUBq6?FZz`&r1K2Fi_}ik}d(AqPWQ%R4kJ76n#$}Uc&)r=e%-s(~Wz+K=wSf7T#LQ0Kx#{#~5vfVIoI>Sr>(9}9k zJ8cIA_G(3@FgP=5G1yju)r>~w%Rm>Qp;+=z_;Sr&;PM&C7?rKkkU=|s19%y*bbAkA zQ>-p&bDS!*wkFmjN(ut`WsIo~XMH{ykFEq{F#jYsK<)d*040EghYiVGgumQh!r(QftI}#f z27UTUXw2{taS5pCj<6#?4nGoLEGGIl?=!wiyei~8lnXvfBA414f1K8Vvq&d4V8+GZ z#)rU-fIAKEG(yunV(=NT@i7}$d1oy}`A!Nw2X2a*6`-7W`@6$y!TkY&1o()czj}2L z7%`p;hy_{?8ljZdT=bpPv{Mae+xgxY(zGCPdR7cJbf-4R)L;XJyWsmgj}E*FgD}yb z*Lj=;gR@j3N3LAjKtatGd{xNyh7igV;4!qdxFp$Rx#82>jTAD#31%QUkP-W5Z$b(Q zgwNd`Dc(rI6r7-`dI2PGfMBAs3)}&BT&eNGMhYa@x9uO1M^rB<3Pb?-`@=zL93l- zjmP5wJeCR^L2rDM1&lpjLi?cQi(noG?u3_6XxODp3GJ#@(Z)1U!6v z9AiQ&nBnRQ^5^Qdot)`=OBj$vS3Fi90Rb1qIZcJN|I;l6f@i!a;}B8+{ioKuX~AOL z%3y72RML-)a-p2+jk2Lr>bG*)iuzat8*~UUGk3l^s0c(WF_zny9630oQkWUk;#J7+ zMLzqvxYA+1%EGL|t_^gZOuRp;B?oXk6sB^29oV(RdauFk_lbleN#6B#3N{9SoW`Z+ zy-evM(!5sCk%{22NNJ#3i0?|!Cf#@vSNmD!a~-0nbJe#o!_d^!uo%xoAsea~SCdf$ zybbn?3~fUZa;hz~k79O@otvrYC|lPGUmK9**9P8640U_8@_xRisK6aSG6mZ!_0#rY z4f}8!^lo2Wj@?xYlPBD-JzqE{Nfa*3WZ1YqG>t+@bq;;1_6nz;fKF1h4AJ?cpa6H- z8f^hZJTbd5m0CBwX;pwWZ5%SV^r~tSprfMD0Ug!96Fr&_RbXfPLT)rN6oL6}8^eck z9d!4^w6pmwt`a05N=BH~m*Pb(J%tLsfYJ-u4O0!l3c8WY=y#Dl$N7Bkpf`;j^mN(- z>0%^wW6`89)3ebCisZ=I;&$Hl6hpd)YHoAiF#^xpC`g>d5R4H~%B+n!`X6n~R@}3C z79F5J@})o`6h$VvPYrw)>L-Nj8Hs|juKZb2RG4?Pqf!g`;uXy8ap_ifP{zRl!Xy}+ zz__r^(A`9Vwe{WSZFZd5co6a#GRFqcvpYls!L&b6V*z%0hj=5<6{z4T0-u)Hx8&cb zQE`zzzv`y=!r~ABUN`jQZN2Y2h^TRn4&-fL!pp*4d>s9l=kf7Jf%xuE)vpYrP>xkZ zzKV!gi|n8^d`PQk6gk13$>kXB#tuL_d9?d;z1_(|tKS6-)wKA;B?)$X208n9e@w6R zJb@!(L%NEPU$slA%T48N>LK}M-UXNa>$T<1tlUdiV1N75dJ_qjs<-oqMoV!Qyfxjk60d< z+~;tXvLFjb^1yl)PWOyA%9u}pujNtBGEhCcfoH-GjPb+nZgd1jig3Ew*48H7?wZ?& zIKPV{f*#W0%5B$J_Z89U;hX5IAuZ>|3-JIW9DZN$)z1eD96Mvd(eK!vh$2rPi;Gcz zMv^tAyb{K%a3xH^u=wDW^Ee@3+ZdZ3E&aQu3W|FWG>7a>VEj6BBXUIm@j9!%5a~L~ z9_s0LOJp&b$Jizm_n*<5N#U3KM{OP>Rp$B~gfyDCanX6=E}jL0D35;vQ=) zj!>wfxMR-o9%d~XQVLOTw*os_M5J?-3^Sp8pV_=!*-NG##wy*iXTrO-+5)qm{JKMV zkt~1WIH82BpEn|8e;DgcUf=e_Hw?+{t^E1q+yO!yDD|3p9#0Tm@CUCrstIH6XBD}5 zC0+-58p*7w&!Z#5T0ZIKLTb1vrO35HT2pHrT z^d?nEiE-IM7K6g+rC0Kb!p2}WD)&B!ZtxOU$bHs zw>(pqpf<}kzP7v;sqWJvW^IE__N4#t_m?|ZtPh>|3Qtj5&B)Ylh z**Uzn!eV!&{9Rq#2Avmo03Hc9U&r5l$|I6)bFX)O!K=k7FL-{FI|MX1DZ3e+`iGZyMZIS;$p%q)-ueumTV34l?eC=S zHmzNkoLn0)+5z^%gy!M}!hI+aFdyU4<5*!&<3v1Re&YMo>_x&eb-ZcPBO*bn zTgk_-sF}^)_OoO?Q~qAM;}+5!GKwKYT1fVSSd;9AewkJO#VYR$QeuAhnR%aQNzdXw z-^)B52-nB=5*g&Tk(-XSdJj+syuF%AdB@IaI@-hWp04L4!jE8=yn*?|p;fV!vYjt5 zD<)1Q^GukX!rA;ixG{FqBC;jHEQVUiMuwJ#j@nWAgpi!qf8;jm`CP)6gmkzuTS{FW(p4Nv`%_#bvx}BK0*-mxe)V5f38N8ED zGTS+zUcnx{B@v?vYr~Vntn6C)tp17kadixbe(q*BQAev8-5EknTg%hSUAXqL^;=hF zn*&p{4YJ1tZzpdUveaf3_LDvh)DJzoL-vx$!huXUzMH4_R}~xv4OI5SUUQio1X}A( zQBUa>E-4xbLUqJcI@vhS2tN>xa4K4krr$Zeu$)a==s&7m7;zomWlou5=kauy5jnR|Rc3Dyl+WbsMyk-PcO7S;wll3(#~1>C?Y|C4Y{F{D;^(FS!v)lJo+#3pcv8*pH9JU@NJ4h~DwGaX?Z^{$&jvGETWUmc0 zT^=+*)`ZtGeWINzZ`*gElW4(D7=aB?KjjuZ@I(mW6FssX;byS**=-NrT|65pX4Yg@ zk}#*2CUp7EOU+VcH&LV)HgPU~zu~Gik*y1?09s#OtQ+|Q>j2S*C!RDuGhpulVknQm zYICdoN$7#s87pXI7t}+3C8F+U1{4G_oKMw^sddD(C-~Jt7jIdPmfBXAR}C4AdQZXl z-vchJ;&Hwok|K=9AsBymrE+UM@SWFsI+I%eBoOvd!?M49167m-QWSmi0m##UFyDfW z!1PsF8Id9kRWt)lR63fh49T*o-LCXjY*U7osj7Wrl0>46pAHs;l|Gt(&q(?ydR#LV%%Ijg6= z)30_A1U>oTm-glW6ADjzI|o;OPa(=bO7O$4f8A!Ir1+xuXA33Ly+y?vnGr|LsKmXpGXpGN#$Q`31_okpGT7LFZzF+;n#>Sm2pXr-4PH(5o9IB z)IAZ8R?ssPx5@j?v;B-}%+Y1TG*#pBkHlqT<%;Qb29x}Z2HVvsVF}be?=V8k&=ck8 z-#%Xe`4QfUbXaZpYg%wfF}#dAik5f%B)kU(7y7`zQ0O8T!_!7_g81grJB1$0|AS#Q1hW9s`{i6u7oG0qv z8R9QeJVJh)fb8@-@NaecF@FwLlc$Wi(6zVSA zzbA5{6q=8Ahi9!-3lgsOC*^LK2~F!N=k0vo1;)h}jrFfWL$+$s9(ZNEj4t3O`0?V>JLEsTjEQ*8GMmxG4Di(nq> zZ*{lA6ET^F&+8z9M95uX^kXJIcH-7p{AS!zH?PWfaiRC_>;Z-n>{2^@Gy_=ij0xMa*-Q#|hLuExmkybC~D!qB+!L&I?@sZU6sCf&bFy z&%FG&i%rO$uq^FJu?FZ{etWO3TNT|fw6-d96b=rh|m z>e$`d8vwQ`s-_v3%iuM3RL+sbPSk(~JE<%S9PY|4#0yB`m{S{MGa@nsp_LgJ0=vgd z1_xVl{N^O&-Ae*ge`dS?@yh=^K&OE#|J*IU6LXet&V3ACC9tFb+l=X^nCGLJw8n-2 zx?Z+bHb-D}pPrCg+E%rh@jFM|E+!2D`>R5?e51`))$<(%#LM>r6M!qtyZyP%RR_7m zehMn1{!>NH55IS^oV*@CrEd~Eq0)-&NA_RySIr_j)B3LCH(ea_e8AN?FwQyrW?+xd zrwv;0MnfzKyJFhbFl9lrFf57W^xk&Bq}5lzENilGz_%Tp(P z+P~ov#|Fc<-<{#FBi+KwEZ}tn}JS1;gRS z-Jok+`cOxco9N%p4mA$qBN}u7xv-9xiaV*`CMopfJ>hn}_`Vrz;tk#wuyCFB+eL4$ zg%CgCT#A5tXG6fJzyj9c57MWjw0xXJ&#`5h4T0)O)t@h*_94i~*xfNHZ9KZ9)ryKD1v#KT^9O4drh5hJ>-^tCAOq6AJ? zM%QDVHfvZvxq#9Dge#;?Cw16ONJF@V$FE&<;6%cN!*xdN&VGqu!D~HYYtZJzd39P9 zmSq=5r6%V{{t){w_S0cdqm4J0r~nn#aSXtAP7`a|!8hZXIy9AD{vSf(i(rYTBSN|z z*ZF18!+g61FWn0>WtyI0D6>OW-Q=A4=L^9v7zretV_jiu(L)@Uz7WVRdeeQ$wCepm zz@=zmF7j?t&R0VLy`8)8+3zDZ8&YsiTjuTcWSjA}iwi>QYCR?^PfX*otCC1<0U=T$P=JDilzi$?|Hs1=rqmjS=9?;imYFVJW z8;Q7t<(OsE4uz&D+#QI1_vLxFGmFJh`_3Po(fos8{zllzEfg=~oB+GvT=WQRl?J8{q~t{wX#Shrj7_l{MdBqJR40v!~b zo^Fh$bM_w?MN2QxpDNWjAD8Ak_mDVDwxgbw4wn;}&#?7<*=bsO!s`b|@eL{*Nv@Uo#{CUVW`c!m4 z0%V@3OhDecKBK{n7$Gc%7}5AR!Ac|Hf&936{d@&uX4vmk2WG=#Z4`t=L!_|S28$pO zCUFye%TuPsmtI>;$VZR&&Gqjf8g3*UF_4?_JHTRggVn zRKZ5Le+4&EIfq1H0LN zQUB!KSBj6pZx_?P^+0*d6NdLy`!BHj@(&wHUGCM58@M_RQa>&x8)}9gP7RoX%wi|s za`Y?fDfQPn;tVPmV#uAnZqqXv$fjz|6)6#w?R->Rpw}koV){^9?Qke-&AF2uvr?F^ zn67^>>{GYwWq`Wi@kT+)w_W;$AAxpVzHe~^$JxGbXOZ)}DQBi9lD&R?k{(SCFG+q~<6~{91 zta%}93ys@m-3pvLYerv1L*3OlyVR5WV`x7$tcZY>6j9R-4N+xO%@hFEr)EO`h{-ctpcCGw^Cmy^(P}4#sVOBJ{AB6hIMDab|r= z87Ckw*WzG@L}Lm^LXgEVChtkuvz|wVZtvki?5z+HDskz#ZCNG_h1(u%xS+BLW=LeU zh@7R>9}BTW-=O;n+a!)L8XWAnw`}15R)L99Ji~lSFPoE&NAi)^sQ-)p(i#o(Fg51` zami|?j<=A1U3$X0-~NY%LcNS5!mh5zt6>(@>T`5+_;O5m@I-^sPZ$Y;y6ow-rI|w= z!~zeZyCPe+Ri6(S?kbd6$UT@ztlP-qJ^GW^$ZmFul;ZW1u$T`NPx+tIrn{pC>$iRq zqoTpcZ!z`|A@DgqC#7d_x97iGPqh6|LGOF9iH~MJo^OCSw3uSUb^UNiL|+dFxk6mI zWRC{4qmB)O)ch5RCThLl{xR9_VeO$RfpObiVJOJS%Lmce^UQh;(ty0Yl|$coMhKtl z;aS*kRWd~k@2}|2xF0%BU_u*99+n?Bfai4`7*+GOu>(Ns1ubq}O+`CpvW!yaDAkkn zU|0=8K4Z8~((X5J!>w&@%4~E?olFKx(KcU#k==(C#l$Y_u+W zn|7=+!N706@Jl)6Y?U|pnEl9rI$U42qk5#nIRg$AxW_McdItH#4cDTAEc2D3MUawa zDl-&y=dhk!baShG5&Ke-$&Grnrl=p!R+qq-W_Z%b+O}+N$XOWqRdRFIxw11buGLF* zfG$&9#Fnk2MNt##GHlPN%VjCo(jQ3Wh$8hjOt(J)-Pe+Uz5N;TR-K1MqG!vEDmh!e zKcBA{fzM(6apX}4UrAL96=;Wo^&R^pP~?Jn#@Ng&#?ICjpRvLF!C2@b=V-M3ykW-& z6Eu*L>a&vHZJ9&O{Rbq9DP9h=@u0d}Z{?=MR+j^x?A`Q|kHdjLGWv2<%V!%pM)g7H z!4%x*$dF`skm92Qya2MoNaaoGoHwR2Tik+Pz%%rtT{ART8Og)O8?%I21kyxzj~J=zqgJ`-{Nl%9BPBV552Tk?J^>xmZSNxjy>^SKNVA7o zo~)&E8E2*QlDaDmHb7St7qx)Av=xtNnm2)pNoE6;(&jsZ64mZg=zQK+cHf<$cu&@n zHTZ>bpD9tQY|NRE{1!zTegBY~Hf$X6Zu4ZGhX9$cL#5N^rlOxI{*aZWI`^56j}t!f z_w9{h{^~Lsn%oBo$_Lj20l#G5_BVh;0s}VnoP5o@vdIDmN#3rGj%z*TLDwK8B>J(L zRyo738C?}Gk^^yJ&Tf$JRj+lv?R@pUz4l+I11o&r_=nuRZS_Ky6U6vEcLxsX!VSDf zE34}ilKQA}S8>gPnbJ0igSh(#J5XQA=8gs-V}HJ>y1{i=v!?7pVBEYuIAI&jY(8NH zk(<-UfXS=65F^FoBtvFIINfZm{k5aN(=D}n4mI3`-R)np zoxGo|Vz6^%o1w+HO5$&13xcY-pN4)FcCqh#!;!1;%9X^Cz};-UsAW68@(J=V#NCr! z_GWD#mmWRG6I0nR2KHl^ApnA9`fwb0eaV zvWCFRG^QB(%rCgAR*alFxSrM-2TrT*1Y><+&%i&79$14(x<@$VNP3hUuByMuG#g3L z*L384HV%yuu&S$0EwF@^u9%e}(NOK4#6H-+8vm&|fkNIhXqsv5vhEn!DkFM72ajM{j@xbQ_=Q!_Q zuu@?hxq7STzXaI$;7){buH_vHpNG=0kDpL9L(ttQ3>+OgDC5}eF&v%km=Z{MU(n77 zI9}Wkti`G+(vqWL(+`GG0LF{8Bx zXv@il@h|MMUN*mdfE*??l)0oTOcse5I`XUY7TA~Tb2u*`5^}jJ=OYBUqfAw6DmB3h z6;_3p`+wqD7RdEQ!d;B^1&)q{cGlP0IhY67%OvAa`A8oQd64(BmD}Lo~ma?#I-szbJUs+r3p=@sFD9 zUQ*fwzXdq>LSqU%6c-w*Nomkh7q|84*Oa}xebpTF{{{~uWurWl0$W<0kmjzLXIHcQYe;)(nE`m2E?F8PQC`LEccnF4esCYCfB zB?;(m7$iKQm>EJono%TtlsfR((1uo=rxNgVwJnZHI;z`MJOlkVj4UhjOQkHAt-kId5G9ch{JE#?eDIhgn zM#Z7Khi=j;#5!vEvo$R1>!)>`*?q`FLzALtM|m^9RHbL+lX8-|DAV4m)dzaDAo5qV z5~X}jp%RC{W4=h2Jxg7(SqYQNR3~JkW7&~+fdynOmDR1 z4pSKDkw_+NP^P$YG`uQBiF(b5QNJBr=)jqg8Cwk+tG}9W64bru<2S zCy`Mjfkz4}d_ow?G?vP#wODV z8bOa8qllOoRP$q!jciC5)Sqef$@W7bwHDGwoNZqB7CizzT}=z7$};4g+IIt*9I-NWH^o1*J3)-v86%g8!+ zE75T*wl4_h*(_GFx)G^bWJG`Us(ZTtuGZugZ}1J^nsFlWy%2t*emk1}s7Ji$z_zbP z6Zc;zV~TsY68qxlHZX^UDZnHhMV45m!-1xL+qgxC3;2#lr!1$fonkha!fqvdMY~!3 zYJa*|&E7TS~3~2awpxet_s?zL4hx$%|Kznj zvA)0Br?ilARcJwzNoS4BS0=c$zkV9>gq(XuO;vue);iCt`)npEZCAPF)nF3KH`_0m z$6NVcQloo*0|^Y1C9nr@<H}I6*;Hp*2AzMG-#`^jWFn{MG_D)&r8PZDZ^no=(!3? zYlM*Hz+PN6PvwU~9JhVvN>8=Cqp$en6B)PfG$U&jLuhVqlUfB@` zDff`WI>|c0$pQUtED%%`sp=gze1_vpg#QA7oXpYTfyV%Fn;%$dU%)9v$fYAI)BY1C z%z9Ywo6HN=2dOKOox_|+d@q;XIJ!fT_bs94mBcps#2C7DrxrvrqjK?5%7e!ZE4bg% zxIaUy9onAvXDjp9`S2Mp6pA$T$M8rkctODcu1N8pfdO68QG*|4r?wi_cm_l9=#E|N z&*(iB{k@tyP2&VSMgySC`mG9uBPr$;ETvb63j?e^mPejxHMcfL2LcA{JI>fq;{S8lNdbpdHLg^o{d=5$POgFP%Rp!a{U|cwrAFL*U zpO8F1CbC?)$FBD4QxXvIxhYfK=zZ@3YXivyKDujlb2Gc#=`b7r+;H4FH{7I4AD*{hT(XRr8iiy*4fTr z&A;(%xx;Kvn#hwHnze_`UvrqruwfGm)3Cj<#w`wPF)d=f7^!yL8Ys$2nDj`9i=|pi z!e`Q2IKJ}C6!3@xpD?ktxF08(bV>JHW{+Il=#-er?l0EWY>j1$toy#_$X!Wmz21>w zc=x3di?1nZGmB}VoY1ffFv+DheF6^F)4ny5K8|w+tWS%+I*aFyOf-3&tW1iH9b1X2H z6|d?3%~H4n51Tz_Nz5!BZrl19Y)KnPht4vG1cZn-iOW4VC|qZr-}T~cyqWu zT z$rmY+iU+5#_CQmw?+7@YzEhk&9ELXKglFkh8VVgX8SX^~7YN@SVd{KyDh92VWIstH zZ&bF?tfXXF1XPQ~T4t45t{p@V`Tovkf)^PW#|G9~{ruPLbM1d<(qPvek zHp&JsS2#K9G>t)EU9wXn9aWL5hOWDV49e3!-Kdgnsj$e~Hnl{@ivDCB<&`-04)@{d@(amV#Ex+9fLSWk11I?PRt?((2Cx`>s-s+-u z{=N|0fpN145Q4d08rR8P7}pK*3mA_BLH7JN-^P-Fq$}<_yRKVHi6WkTMonZLn60O2X~S7ZtSu%%#PhfbskSUAst;o3 zy1iU-vtm2=C!K(gXtqNkhS(k>ibIPqG-OeVndcbT25a}R%S#xYGWrNQ;_0_-Jg+R; z^mg=dcVN;=?Ov>?8iG&}4ergcL7JQ{)4A${A(`3e!M=ZG&kHR?&PGsM zzTWOmzByGzJ_t2hdeNbO{3pjOvijhfo|05F&XfB+IaU?boeF_tu6b({7}?ToHF{)7WXo}qe27htAkI!pqV`px@3 za{37;iMfiEJV6lySmd*=eAR+5{sU}>HKGgWP6o%HK&s|QhePt#V} zEOJH_4wqr@#nhOsguP7=ieIzGU^`sRC5{r%Pn@kM z?B}kzx-GTHB`5UKYOe?9Iz}ZK0l{6tFVQ+)@OjpZenbz6hGZMG4V6}UW>=lms03j( z`<>-vvy6$Xh(7SJUV(49X#3|2{FuOmTWdG(Nx1^@G=w3qFk$`z_4W*JD_G1d--3Js zfZ+9WM=f8=F2c^sm0JIz$-_&nV(09oIRcjV!dkEkaW)5H&|;kg6J7$#I_+`kWqaOM z`33YK8!4#?9lPdge}X-yInrlznl2Iji`DBn><3HRaP-tG;x|87!miSoEOGW%iz5l* zoW~;lwI)uPJG-LceoKR*lXeK)w_9|I4OY1F$qknLLiDCqKiBuxr??{T(EWhy0m_mf zuMYl8qbuP1_OFyQ#1l(+zDW5}z5MB1$UNty@efls8~MQm2D2p*fi3$f<3gCT5zr0X zyWSp4^x*^B=BBbpa?|CDMXB0AXtPgvU3Kqw6RNg-+A(1UkJWdR>HZ^cY^*-#+NBB% zvxRpdp*co)Yx(PdOAU%9)UJowEF2R!3!OKLxNPCxW{n*$P2*CsN+2$F{>M!0coWBV z)9Bp5&{>wQQfsRwZ+qmapW=bI2GYdcWWd^}=d9|YHz|xXrmL`iUi&%t-rVg%7m2Db z?)oq+GWJ0*jmw>jc|JtQ+>Q!V*^w_gQ20Krtp1J6dj~=;rtp>%a zG}{G*Z2c?^%kN8gAPn#b$PH1mfZLIANuuPNux8OvGG!*$tAmv(2ql#N?z}I1YgiVfM!1E#z}+MBnl{sOH;N~eZG+Y{2{69(O$PJy@$xu_TiX)pp-bs5b{L;L9S zp+z_M^DSBORNJsye0O-xz)6Z?q()tdhJB9tOv!2MSp+}u;{1(TDD9U(4qEuyvQ2^b zCp5cjG;GnU{i!AQmg*&S63^XC53|Xwvl4pOU0>EYeLS+g3pBYa2!E|3ordB!YTH@6 zYL{&cYmg0^k8*8Xe*#1NGEMjGbsMO6z*r3`8A4!aWmmeo$KKAF`=!F5Wx;gW`;dj> z1X^V%VRh#EB6C-*#h<~|gU=`90csSkZm=7^;JT&Zs>pwfL)Q^JPt&eg+c{ zgOxchPpKQc}0QcOyfW8%+n6u{1V$KgS7@9XWwJwHK z0N59>Yj_7WJY)+eV5=JHxP_=O=r?|AI4Nir(Y+Rx@R?HhX7&Ah=gsXJu;EAhflrcq zmrHIZ`P1*5ZCZ6LJEsfD( zzq~qFT+NVYY$2W-KfUq#6+Q|p{`lpz=5S>9$5m=J@mi4kd1>K?(DuHTS0$nYPYM|a z_NvGiXRa>y;VOT?Z4N)le#aHcg!jfdkf8kK&l2rB;s+mhYs=`=_a=Sc5Z<8`tI=5-d*Pjo`t$C zPxq(1U~0Kl|I+gJb?>)99L@(=Ej~g~WXfouJFnbRMEC8dK>bfRXFi&V+$- zMt?`_@dLM2?@Pt{q4ez?{tk|rNx-;hX|QD+jl4xsPbe9xjDhJe|kFyacNItfStm&?Z3*8U+h;t@$X`tl%rZa`_fgb zEL>yIW0e=m{m8}*hb6i)sKZGwZqHqLoB<4V6+Ue1Qss zQNZ3}UlbaQU*Ga%3HTji)6fC3-QGi%I~pA(*HWbARmdBfOQ~>MB@vpfAX@%bz*(mn z{-CNCvRF9nTTY~L+$aLyQO0GZ(!-^+fX{l?w`N?~8Mb~xo0M8%ZRmMU(~=xrq?}0X z*xDHdZkQUxB~O3)k=wgT47dV0a*ec?Xy&%5)V(YBFob(l8*eeGEk{51mMe>7(q!^` zRJB+yUcL2Nc=HV$B28Y(cBmMn`PKEh(xcrOm?J4c;MmSbxxO~as)k=+Q66IVU5v@y zs)5(xbGT@zCSZb98q!tS@n9j&@^giY%K_3_YYh!+;DzH>-8(AMLd8tGmTPALe%GCd z2yziIrA%S-7NMqGZT6OaxK*-wa1QNyKE)M{$pE?91WnkSfgCG0>6EkL;tJ%J79xp+ zsE&=W9huz^{Xi?A3x&M1n3;KxKF^iI+w2+@kYLGfjUPDb;*Ox^?dfTMtYdT6{9F=? zQ7noPTf)IiN!p1Ys@D+fbGVr?^%0#sB}NL>k(iXvx|x7M=Riq7xr_9nA_}mBc$uZz zaAI1|q4;*HAY9nd0gl?`Nu2fv`2h}AfEJ&@#D-E-t;a4)iLFrgDZg=_!bus726?^A zUJaLXy#ows-x(cLEKdWQ8Q*aSkK)s4vS}f$`-iiYk~7gzp;Rk~^;$v0e(zBXG-J|X zeX{7ulji-xBBkskhqn8rZT@4p=Bj>C-qoVs0--nY{E

ExvwI8}T4qxfQj!_Q;x64B6#%AW|(vSUl(>`55G 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 literal 0 HcmV?d00001 From 31dfc745e5d911cd3ec43f113450b881f22a29fc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:18:02 +0100 Subject: [PATCH 25/58] chore(deps): lock file maintenance (#6070) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 6772 ++++++++++++++++++++++++++------------------- 1 file changed, 3938 insertions(+), 2834 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4b4ab68169..766d7267bd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -97,19 +97,6 @@ "dev": true, "license": "MIT" }, - "api/node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, "bundler-tests/browser/webpack": { "name": "@opentelemetry/webpack-bundle-test", "version": "0.207.0", @@ -308,25 +295,6 @@ "webpack": ">=2" } }, - "examples/opentelemetry-web/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "examples/opentelemetry-web/node_modules/webpack-cli": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", @@ -455,6 +423,13 @@ "ts-node": "^10.9.1" } }, + "experimental/examples/logs/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/examples/opencensus-shim": { "version": "0.207.0", "license": "Apache-2.0", @@ -553,6 +528,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/exporter-logs-otlp-grpc/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/exporter-logs-otlp-http": { "name": "@opentelemetry/exporter-logs-otlp-http", "version": "0.207.0", @@ -596,6 +578,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/exporter-logs-otlp-http/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/exporter-logs-otlp-proto": { "name": "@opentelemetry/exporter-logs-otlp-proto", "version": "0.207.0", @@ -638,6 +627,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/exporter-logs-otlp-proto/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/exporter-trace-otlp-grpc": { "name": "@opentelemetry/exporter-trace-otlp-grpc", "version": "0.207.0", @@ -670,6 +666,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/exporter-trace-otlp-grpc/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/exporter-trace-otlp-http": { "name": "@opentelemetry/exporter-trace-otlp-http", "version": "0.207.0", @@ -712,6 +715,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/exporter-trace-otlp-http/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/exporter-trace-otlp-proto": { "name": "@opentelemetry/exporter-trace-otlp-proto", "version": "0.207.0", @@ -752,6 +762,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/exporter-trace-otlp-proto/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-browser-detector": { "name": "@opentelemetry/opentelemetry-browser-detector", "version": "0.207.0", @@ -788,6 +805,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-browser-detector/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-configuration": { "name": "@opentelemetry/configuration", "version": "0.207.0", @@ -814,6 +838,13 @@ "@opentelemetry/api": "^1.9.0" } }, + "experimental/packages/opentelemetry-configuration/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc": { "name": "@opentelemetry/exporter-metrics-otlp-grpc", "version": "0.207.0", @@ -847,6 +878,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-exporter-metrics-otlp-http": { "name": "@opentelemetry/exporter-metrics-otlp-http", "version": "0.207.0", @@ -889,6 +927,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-exporter-metrics-otlp-http/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-exporter-metrics-otlp-proto": { "name": "@opentelemetry/exporter-metrics-otlp-proto", "version": "0.207.0", @@ -932,6 +977,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-exporter-metrics-otlp-proto/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-exporter-prometheus": { "name": "@opentelemetry/exporter-prometheus", "version": "0.207.0", @@ -959,6 +1011,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-exporter-prometheus/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-instrumentation": { "name": "@opentelemetry/instrumentation", "version": "0.207.0", @@ -1046,6 +1105,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-instrumentation-fetch/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-instrumentation-grpc": { "name": "@opentelemetry/instrumentation-grpc", "version": "0.207.0", @@ -1081,6 +1147,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-instrumentation-grpc/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-instrumentation-http": { "name": "@opentelemetry/instrumentation-http", "version": "0.207.0", @@ -1117,6 +1190,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-instrumentation-http/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-instrumentation-xml-http-request": { "name": "@opentelemetry/instrumentation-xml-http-request", "version": "0.207.0", @@ -1161,6 +1241,20 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/opentelemetry-instrumentation-xml-http-request/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, + "experimental/packages/opentelemetry-instrumentation/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/opentelemetry-sdk-node": { "name": "@opentelemetry/sdk-node", "version": "0.207.0", @@ -1209,6 +1303,13 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, + "experimental/packages/opentelemetry-sdk-node/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/otlp-exporter-base": { "name": "@opentelemetry/otlp-exporter-base", "version": "0.207.0", @@ -1246,6 +1347,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/otlp-exporter-base/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/otlp-grpc-exporter-base": { "name": "@opentelemetry/otlp-grpc-exporter-base", "version": "0.207.0", @@ -1276,6 +1384,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/otlp-grpc-exporter-base/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/otlp-transformer": { "name": "@opentelemetry/otlp-transformer", "version": "0.207.0", @@ -1336,40 +1451,12 @@ "@opentelemetry/api": "^1.3.0" } }, - "experimental/packages/sampler-composite/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": { - "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" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "experimental/packages/sampler-composite/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "experimental/packages/sampler-composite/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } + "license": "MIT" }, "experimental/packages/sampler-composite/node_modules/glob": { "version": "10.4.5", @@ -1392,6 +1479,22 @@ "url": "https://github.com/sponsors/isaacs" } }, + "experimental/packages/sampler-composite/node_modules/glob/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "experimental/packages/sampler-composite/node_modules/mocha": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.1.0.tgz", @@ -1428,26 +1531,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "experimental/packages/sampler-composite/node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "experimental/packages/sampler-composite/node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true, - "license": "Apache-2.0" - }, "experimental/packages/sampler-jaeger-remote": { "name": "@opentelemetry/sampler-jaeger-remote", "version": "0.207.0", @@ -1476,6 +1559,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/sampler-jaeger-remote/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/sdk-logs": { "name": "@opentelemetry/sdk-logs", "version": "0.207.0", @@ -1514,15 +1604,12 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, - "experimental/packages/sdk-logs/node_modules/@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "experimental/packages/sdk-logs/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } + "license": "MIT" }, "experimental/packages/shim-opencensus": { "name": "@opentelemetry/shim-opencensus", @@ -1555,6 +1642,13 @@ "@opentelemetry/api": "^1.3.0" } }, + "experimental/packages/shim-opencensus/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "experimental/packages/web-common": { "name": "@opentelemetry/web-common", "version": "0.207.0", @@ -1595,6 +1689,13 @@ "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, + "experimental/packages/web-common/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "integration-tests/api": { "name": "@opentelemetry/integration-tests-api", "version": "2.6.0", @@ -1611,11 +1712,18 @@ "node": "^18.19.0 || >=20.6.0" } }, - "integration-tests/propagation-validation-server": { - "version": "2.6.0", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0", + "integration-tests/api/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, + "integration-tests/propagation-validation-server": { + "version": "2.6.0", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0", "@opentelemetry/context-async-hooks": "2.2.0", "@opentelemetry/core": "2.2.0", "@opentelemetry/sdk-trace-base": "2.2.0", @@ -1680,9 +1788,9 @@ } }, "node_modules/@babel/compat-data": { - "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==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", "dev": true, "license": "MIT", "engines": { @@ -1731,14 +1839,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -1788,18 +1896,18 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz", - "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.3", + "@babel/traverse": "^7.28.5", "semver": "^6.3.1" }, "engines": { @@ -1820,14 +1928,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "regexpu-core": "^6.2.0", + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "engines": { @@ -1875,14 +1983,14 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2004,9 +2112,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { @@ -2053,13 +2161,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", - "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.4" + "@babel/types": "^7.28.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -2069,14 +2177,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2283,9 +2391,9 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz", - "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", "dev": true, "license": "MIT", "dependencies": { @@ -2371,14 +2479,14 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.0" + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2454,9 +2562,9 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", "dev": true, "license": "MIT", "dependencies": { @@ -2553,9 +2661,9 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", "dev": true, "license": "MIT", "dependencies": { @@ -2619,16 +2727,16 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -2773,9 +2881,9 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3178,18 +3286,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", - "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", + "@babel/generator": "^7.28.5", "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", + "@babel/parser": "^7.28.5", "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", + "@babel/types": "^7.28.5", "debug": "^4.3.1" }, "engines": { @@ -3197,14 +3305,14 @@ } }, "node_modules/@babel/types": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", - "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" }, "engines": { "node": ">=6.9.0" @@ -3430,9 +3538,9 @@ } }, "node_modules/@emnapi/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.5.0.tgz", - "integrity": "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.0.tgz", + "integrity": "sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==", "dev": true, "license": "MIT", "dependencies": { @@ -3441,9 +3549,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.5.0.tgz", - "integrity": "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.0.tgz", + "integrity": "sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3480,9 +3588,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -3692,733 +3800,349 @@ } }, "node_modules/@inquirer/ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.0.tgz", - "integrity": "sha512-JWaTfCxI1eTmJ1BIv86vUfjVatOdxwD0DAVKYevY8SazeUUZtW+tNbsdejVO1GYE0GXJW1N1ahmiC3TFd+7wZA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.1.tgz", + "integrity": "sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==", "dev": true, "license": "MIT", "engines": { "node": ">=18" } }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.4.tgz", - "integrity": "sha512-2n9Vgf4HSciFq8ttKXk+qy+GsyTXPV1An6QAwe/8bkbbqvG4VW1I/ZY1pNu2rf+h9bdzMLPbRSfcNxkHBy/Ydw==", + "node_modules/@inquirer/figures": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.14.tgz", + "integrity": "sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==", "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/confirm": { - "version": "5.1.18", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.18.tgz", - "integrity": "sha512-MilmWOzHa3Ks11tzvuAmFoAd/wRuaP3SwlT1IZhyMke31FKLxPiuDWcGXhU+PKveNOpAc4axzAgrgxuIJJRmLw==", + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": "20 || >=22" } }, - "node_modules/@inquirer/core": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.2.tgz", - "integrity": "sha512-yXq/4QUnk4sHMtmbd7irwiepjB8jXU0kkFRL4nr/aDBA2mDz13cMakEWdDwX3eSCTkk03kwcndD1zfRAIlELxA==", + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "@isaacs/balanced-match": "^4.0.1" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": "20 || >=22" } }, - "node_modules/@inquirer/core/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/@inquirer/core/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/@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": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "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/@inquirer/core/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/@isaacs/cliui/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", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@inquirer/editor": { - "version": "4.2.20", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.20.tgz", - "integrity": "sha512-7omh5y5bK672Q+Brk4HBbnHNowOZwrb/78IFXdrEB9PfdxL3GudQyDk8O9vQ188wj3xrEebS2M9n18BjJoI83g==", + "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": { - "@inquirer/core": "^10.2.2", - "@inquirer/external-editor": "^1.0.2", - "@inquirer/type": "^3.0.8" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "node": ">=12" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@inquirer/expand": { - "version": "4.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.20.tgz", - "integrity": "sha512-Dt9S+6qUg94fEvgn54F2Syf0Z3U8xmnBI9ATq2f5h9xt09fs2IJXSCIXyyVHwvggKWFXEY/7jATRo2K6Dkn6Ow==", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "minipass": "^7.0.4" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", - "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "dev": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.7.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@inquirer/external-editor/node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "sprintf-js": "~1.0.2" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "node_modules/@inquirer/input": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.4.tgz", - "integrity": "sha512-cwSGpLBMwpwcZZsc6s1gThm0J+it/KIJ+1qFL2euLmSKUMGumJ5TcbMgxEjMjNHRGadouIYbiIgruKoDZk7klw==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@inquirer/number": { - "version": "3.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.20.tgz", - "integrity": "sha512-bbooay64VD1Z6uMfNehED2A2YOPHSJnQLs9/4WNiV/EK+vXczf/R988itL2XLDGTgmhMF2KkiWZo+iEZmc4jqg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@inquirer/password": { - "version": "4.0.20", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.20.tgz", - "integrity": "sha512-nxSaPV2cPvvoOmRygQR+h0B+Av73B01cqYLcr7NXcGXhbmsYfUb8fDdw2Us1bI2YsX+VvY7I7upgFYsyf8+Nug==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8" + "p-try": "^2.0.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "node": ">=6" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@inquirer/prompts": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.6.tgz", - "integrity": "sha512-68JhkiojicX9SBUD8FE/pSKbOKtwoyaVj1kwqLfvjlVXZvOy3iaSWX4dCLsZyYx/5Ur07Fq+yuDNOen+5ce6ig==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/checkbox": "^4.2.4", - "@inquirer/confirm": "^5.1.18", - "@inquirer/editor": "^4.2.20", - "@inquirer/expand": "^4.0.20", - "@inquirer/input": "^4.2.4", - "@inquirer/number": "^3.0.20", - "@inquirer/password": "^4.0.20", - "@inquirer/rawlist": "^4.1.8", - "@inquirer/search": "^3.1.3", - "@inquirer/select": "^4.3.4" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.8.tgz", - "integrity": "sha512-CQ2VkIASbgI2PxdzlkeeieLRmniaUU1Aoi5ggEdm6BIyqopE9GuDXdDOj9XiwOqK5qm72oI2i6J+Gnjaa26ejg==", + "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", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@inquirer/search": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.3.tgz", - "integrity": "sha512-D5T6ioybJJH0IiSUK/JXcoRrrm8sXwzrVMjibuPs+AgxmogKslaafy1oxFiorNI4s3ElSkeQZbhYQgLqiL8h6Q==", + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@inquirer/select": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.4.tgz", - "integrity": "sha512-Qp20nySRmfbuJBBsgPU7E/cL62Hf250vMZRzYDcBHty2zdD1kKCnoDFWRr0WO2ZzaXp3R7a4esaVGJUx0E6zvA==", + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@sinclair/typebox": "^0.34.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", + "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", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=6.0.0" } }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "dev": true, "license": "MIT", "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "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==", + "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": "ISC", + "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==", + "dev": true, + "license": "MIT", "dependencies": { - "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": ">=12" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@isaacs/cliui/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, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "license": "MIT", - "engines": { - "node": ">=12" - }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "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==", + "node_modules/@jsdoc/salty": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", + "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^6.0.1" + "lodash": "^4.17.21" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=v12.0.0" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, + "license": "Apache-2.0", "engines": { - "node": ">=18.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "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": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@jsdoc/salty": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", - "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v12.0.0" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/buffers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", - "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "node_modules/@jsonjoy.com/buffers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4450,19 +4174,20 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz", - "integrity": "sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { "node": ">=10.0" @@ -4603,1163 +4328,1158 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/@lerna/create/node_modules/@nx/nx-darwin-arm64": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.6.3.tgz", - "integrity": "sha512-y/Wuo+FEky/ehah5UyERpQpUOm+KOc437zRwUrMGumNUFk73DaHVMmqABCZ1J5eqam60XgRZhq05qpRn+8dhtA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-darwin-x64": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.6.3.tgz", - "integrity": "sha512-+9rogeP6EmlMBcUwflfOmFbQOWgAnJdupeJJuSenzWJCn/bE1C2iIGhuq4u4zajo2VceyN7uirlAWc8cQWCevw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-freebsd-x64": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.6.3.tgz", - "integrity": "sha512-jrewLpv/J84ze+sC+P0x1INVuXTWqU4qdZIPe0ItrRMDMmxiHdhm6LtHEEo5JYezqM/LgB87yjFE49Qsudtadw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.6.3.tgz", - "integrity": "sha512-VyMIKSp1N2ulA2wkAKIH+9a8k4tl67bH2wnvYROTRnfFykeczodfOxWeCAggS//1ccBM05pRxBklMt7fgAqV8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.6.3.tgz", - "integrity": "sha512-l6/YZp5MJ5TYWbHoaR31lsqd4Ia2AnaGSACeNCUAsUsUNaa099nwmvFaKQEJxUX1aMpe4kHLyVbomK7ydEX+pg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.6.3.tgz", - "integrity": "sha512-klidxt4eiSxgLa1LW7YUHstm3qsptz+XD1+3w0ofX1rkdVkK1afrfcolzoeZ5nc4Av7MzZB0g0PoFTGHUIBkrw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.6.3.tgz", - "integrity": "sha512-B5ZvolVUIKKmacbZw1XD2nBIbebE2T6vBbMYq6kZP7PfSsfO5Y0HaWIsK8ulwCj35TPaEn9x/XbHJp5RakU7Ng==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.6.3.tgz", - "integrity": "sha512-11L6SigPvjnIFbr4ivXlcH0fOPs55SvT8gkg2TOsSohKFY/Ze4O43NuoZe/7dilLjNgq8aWTbnbSuRK/kFGdBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.6.3.tgz", - "integrity": "sha512-hC84RvGp5YxGhQLitHcg3cohTy7sdsvIRIErq3EsJNlHIaUTZJAegno26sRpRE4Y/5G5RWqfzDCCERg9c3Askw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lerna/create/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.6.3.tgz", - "integrity": "sha512-vcnVwrTsOVdN6ovKO6qFDHXYRa+lxKFLRGCUHvJvjTOddT1/xJqkL8NE4i1YDWZiCQCck0BizR3Kvs+N0DqHoQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@lerna/create/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==", + "node_modules/@lerna/create/node_modules/@inquirer/checkbox": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", + "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "node_modules/@lerna/create/node_modules/@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/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/@lerna/create/node_modules/get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "node_modules/@lerna/create/node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "node_modules/@lerna/create/node_modules/@inquirer/core/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": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@lerna/create/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==", + "node_modules/@lerna/create/node_modules/@inquirer/editor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": ">=10.13.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/glob/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==", + "node_modules/@lerna/create/node_modules/@inquirer/expand": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", + "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/glob/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "node_modules/@lerna/create/node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@lerna/create/node_modules/@inquirer/input": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", + "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, "engines": { - "node": ">= 4" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@lerna/create/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/@lerna/create/node_modules/@inquirer/number": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", + "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "node_modules/@lerna/create/node_modules/@inquirer/password": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", + "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": "*" - } - }, - "node_modules/@lerna/create/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/nx": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.6.3.tgz", - "integrity": "sha512-CD/R7JV9OWy1UNsm6BOAMvH7m7EpqDKVHbBjoR8wmxYaTKkOQ9lPpi5yYIyRPpONK/uHCqYyeKa2cM3zP6euqw==", + "node_modules/@lerna/create/node_modules/@inquirer/prompts": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.9.0.tgz", + "integrity": "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==", "dev": true, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "@napi-rs/wasm-runtime": "0.2.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "3.0.2", - "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^8.0.1", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "enquirer": "~2.3.6", - "figures": "3.2.0", - "flat": "^5.0.2", - "front-matter": "^4.0.2", - "ignore": "^5.0.4", - "jest-diff": "^30.0.2", - "jsonc-parser": "3.2.0", - "lines-and-columns": "2.0.3", - "minimatch": "9.0.3", - "node-machine-id": "1.1.12", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "ora": "5.3.0", - "resolve.exports": "2.0.3", - "semver": "^7.5.3", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tree-kill": "^1.2.2", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "yaml": "^2.6.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js", - "nx-cloud": "bin/nx-cloud.js" + "@inquirer/checkbox": "^4.3.0", + "@inquirer/confirm": "^5.1.19", + "@inquirer/editor": "^4.2.21", + "@inquirer/expand": "^4.0.21", + "@inquirer/input": "^4.2.5", + "@inquirer/number": "^3.0.21", + "@inquirer/password": "^4.0.21", + "@inquirer/rawlist": "^4.1.9", + "@inquirer/search": "^3.2.0", + "@inquirer/select": "^4.4.0" }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.6.3", - "@nx/nx-darwin-x64": "21.6.3", - "@nx/nx-freebsd-x64": "21.6.3", - "@nx/nx-linux-arm-gnueabihf": "21.6.3", - "@nx/nx-linux-arm64-gnu": "21.6.3", - "@nx/nx-linux-arm64-musl": "21.6.3", - "@nx/nx-linux-x64-gnu": "21.6.3", - "@nx/nx-linux-x64-musl": "21.6.3", - "@nx/nx-win32-arm64-msvc": "21.6.3", - "@nx/nx-win32-x64-msvc": "21.6.3" + "engines": { + "node": ">=18" }, "peerDependencies": { - "@swc-node/register": "^1.8.0", - "@swc/core": "^1.3.85" + "@types/node": ">=18" }, "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { + "@types/node": { "optional": true } } }, - "node_modules/@lerna/create/node_modules/nx/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==", + "node_modules/@lerna/create/node_modules/@inquirer/rawlist": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", + "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@lerna/create/node_modules/nx/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/ora": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", - "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "node_modules/@lerna/create/node_modules/@inquirer/search": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", + "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", "dev": true, "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "log-symbols": "^4.0.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "node_modules/@lerna/create/node_modules/@inquirer/select": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", + "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=14" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@lerna/create/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "peerDependencies": { + "@types/node": ">=18" }, - "engines": { - "node": ">=10" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@lerna/create/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/@lerna/create/node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@lerna/create/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/@lerna/create/node_modules/@nx/nx-darwin-arm64": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.6.8.tgz", + "integrity": "sha512-MG5bhSYhG49r+e0mLuztQVHz1sEy7cs8BvZJ56mm7JNQ1VfbaTyLAR7VcNw8O/1mJA8jYcg9fmxOIZOUnY1cEQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@lerna/create/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "node_modules/@lerna/create/node_modules/@nx/nx-darwin-x64": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.6.8.tgz", + "integrity": "sha512-e9oXVTd6U6RFEc3k22PGoe5OSy40fyyytl+svSJQmK+5rxZalvAUna/mXtFcQC9m6No2daqqpfAZlyN5nG6WHw==", + "cpu": [ + "x64" + ], "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lerna/create/node_modules/@nx/nx-freebsd-x64": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.6.8.tgz", + "integrity": "sha512-gK3rsTXQj0hHCyaAvZmPZeCPkb3jzesgtkXuZf+7pCm5b4wiEA1i22ufp1UzwaTmWgbub/6NVMEDOGsVcay8mA==", + "cpu": [ + "x64" ], + "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@mswjs/interceptors": { - "version": "0.37.6", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", - "integrity": "sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==", + "node_modules/@lerna/create/node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.6.8.tgz", + "integrity": "sha512-TXt3HTFhM4kuL9larxBuo3XpSngoA1JCtHavfYLRC3A8knACi7LwNQwnF5RWAcYgKMVE3/8IAhV8LuemXrPKKw==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.4.3", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "node_modules/@lerna/create/node_modules/@nx/nx-linux-arm64-gnu": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.6.8.tgz", + "integrity": "sha512-QwZREYIhqhDVEIf+KAv2VFipxMUoULXXS3qyLX3/q/4u8Y32fyM5wd+FXpv89cRCiveVsZp8io2W178R6lfKng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lerna/create/node_modules/@nx/nx-linux-arm64-musl": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.6.8.tgz", + "integrity": "sha512-UZJyrZ6utU8g1W7E31iHDhWj1SjMidmDNyrVP4xK6IUrotx6qGrwfwWqzqvphhc1cA7w4Zz9N/rCCPQkdHzjLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lerna/create/node_modules/@nx/nx-linux-x64-gnu": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.6.8.tgz", + "integrity": "sha512-HXINTg4P0/Yj76vsvqBAb7MNlLpkH1pl9JF2blXScOFXWzNoStd7b6xyrpCROdmi0Hk8y3UEwc8OIyLFIfixJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lerna/create/node_modules/@nx/nx-linux-x64-musl": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.6.8.tgz", + "integrity": "sha512-2YbXLhuSlElCtQTR1Ib94O3T4fX9uzSIkUMYGL3n04agG0HemXoxJa91TWwwOUMbEZffkhcPsJBOh2S5l47s9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lerna/create/node_modules/@nx/nx-win32-arm64-msvc": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.6.8.tgz", + "integrity": "sha512-/VSGtqa1oGHo5n24R39ZuGxMrGyf7pxFuCtL5hAzBHdTxFg/VZomPGd7BeV5VN5SbIw+fie+nTGkC5q3TOPGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lerna/create/node_modules/@nx/nx-win32-x64-msvc": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.6.8.tgz", + "integrity": "sha512-xeBL7PcDqHH/Zw4d2A2qP7eLImzzcMO3hiKs5G42Wi92ACejAdUqpIduTL4RpArsXIHm5VEbE4KvHNii1mMU1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lerna/create/node_modules/@types/node": { + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "undici-types": "~7.16.0" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@lerna/create/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", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "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/@lerna/create/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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/@lerna/create/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", - "engines": { - "node": ">= 8" - } + "license": "MIT" }, - "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/@lerna/create/node_modules/get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, "engines": { - "node": ">= 8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@npmcli/agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", - "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", + "node_modules/@lerna/create/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", "dev": true, "license": "ISC", "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^11.2.1", - "socks-proxy-agent": "^8.0.3" + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/agent/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "node_modules/@lerna/create/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": "20 || >=22" + "node": ">=10.13.0" } }, - "node_modules/@npmcli/arborist": { - "version": "9.1.4", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.1.4.tgz", - "integrity": "sha512-2Co31oEFlzT9hYjGahGL4PqDXXpA18tX9yu55j5on+m2uDiyBoljQjHNnnNVCji4pFUjawlHi23tQ4j2A5gHow==", + "node_modules/@lerna/create/node_modules/glob/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": "ISC", + "license": "MIT", "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^4.0.0", - "@npmcli/installed-package-contents": "^3.0.0", - "@npmcli/map-workspaces": "^4.0.1", - "@npmcli/metavuln-calculator": "^9.0.0", - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.1", - "@npmcli/query": "^4.0.0", - "@npmcli/redact": "^3.0.0", - "@npmcli/run-script": "^9.0.1", - "bin-links": "^5.0.0", - "cacache": "^19.0.1", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^8.0.0", - "json-stringify-nice": "^1.1.4", - "lru-cache": "^10.2.2", - "minimatch": "^9.0.4", - "nopt": "^8.0.0", - "npm-install-checks": "^7.1.0", - "npm-package-arg": "^12.0.0", - "npm-pick-manifest": "^10.0.0", - "npm-registry-fetch": "^18.0.1", - "pacote": "^21.0.0", - "parse-conflict-json": "^4.0.0", - "proc-log": "^5.0.0", - "proggy": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^4.0.0", - "semver": "^7.3.7", - "ssri": "^12.0.0", - "treeverse": "^3.0.0", - "walk-up-path": "^4.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "balanced-match": "^1.0.0" } }, - "node_modules/@npmcli/arborist/node_modules/@npmcli/agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", - "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", + "node_modules/@lerna/create/node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", "dev": true, "license": "ISC", "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/arborist/node_modules/@npmcli/package-json": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", - "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "node_modules/@lerna/create/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@npmcli/arborist/node_modules/@npmcli/run-script": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", - "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", + "node_modules/@lerna/create/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^6.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", - "proc-log": "^5.0.0", - "which": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 4" } }, - "node_modules/@npmcli/arborist/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==", + "node_modules/@lerna/create/node_modules/inquirer": { + "version": "12.9.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.6.tgz", + "integrity": "sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "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" + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/prompts": "^7.8.6", + "@inquirer/type": "^3.0.8", + "mute-stream": "^2.0.0", + "run-async": "^4.0.5", + "rxjs": "^7.8.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@npmcli/arborist/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/@lerna/create/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } + "license": "MIT" }, - "node_modules/@npmcli/arborist/node_modules/json-parse-even-better-errors": { + "node_modules/@lerna/create/node_modules/make-dir": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "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", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/arborist/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/@npmcli/arborist/node_modules/make-fetch-happen": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", - "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", - "dev": true, - "license": "ISC", "dependencies": { - "@npmcli/agent": "^3.0.0", - "cacache": "^19.0.1", - "http-cache-semantics": "^4.1.1", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^1.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "ssri": "^12.0.0" + "semver": "^7.5.3" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", - "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", + "node_modules/@lerna/create/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "license": "ISC", "dependencies": { - "hosted-git-info": "^8.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^6.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "*" } }, - "node_modules/@npmcli/arborist/node_modules/npm-registry-fetch": { - "version": "18.0.2", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", - "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", + "node_modules/@lerna/create/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", "dev": true, "license": "ISC", - "dependencies": { - "@npmcli/redact": "^3.0.0", - "jsonparse": "^1.3.1", - "make-fetch-happen": "^14.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^4.0.0", - "minizlib": "^3.0.1", - "npm-package-arg": "^12.0.0", - "proc-log": "^5.0.0" - }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=8" } }, - "node_modules/@npmcli/arborist/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "node_modules/@lerna/create/node_modules/nx": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.6.8.tgz", + "integrity": "sha512-NilGEk1Cngs3Se9JW+f9cDeN6RBvmABhpEtgMvOK8RAAZszq6B380oCzKcQljhnrbQ6+v6j/Vb7hBPTCvXb0Ng==", "dev": true, - "license": "ISC", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "isexe": "^3.1.1" + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.12.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^30.0.2", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "resolve.exports": "2.0.3", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tree-kill": "^1.2.2", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yaml": "^2.6.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" }, "bin": { - "node-which": "bin/which.js" + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "optionalDependencies": { + "@nx/nx-darwin-arm64": "21.6.8", + "@nx/nx-darwin-x64": "21.6.8", + "@nx/nx-freebsd-x64": "21.6.8", + "@nx/nx-linux-arm-gnueabihf": "21.6.8", + "@nx/nx-linux-arm64-gnu": "21.6.8", + "@nx/nx-linux-arm64-musl": "21.6.8", + "@nx/nx-linux-x64-gnu": "21.6.8", + "@nx/nx-linux-x64-musl": "21.6.8", + "@nx/nx-win32-arm64-msvc": "21.6.8", + "@nx/nx-win32-x64-msvc": "21.6.8" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } } }, - "node_modules/@npmcli/fs": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", - "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", + "node_modules/@lerna/create/node_modules/nx/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": "ISC", + "license": "MIT", "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" + "balanced-match": "^1.0.0" } }, - "node_modules/@npmcli/git": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", - "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", + "node_modules/@lerna/create/node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/promise-spawn": "^8.0.0", - "ini": "^5.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^10.0.0", - "proc-log": "^5.0.0", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^5.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@npmcli/git/node_modules/ini": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", - "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/git/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/@lerna/create/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, "engines": { - "node": ">=16" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@npmcli/git/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/@npmcli/git/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "node_modules/@lerna/create/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^3.1.1" + "glob": "^9.2.0" }, "bin": { - "node-which": "bin/which.js" + "rimraf": "dist/cjs/src/bin.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", - "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", + "node_modules/@lerna/create/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", - "dependencies": { - "npm-bundled": "^4.0.0", - "npm-normalize-package-bin": "^4.0.0" - }, "bin": { - "installed-package-contents": "bin/index.js" + "semver": "bin/semver.js" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=10" } }, - "node_modules/@npmcli/map-workspaces": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz", - "integrity": "sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q==", + "node_modules/@lerna/create/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", + "license": "ISC" + }, + "node_modules/@lerna/create/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": { - "@npmcli/name-from-folder": "^3.0.0", - "@npmcli/package-json": "^6.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=8" } }, - "node_modules/@npmcli/map-workspaces/node_modules/@npmcli/package-json": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", - "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", + "node_modules/@lerna/create/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": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^8.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" + "has-flag": "^4.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=8" } }, - "node_modules/@npmcli/map-workspaces/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==", + "node_modules/@lerna/create/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", "dev": true, - "license": "ISC", - "dependencies": { - "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" - }, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "uuid": "dist/esm/bin/uuid" } }, - "node_modules/@npmcli/map-workspaces/node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "node_modules/@lerna/create/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==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=8" } }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.2.tgz", - "integrity": "sha512-eESzlCRLuD30qYefT2jYZTUepgu9DNJQdXABGGxjkir055x2UtnpNfDZCA6OJxButQNgxNKc9AeTchYxSgbMCw==", + "node_modules/@mswjs/interceptors": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", + "integrity": "sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "cacache": "^20.0.0", - "json-parse-even-better-errors": "^4.0.0", - "pacote": "^21.0.0", - "proc-log": "^5.0.0", - "semver": "^7.3.5" + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": ">=18" } }, - "node_modules/@npmcli/metavuln-calculator/node_modules/cacache": { - "version": "20.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.1.tgz", - "integrity": "sha512-+7LYcYGBYoNqTp1Rv7Ny1YjUo5E0/ftkQtraH3vkfAGgVHc+ouWdC8okAwQgQR7EVIdW6JTzTmhKFwzb+4okAQ==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^11.0.3", - "lru-cache": "^11.1.0", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "unique-filename": "^4.0.0" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" } }, - "node_modules/@npmcli/metavuln-calculator/node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", "dev": true, "license": "MIT", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@npmcli/metavuln-calculator/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "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": "ISC", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": "20 || >=22" + "node": ">= 8" } }, - "node_modules/@npmcli/metavuln-calculator/node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/@npmcli/name-from-folder": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz", - "integrity": "sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA==", + "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": "ISC", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 8" } }, - "node_modules/@npmcli/node-gyp": { + "node_modules/@npmcli/agent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.0.tgz", + "integrity": "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==", "dev": true, "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/package-json": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.0.tgz", - "integrity": "sha512-wy5os0g17akBCVScLyDsDFFf4qC/MmUgIGAFw2pmBGJ/yAQfFbTR9gEaofy4HGm9Jf2MQBnKZICfNds2h3WpEg==", + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, "license": "ISC", - "dependencies": { - "@npmcli/git": "^6.0.0", - "glob": "^11.0.3", - "hosted-git-info": "^9.0.0", - "json-parse-even-better-errors": "^4.0.0", - "proc-log": "^5.0.0", - "semver": "^7.5.3", - "validate-npm-package-license": "^3.0.4" - }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "20 || >=22" } }, - "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", - "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "node_modules/@npmcli/arborist": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-9.1.4.tgz", + "integrity": "sha512-2Co31oEFlzT9hYjGahGL4PqDXXpA18tX9yu55j5on+m2uDiyBoljQjHNnnNVCji4pFUjawlHi23tQ4j2A5gHow==", "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^11.1.0" + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^4.0.0", + "@npmcli/installed-package-contents": "^3.0.0", + "@npmcli/map-workspaces": "^4.0.1", + "@npmcli/metavuln-calculator": "^9.0.0", + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.1", + "@npmcli/query": "^4.0.0", + "@npmcli/redact": "^3.0.0", + "@npmcli/run-script": "^9.0.1", + "bin-links": "^5.0.0", + "cacache": "^19.0.1", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^8.0.0", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^8.0.0", + "npm-install-checks": "^7.1.0", + "npm-package-arg": "^12.0.0", + "npm-pick-manifest": "^10.0.0", + "npm-registry-fetch": "^18.0.1", + "pacote": "^21.0.0", + "parse-conflict-json": "^4.0.0", + "proc-log": "^5.0.0", + "proggy": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^4.0.0", + "semver": "^7.3.7", + "ssri": "^12.0.0", + "treeverse": "^3.0.0", + "walk-up-path": "^4.0.0" + }, + "bin": { + "arborist": "bin/index.js" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", - "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "node_modules/@npmcli/arborist/node_modules/@npmcli/agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", + "integrity": "sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, "engines": { "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@npmcli/package-json/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "node_modules/@npmcli/arborist/node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", "dev": true, "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, "engines": { - "node": "20 || >=22" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@npmcli/promise-spawn": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", - "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", + "node_modules/@npmcli/arborist/node_modules/@npmcli/run-script": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz", + "integrity": "sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg==", "dev": true, "license": "ISC", "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^6.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", "which": "^5.0.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "node_modules/@npmcli/arborist/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, + "license": "ISC", + "dependencies": { + "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" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/arborist/node_modules/isexe": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", @@ -5769,74 +5489,99 @@ "node": ">=16" } }, - "node_modules/@npmcli/promise-spawn/node_modules/which": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", - "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "node_modules/@npmcli/arborist/node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, + "license": "MIT", "engines": { "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@npmcli/query": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-4.0.1.tgz", - "integrity": "sha512-4OIPFb4weUUwkDXJf4Hh1inAn8neBGq3xsH4ZsAaN6FK3ldrFkH7jSpCc7N9xesi0Sp+EBXJ9eGMDrEww2Ztqw==", + "node_modules/@npmcli/arborist/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/@npmcli/arborist/node_modules/make-fetch-happen": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz", + "integrity": "sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==", "dev": true, "license": "ISC", "dependencies": { - "postcss-selector-parser": "^7.0.0" + "@npmcli/agent": "^3.0.0", + "cacache": "^19.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "ssri": "^12.0.0" }, "engines": { "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@npmcli/redact": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", - "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "node_modules/@npmcli/arborist/node_modules/minimatch": { + "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": "^2.0.1" + }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@npmcli/run-script": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.0.tgz", - "integrity": "sha512-vaQj4nccJbAslopIvd49pQH2NhUp7G9pY4byUtmwhe37ZZuubGrx0eB9hW2F37uVNRuDDK6byFGXF+7JCuMSZg==", + "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", + "integrity": "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA==", "dev": true, "license": "ISC", "dependencies": { - "@npmcli/node-gyp": "^4.0.0", - "@npmcli/package-json": "^7.0.0", - "@npmcli/promise-spawn": "^8.0.0", - "node-gyp": "^11.0.0", + "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", - "which": "^5.0.0" + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" }, "engines": { - "node": "^20.17.0 || >=22.9.0" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@npmcli/run-script/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "node_modules/@npmcli/arborist/node_modules/npm-registry-fetch": { + "version": "18.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz", + "integrity": "sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ==", "dev": true, "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/@npmcli/run-script/node_modules/which": { + "dependencies": { + "@npmcli/redact": "^3.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^14.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^4.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^12.0.0", + "proc-log": "^5.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/which": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", @@ -5852,372 +5597,798 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/devkit": { - "version": "21.6.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.6.2.tgz", - "integrity": "sha512-iGTiG6ZknDPfhmUUMRBBgb2498xUk4gBeLu1nI2BbVNNt3Tmiz/U7OjfV1yJ4Hc6CeJoY0An34VdmWE/UDQYrA==", + "node_modules/@npmcli/fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz", + "integrity": "sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "ejs": "^3.1.7", - "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "minimatch": "9.0.3", - "semver": "^7.5.3", - "tslib": "^2.3.0", - "yargs-parser": "21.1.1" + "semver": "^7.3.5" }, - "peerDependencies": { - "nx": ">= 20 <= 22" - } - }, - "node_modules/@nx/devkit/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", "engines": { - "node": ">= 4" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/devkit/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "node_modules/@npmcli/git": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz", + "integrity": "sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@npmcli/promise-spawn": "^8.0.0", + "ini": "^5.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^10.0.0", + "proc-log": "^5.0.0", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", - "integrity": "sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg==", - "cpu": [ - "arm64" - ], + "node_modules/@npmcli/git/node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "ISC", "engines": { - "node": ">= 10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/nx-darwin-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz", - "integrity": "sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw==", - "cpu": [ - "x64" - ], + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "ISC", "engines": { - "node": ">= 10" + "node": ">=16" } }, - "node_modules/@nx/nx-freebsd-x64": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz", - "integrity": "sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA==", - "cpu": [ - "x64" - ], + "node_modules/@npmcli/git/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": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, "engines": { - "node": ">= 10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz", - "integrity": "sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw==", - "cpu": [ - "arm" - ], + "node_modules/@npmcli/installed-package-contents": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz", + "integrity": "sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "npm-bundled": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, "engines": { - "node": ">= 10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz", - "integrity": "sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg==", - "cpu": [ - "arm64" - ], + "node_modules/@npmcli/map-workspaces": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz", + "integrity": "sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^3.0.0", + "@npmcli/package-json": "^6.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0" + }, "engines": { - "node": ">= 10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz", - "integrity": "sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ==", - "cpu": [ - "arm64" - ], + "node_modules/@npmcli/map-workspaces/node_modules/@npmcli/package-json": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz", + "integrity": "sha512-rCNLSB/JzNvot0SEyXqWZ7tX2B5dD2a1br2Dp0vSYVo5jh8Z0EZ7lS9TsZ1UtziddB1UfNUaMCc538/HztnJGA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^8.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, "engines": { - "node": ">= 10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz", - "integrity": "sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg==", - "cpu": [ - "x64" - ], + "node_modules/@npmcli/map-workspaces/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, + "license": "ISC", + "dependencies": { + "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" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz", - "integrity": "sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A==", - "cpu": [ - "x64" - ], + "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">= 10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz", - "integrity": "sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ==", - "cpu": [ - "arm64" - ], + "node_modules/@npmcli/metavuln-calculator": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-9.0.3.tgz", + "integrity": "sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "cacache": "^20.0.0", + "json-parse-even-better-errors": "^5.0.0", + "pacote": "^21.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5" + }, "engines": { - "node": ">= 10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "20.8.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz", - "integrity": "sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew==", - "cpu": [ - "x64" - ], + "node_modules/@npmcli/metavuln-calculator/node_modules/cacache": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.1.tgz", + "integrity": "sha512-+7LYcYGBYoNqTp1Rv7Ny1YjUo5E0/ftkQtraH3vkfAGgVHc+ouWdC8okAwQgQR7EVIdW6JTzTmhKFwzb+4okAQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^11.0.3", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "unique-filename": "^4.0.0" + }, "engines": { - "node": ">= 10" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@octokit/auth-token": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", - "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "node_modules/@npmcli/metavuln-calculator/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">= 18" + "node": "20 || >=22" } }, - "node_modules/@octokit/core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", - "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "node_modules/@npmcli/metavuln-calculator/node_modules/p-map": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", + "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", "dev": true, "license": "MIT", - "dependencies": { - "@octokit/auth-token": "^4.0.0", - "@octokit/graphql": "^7.1.0", - "@octokit/request": "^8.4.1", - "@octokit/request-error": "^5.1.1", - "@octokit/types": "^13.0.0", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, "engines": { - "node": ">= 18" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/endpoint": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", - "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "node_modules/@npmcli/metavuln-calculator/node_modules/proc-log": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.0.0.tgz", + "integrity": "sha512-KG/XsTDN901PNfPfAMmj6N/Ywg9tM+bHK8pAz+27fS4N4Pcr+4zoYBOcGSBu6ceXYNPxkLpa4ohtfxV1XcLAfA==", "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" - }, + "license": "ISC", "engines": { - "node": ">= 18" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@octokit/graphql": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", - "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "node_modules/@npmcli/name-from-folder": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz", + "integrity": "sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA==", "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/request": "^8.4.1", - "@octokit/types": "^13.0.0", - "universal-user-agent": "^6.0.0" - }, + "license": "ISC", "engines": { - "node": ">= 18" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@octokit/openapi-types": { - "version": "24.2.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", - "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "node_modules/@npmcli/node-gyp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz", + "integrity": "sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } }, - "node_modules/@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "node_modules/@npmcli/package-json": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.0.tgz", + "integrity": "sha512-wy5os0g17akBCVScLyDsDFFf4qC/MmUgIGAFw2pmBGJ/yAQfFbTR9gEaofy4HGm9Jf2MQBnKZICfNds2h3WpEg==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "@npmcli/git": "^6.0.0", + "glob": "^11.0.3", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^4.0.0", + "proc-log": "^5.0.0", + "semver": "^7.5.3", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "11.4.4-cjs.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", - "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", + "node_modules/@npmcli/package-json/node_modules/hosted-git-info": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@octokit/types": "^13.7.0" + "lru-cache": "^11.1.0" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" + "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", - "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", + "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "5" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "13.3.2-cjs.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", - "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", + "node_modules/@npmcli/package-json/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.8.0" - }, + "license": "ISC", "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": "^5" + "node": "20 || >=22" } }, - "node_modules/@octokit/request": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", - "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "node_modules/@npmcli/promise-spawn": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.3.tgz", + "integrity": "sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@octokit/endpoint": "^9.0.6", - "@octokit/request-error": "^5.1.1", - "@octokit/types": "^13.1.0", - "universal-user-agent": "^6.0.0" + "which": "^5.0.0" }, "engines": { - "node": ">= 18" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@octokit/request-error": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", - "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@octokit/types": "^13.1.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" - }, + "license": "ISC", "engines": { - "node": ">= 18" + "node": ">=16" } }, - "node_modules/@octokit/rest": { - "version": "20.1.2", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/query": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-4.0.1.tgz", + "integrity": "sha512-4OIPFb4weUUwkDXJf4Hh1inAn8neBGq3xsH4ZsAaN6FK3ldrFkH7jSpCc7N9xesi0Sp+EBXJ9eGMDrEww2Ztqw==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz", + "integrity": "sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.0.tgz", + "integrity": "sha512-vaQj4nccJbAslopIvd49pQH2NhUp7G9pY4byUtmwhe37ZZuubGrx0eB9hW2F37uVNRuDDK6byFGXF+7JCuMSZg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^8.0.0", + "node-gyp": "^11.0.0", + "proc-log": "^5.0.0", + "which": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@nx/devkit": { + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-21.6.8.tgz", + "integrity": "sha512-N0cj0NqdxY2pcI0IJV+fAu362B6tppdv2ohSBNGacNeSqxfAlJxO5TFZePDmxX5nt0t9hAqT+iasfu4BSYGfZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 20 <= 22" + } + }, + "node_modules/@nx/devkit/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.8.2.tgz", + "integrity": "sha512-t+bmCn6sRPNGU6hnSyWNvbQYA/KgsxGZKYlaCLRwkNhI2akModcBUqtktJzCKd1XHDqs6EkEFBWjFr8/kBEkSg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.8.2.tgz", + "integrity": "sha512-pt/wmDLM31Es8/EzazlyT5U+ou2l60rfMNFGCLqleHEQ0JUTc0KWnOciBLbHIQFiPsCQZJFEKyfV5V/ncePmmw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.8.2.tgz", + "integrity": "sha512-joZxFbgJfkHkB9uMIJr73Gpnm9pnpvr0XKGbWC409/d2x7q1qK77tKdyhGm+A3+kaZFwstNVPmCUtUwJYyU6LA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.8.2.tgz", + "integrity": "sha512-98O/qsxn4vIMPY/FyzvmVrl7C5yFhCUVk0/4PF+PA2SvtQ051L1eMRY6bq/lb69qfN6szJPZ41PG5mPx0NeLZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.8.2.tgz", + "integrity": "sha512-h6a+HxwfSpxsi4KpxGgPh9GDBmD2E+XqGCdfYpobabxqEBvlnIlJyuDhlRR06cTWpuNXHpRdrVogmV6m/YbtDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.8.2.tgz", + "integrity": "sha512-4Ev+jM0VAxDHV/dFgMXjQTCXS4I8W4oMe7FSkXpG8RUn6JK659DC8ExIDPoGIh+Cyqq6r6mw1CSia+ciQWICWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.8.2.tgz", + "integrity": "sha512-nR0ev+wxu+nQYRd7bhqggOxK7UfkV6h+Ko1mumUFyrM5GvPpz/ELhjJFSnMcOkOMcvH0b6G5uTBJvN1XWCkbmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.8.2.tgz", + "integrity": "sha512-ost41l5yc2aq2Gc9bMMpaPi/jkXqbXEMEPHrxWKuKmaek3K2zbVDQzvBBNcQKxf/mlCsrqN4QO0mKYSRRqag5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.8.2.tgz", + "integrity": "sha512-0SEOqT/daBG5WtM9vOGilrYaAuf1tiALdrFavY62+/arXYxXemUKmRI5qoKDTnvoLMBGkJs6kxhMO5b7aUXIvQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.8.2.tgz", + "integrity": "sha512-iIsY+tVqes/NOqTbJmggL9Juie/iaDYlWgXA9IUv88FE9thqWKhVj4/tCcPjsOwzD+1SVna3YISEEFsx5UV4ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@octokit/auth-token": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/core": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.2.tgz", + "integrity": "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.4.1", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/endpoint": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/graphql": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.1.tgz", + "integrity": "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^8.4.1", + "@octokit/types": "^13.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "24.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz", + "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "11.4.4-cjs.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.4-cjs.2.tgz", + "integrity": "sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.7.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", + "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.3.2-cjs.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.2-cjs.1.tgz", + "integrity": "sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.8.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5" + } + }, + "node_modules/@octokit/request": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^9.0.6", + "@octokit/request-error": "^5.1.1", + "@octokit/types": "^13.1.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/request-error": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^13.1.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest": { + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.2.tgz", "integrity": "sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==", "dev": true, "license": "MIT", @@ -6510,9 +6681,9 @@ "link": true }, "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", "dev": true, "license": "MIT", "dependencies": { @@ -7019,6 +7190,22 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", @@ -7142,22 +7329,22 @@ "license": "MIT" }, "node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", - "@types/serve-static": "*" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", "dev": true, "license": "MIT", "dependencies": { @@ -7185,9 +7372,9 @@ "license": "MIT" }, "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "version": "1.17.17", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", + "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", "dev": true, "license": "MIT", "dependencies": { @@ -7286,9 +7473,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "18.6.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", - "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", "license": "MIT" }, "node_modules/@types/node-forge": { @@ -7353,9 +7540,9 @@ "license": "MIT" }, "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", "dev": true, "license": "MIT", "dependencies": { @@ -7374,15 +7561,15 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", "@types/node": "*", - "@types/send": "*" + "@types/send": "<1" } }, "node_modules/@types/sinon": { @@ -7396,9 +7583,9 @@ } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-15.0.1.tgz", + "integrity": "sha512-Ko2tjWJq8oozHzHV+reuvS5KYIRAokHnGbDwGh/J64LntgpbuylF74ipEL24HCyRjf9FOlBiBHWBR1RlVKsI1w==", "dev": true, "license": "MIT" }, @@ -7701,6 +7888,22 @@ "typescript": ">=4.8.4 <6.0.0" } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/utils": { "version": "8.41.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.41.0.tgz", @@ -8640,16 +8843,24 @@ "license": "MIT" }, "node_modules/bare-events": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", - "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.1.tgz", + "integrity": "sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } }, "node_modules/bare-fs": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", - "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.0.tgz", + "integrity": "sha512-GljgCjeupKZJNetTqxKaQArLK10vpmK28or0+RwWjEl5Rk+/xG3wkpmkv+WrcBm3q1BwHKlnhXzR8O37kcvkXQ==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -8718,9 +8929,9 @@ } }, "node_modules/bare-url": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", - "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", + "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -8760,9 +8971,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.10.tgz", - "integrity": "sha512-uLfgBi+7IBNay8ECBO2mVMGZAc1VgZWEChxm4lv+TobGdG82LnXMjuNGo/BSSZZL4UmkWhxEHP2f5ziLNwGWMA==", + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", + "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -9065,9 +9276,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.26.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", - "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", "dev": true, "funding": [ { @@ -9085,11 +9296,11 @@ ], "license": "MIT", "dependencies": { - "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" + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" }, "bin": { "browserslist": "cli.js" @@ -9261,6 +9472,22 @@ "dev": true, "license": "ISC" }, + "node_modules/cacache/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/cacache/node_modules/p-map": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", @@ -9275,11 +9502,11 @@ } }, "node_modules/cacache/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -9424,9 +9651,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001746", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001746.tgz", - "integrity": "sha512-eA7Ys/DGw+pnkWWSE/id29f2IcPHVoE8wxtvE5JdvD2V28VTDPy1yEeo11Guz0sJ4ZeGRcm3uaTcAqK1LXaphA==", + "version": "1.0.30001753", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", + "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", "dev": true, "funding": [ { @@ -9521,40 +9748,35 @@ } }, "node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", + "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", "dev": true, "license": "MIT" }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "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": { - "readdirp": "^4.0.1" + "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": ">= 14.16.0" + "node": ">= 8.10.0" }, "funding": { "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chokidar/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": ">= 14.18.0" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/chownr": { @@ -10240,13 +10462,13 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.45.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", - "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", + "version": "3.46.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.25.3" + "browserslist": "^4.26.3" }, "funding": { "type": "opencollective", @@ -10632,16 +10854,6 @@ "source-map": "~0.6.1" } }, - "node_modules/degenerator/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -10745,9 +10957,9 @@ "license": "MIT" }, "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -11038,9 +11250,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.228", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.228.tgz", - "integrity": "sha512-nxkiyuqAn4MJ1QbobwqJILiDtu/jk14hEAWaMiJmNPh1Z+jqoFlBFZjdXwLWGeVSeu9hGLg6+2G9yJaW8rBIFA==", + "version": "1.5.244", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", + "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", "dev": true, "license": "ISC" }, @@ -11269,9 +11481,9 @@ } }, "node_modules/envinfo": { - "version": "7.15.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.15.0.tgz", - "integrity": "sha512-chR+t7exF6y59kelhXw5I3849nTy7KIRO+ePdLMhCD+JRP/JvmkenDWP7QSFGlsHX+kxGxdDutOPrmj5j1HR6g==", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.20.0.tgz", + "integrity": "sha512-+zUomDcLXsVkQ37vUqWBvQwLaLlj8eZPSi61llaEFAVBY5mhcXdaSw1pSJVl4yTYD5g/gEfpNl28YYk4IPvrrg==", "dev": true, "license": "MIT", "bin": { @@ -11417,6 +11629,16 @@ "source-map": "~0.6.1" } }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -11674,17 +11896,20 @@ } }, "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { @@ -11711,33 +11936,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -11823,16 +12021,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -11846,16 +12034,6 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/estimo": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/estimo/-/estimo-3.0.5.tgz", @@ -11887,9 +12065,9 @@ } }, "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -11991,9 +12169,9 @@ "license": "ISC" }, "node_modules/exponential-backoff": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", - "integrity": "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, "license": "Apache-2.0" }, @@ -12302,19 +12480,6 @@ "minimatch": "^5.0.1" } }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -12985,9 +13150,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", - "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13173,9 +13338,9 @@ } }, "node_modules/glob-to-regex.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", - "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -13223,11 +13388,11 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -13336,9 +13501,9 @@ "license": "MIT" }, "node_modules/graphql": { - "version": "16.11.0", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.11.0.tgz", - "integrity": "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==", + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", + "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "dev": true, "license": "MIT", "engines": { @@ -13921,38 +14086,11 @@ "promzard": "^2.0.0", "read": "^4.0.0", "semver": "^7.7.2", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^6.0.2" - }, - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, - "node_modules/inquirer": { - "version": "12.9.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.6.tgz", - "integrity": "sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^1.0.0", - "@inquirer/core": "^10.2.2", - "@inquirer/prompts": "^7.8.6", - "@inquirer/type": "^3.0.8", - "mute-stream": "^2.0.0", - "run-async": "^4.0.5", - "rxjs": "^7.8.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^6.0.2" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/interpret": { @@ -14743,9 +14881,9 @@ } }, "node_modules/jsdoc": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.4.tgz", - "integrity": "sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz", + "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -14836,11 +14974,14 @@ "license": "MIT" }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -14854,710 +14995,1044 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT" + "license": "MIT" + }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonbird": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/jsonbird/-/jsonbird-2.2.2.tgz", + "integrity": "sha512-48n9HTL6Vxhr6WqX78ROH5NddK//ZnSdu1ZnPyyOl9IzF2PyRmwC8nCKPiRFo1wx7/Byq5YezCqokq9T/McLhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.2.0", + "readable-stream": "^2.1.4", + "shortid": "^2.2.6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-coverage/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/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "node_modules/karma-jquery": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/karma-jquery/-/karma-jquery-0.2.4.tgz", + "integrity": "sha512-NkEzqc+ulVlOASeQRZh07wB4mv1yUUQPp5natoqcTxl+oXwIB0Hu4/g3uCIJLzvEydAxD7IxWLhZuqIigsdBOQ==", "dev": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" + "license": "MIT", + "peerDependencies": { + "karma": ">=0.9" } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "node_modules/karma-mocha": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", + "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "minimist": "^1.2.3" + } }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/karma-mocha-webworker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-mocha-webworker/-/karma-mocha-webworker-1.3.0.tgz", + "integrity": "sha512-2DCnE7QkMblSHzm+ZphwdKgdURxoK4xrblNfryAB5PQ6ntpylY/dAGO1X0d1h+n6Qni8DT2AzpuwEfjpxAFHdg==", "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "jsonbird": "^2.0.0", + "minimatch": "^3.0.3" }, - "engines": { - "node": ">=6" + "peerDependencies": { + "mocha": "*" } }, - "node_modules/jsonbird": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/jsonbird/-/jsonbird-2.2.2.tgz", - "integrity": "sha512-48n9HTL6Vxhr6WqX78ROH5NddK//ZnSdu1ZnPyyOl9IzF2PyRmwC8nCKPiRFo1wx7/Byq5YezCqokq9T/McLhw==", + "node_modules/karma-mocha-webworker/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": { - "jsonparse": "^1.2.0", - "readable-stream": "^2.1.4", - "shortid": "^2.2.6" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "node_modules/karma-mocha-webworker/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "node_modules/karma-spec-reporter": { + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.36.tgz", + "integrity": "sha512-11bvOl1x6ryKZph7kmbmMpbi8vsngEGxGOoeTlIcDaH3ab3j8aPJnZ+r+K/SS0sBSGy5VGkGYO2+hLct7hw/6w==", "dev": true, "license": "MIT", "dependencies": { - "universalify": "^2.0.0" + "colors": "1.4.0" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "peerDependencies": { + "karma": ">=0.9" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "node_modules/karma-webpack": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.1.tgz", + "integrity": "sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ==", "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" + "license": "MIT", + "dependencies": { + "glob": "^7.1.3", + "minimatch": "^9.0.3", + "webpack-merge": "^4.1.5" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/karma-webpack/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "(MIT OR Apache-2.0)", + "license": "ISC", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/just-diff": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", - "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "node_modules/karma-webpack/node_modules/glob/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" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } }, - "node_modules/just-diff-apply": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", - "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "node_modules/karma-webpack/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } }, - "node_modules/just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "node_modules/karma-webpack/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/karma": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", - "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "node_modules/karma-webpack/node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", "dev": true, "license": "MIT", "dependencies": { - "@colors/colors": "1.5.0", - "body-parser": "^1.19.0", - "braces": "^3.0.2", - "chokidar": "^3.5.1", - "connect": "^3.7.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.1", - "glob": "^7.1.7", - "graceful-fs": "^4.2.6", - "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.8", - "lodash": "^4.17.21", - "log4js": "^6.4.1", - "mime": "^2.5.2", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.5", - "qjobs": "^1.2.0", - "range-parser": "^1.2.1", - "rimraf": "^3.0.2", - "socket.io": "^4.7.2", - "source-map": "^0.6.1", - "tmp": "^0.2.1", - "ua-parser-js": "^0.7.30", - "yargs": "^16.1.1" - }, - "bin": { - "karma": "bin/karma" - }, - "engines": { - "node": ">= 10" + "lodash": "^4.17.15" + } + }, + "node_modules/karma/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": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma/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/karma-chrome-launcher": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", - "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "node_modules/karma/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/karma/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "which": "^1.2.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/karma-chrome-launcher/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "brace-expansion": "^1.1.7" }, - "bin": { - "which": "bin/which" + "engines": { + "node": "*" } }, - "node_modules/karma-coverage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", - "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "node_modules/karma/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": { - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.0.5", - "minimatch": "^3.0.4" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/karma-coverage/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==", + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "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/karma-coverage/node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "node_modules/karma/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": "BSD-3-Clause", + "license": "MIT", "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" + "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" + "node": ">=10" } }, - "node_modules/karma-coverage/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/karma/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", - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/karma-coverage/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/katex": { + "version": "0.16.25", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.25.tgz", + "integrity": "sha512-woHRUZ/iF23GBP1dkDQMh1QBad9dmr8/PAwNA54VrSOVYgI12MAcE14TqnDdQOdzyEonGzMepYnqBMYdsoAr8Q==", "dev": true, - "license": "ISC", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, "bin": { - "semver": "bin/semver.js" + "katex": "cli.js" } }, - "node_modules/karma-jquery": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/karma-jquery/-/karma-jquery-0.2.4.tgz", - "integrity": "sha512-NkEzqc+ulVlOASeQRZh07wB4mv1yUUQPp5natoqcTxl+oXwIB0Hu4/g3uCIJLzvEydAxD7IxWLhZuqIigsdBOQ==", + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true, "license": "MIT", - "peerDependencies": { - "karma": ">=0.9" + "engines": { + "node": ">= 12" } }, - "node_modules/karma-mocha": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz", - "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.3" + "json-buffer": "3.0.1" } }, - "node_modules/karma-mocha-webworker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-mocha-webworker/-/karma-mocha-webworker-1.3.0.tgz", - "integrity": "sha512-2DCnE7QkMblSHzm+ZphwdKgdURxoK4xrblNfryAB5PQ6ntpylY/dAGO1X0d1h+n6Qni8DT2AzpuwEfjpxAFHdg==", + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", "dev": true, "license": "MIT", "dependencies": { - "jsonbird": "^2.0.0", - "minimatch": "^3.0.3" - }, - "peerDependencies": { - "mocha": "*" + "graceful-fs": "^4.1.9" } }, - "node_modules/karma-mocha-webworker/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==", + "node_modules/launch-editor": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.12.0.tgz", + "integrity": "sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, - "node_modules/karma-mocha-webworker/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/lerna": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-9.0.0.tgz", + "integrity": "sha512-bqlWmsn2puWkLWdq0jU/FuuAqb1eeppFM5QC55EtxQeRVIF/GoeCY5wl+FX0gorPgIfD2BzPd6abo4KN1m+Wow==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "@lerna/create": "9.0.0", + "@npmcli/arborist": "9.1.4", + "@npmcli/package-json": "7.0.0", + "@npmcli/run-script": "10.0.0", + "@nx/devkit": ">=21.5.2 < 22.0.0", + "@octokit/plugin-enterprise-rest": "6.0.1", + "@octokit/rest": "20.1.2", + "aproba": "2.0.0", + "byte-size": "8.1.1", + "chalk": "4.1.0", + "cmd-shim": "6.0.3", + "color-support": "1.1.3", + "columnify": "1.6.0", + "console-control-strings": "^1.1.0", + "conventional-changelog-angular": "7.0.0", + "conventional-changelog-core": "5.0.1", + "conventional-recommended-bump": "7.0.1", + "cosmiconfig": "9.0.0", + "dedent": "1.5.3", + "envinfo": "7.13.0", + "execa": "5.0.0", + "fs-extra": "^11.2.0", + "get-port": "5.1.1", + "get-stream": "6.0.0", + "git-url-parse": "14.0.0", + "glob-parent": "6.0.2", + "has-unicode": "2.0.1", + "import-local": "3.1.0", + "ini": "^1.3.8", + "init-package-json": "8.2.2", + "inquirer": "12.9.6", + "is-ci": "3.0.1", + "is-stream": "2.0.0", + "jest-diff": ">=30.0.0 < 31", + "js-yaml": "4.1.0", + "libnpmaccess": "10.0.1", + "libnpmpublish": "11.1.0", + "load-json-file": "6.2.0", + "make-dir": "4.0.0", + "make-fetch-happen": "15.0.2", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "npm-package-arg": "13.0.0", + "npm-packlist": "10.0.1", + "npm-registry-fetch": "19.0.0", + "nx": ">=21.5.3 < 22.0.0", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-pipe": "3.1.0", + "p-queue": "6.6.2", + "p-reduce": "2.1.0", + "p-waterfall": "2.1.1", + "pacote": "21.0.1", + "pify": "5.0.0", + "read-cmd-shim": "4.0.0", + "resolve-from": "5.0.0", + "rimraf": "^4.4.1", + "semver": "7.7.2", + "set-blocking": "^2.0.0", + "signal-exit": "3.0.7", + "slash": "3.0.0", + "ssri": "12.0.0", + "string-width": "^4.2.3", + "tar": "6.2.1", + "temp-dir": "1.0.0", + "through": "2.3.8", + "tinyglobby": "0.2.12", + "typescript": ">=3 < 6", + "upath": "2.0.1", + "uuid": "^11.1.0", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "6.0.2", + "wide-align": "1.1.5", + "write-file-atomic": "5.0.1", + "write-pkg": "4.0.0", + "yargs": "17.7.2", + "yargs-parser": "21.1.1" }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-spec-reporter": { - "version": "0.0.36", - "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.36.tgz", - "integrity": "sha512-11bvOl1x6ryKZph7kmbmMpbi8vsngEGxGOoeTlIcDaH3ab3j8aPJnZ+r+K/SS0sBSGy5VGkGYO2+hLct7hw/6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "colors": "1.4.0" + "bin": { + "lerna": "dist/cli.js" }, - "peerDependencies": { - "karma": ">=0.9" + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, - "node_modules/karma-webpack": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.1.tgz", - "integrity": "sha512-oo38O+P3W2mSPCSUrQdySSPv1LvPpXP+f+bBimNomS5sW+1V4SuhCuW8TfJzV+rDv921w2fDSDw0xJbPe6U+kQ==", + "node_modules/lerna/node_modules/@inquirer/checkbox": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.0.tgz", + "integrity": "sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==", "dev": true, "license": "MIT", "dependencies": { - "glob": "^7.1.3", - "minimatch": "^9.0.3", - "webpack-merge": "^4.1.5" + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">= 18" + "node": ">=18" }, "peerDependencies": { - "webpack": "^5.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/karma-webpack/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==", + "node_modules/lerna/node_modules/@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/karma-webpack/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": "*" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/karma-webpack/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "peerDependencies": { + "@types/node": ">=18" }, - "engines": { - "node": "*" - } - }, - "node_modules/karma-webpack/node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/karma/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": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/karma/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/lerna/node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", "dev": true, "license": "MIT", "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" + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">= 8.10.0" + "node": ">=18" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "@types/node": ">=18" }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/karma/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" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/karma/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/karma/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/lerna/node_modules/@inquirer/core/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": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/karma/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/karma/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/lerna/node_modules/@inquirer/editor": { + "version": "4.2.21", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.21.tgz", + "integrity": "sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@inquirer/core": "^10.3.0", + "@inquirer/external-editor": "^1.0.2", + "@inquirer/type": "^3.0.9" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/karma/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/lerna/node_modules/@inquirer/expand": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.21.tgz", + "integrity": "sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" }, "engines": { - "node": ">=10" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/karma/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/lerna/node_modules/@inquirer/external-editor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.2.tgz", + "integrity": "sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==", "dev": true, "license": "MIT", "dependencies": { - "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" + "chardet": "^2.1.0", + "iconv-lite": "^0.7.0" }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/karma/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==", + "node_modules/lerna/node_modules/@inquirer/input": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.5.tgz", + "integrity": "sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, "engines": { - "node": ">=10" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/katex": { - "version": "0.16.22", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.22.tgz", - "integrity": "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==", + "node_modules/lerna/node_modules/@inquirer/number": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.21.tgz", + "integrity": "sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==", "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], "license": "MIT", "dependencies": { - "commander": "^8.3.0" + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" }, - "bin": { - "katex": "cli.js" + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "node_modules/lerna/node_modules/@inquirer/password": { + "version": "4.0.21", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.21.tgz", + "integrity": "sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==", "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, "engines": { - "node": ">= 12" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/lerna/node_modules/@inquirer/prompts": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.9.0.tgz", + "integrity": "sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==", "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@inquirer/checkbox": "^4.3.0", + "@inquirer/confirm": "^5.1.19", + "@inquirer/editor": "^4.2.21", + "@inquirer/expand": "^4.0.21", + "@inquirer/input": "^4.2.5", + "@inquirer/number": "^3.0.21", + "@inquirer/password": "^4.0.21", + "@inquirer/rawlist": "^4.1.9", + "@inquirer/search": "^3.2.0", + "@inquirer/select": "^4.4.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "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==", + "node_modules/lerna/node_modules/@inquirer/rawlist": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.9.tgz", + "integrity": "sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==", "dev": true, "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/klaw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", - "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "node_modules/lerna/node_modules/@inquirer/search": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.0.tgz", + "integrity": "sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==", "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.9" + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "node_modules/lerna/node_modules/@inquirer/select": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.0.tgz", + "integrity": "sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==", "dev": true, "license": "MIT", "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" + "@inquirer/ansi": "^1.0.1", + "@inquirer/core": "^10.3.0", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/lerna": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-9.0.0.tgz", - "integrity": "sha512-bqlWmsn2puWkLWdq0jU/FuuAqb1eeppFM5QC55EtxQeRVIF/GoeCY5wl+FX0gorPgIfD2BzPd6abo4KN1m+Wow==", + "node_modules/lerna/node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", "dev": true, "license": "MIT", - "dependencies": { - "@lerna/create": "9.0.0", - "@npmcli/arborist": "9.1.4", - "@npmcli/package-json": "7.0.0", - "@npmcli/run-script": "10.0.0", - "@nx/devkit": ">=21.5.2 < 22.0.0", - "@octokit/plugin-enterprise-rest": "6.0.1", - "@octokit/rest": "20.1.2", - "aproba": "2.0.0", - "byte-size": "8.1.1", - "chalk": "4.1.0", - "cmd-shim": "6.0.3", - "color-support": "1.1.3", - "columnify": "1.6.0", - "console-control-strings": "^1.1.0", - "conventional-changelog-angular": "7.0.0", - "conventional-changelog-core": "5.0.1", - "conventional-recommended-bump": "7.0.1", - "cosmiconfig": "9.0.0", - "dedent": "1.5.3", - "envinfo": "7.13.0", - "execa": "5.0.0", - "fs-extra": "^11.2.0", - "get-port": "5.1.1", - "get-stream": "6.0.0", - "git-url-parse": "14.0.0", - "glob-parent": "6.0.2", - "has-unicode": "2.0.1", - "import-local": "3.1.0", - "ini": "^1.3.8", - "init-package-json": "8.2.2", - "inquirer": "12.9.6", - "is-ci": "3.0.1", - "is-stream": "2.0.0", - "jest-diff": ">=30.0.0 < 31", - "js-yaml": "4.1.0", - "libnpmaccess": "10.0.1", - "libnpmpublish": "11.1.0", - "load-json-file": "6.2.0", - "make-dir": "4.0.0", - "make-fetch-happen": "15.0.2", - "minimatch": "3.0.5", - "multimatch": "5.0.0", - "npm-package-arg": "13.0.0", - "npm-packlist": "10.0.1", - "npm-registry-fetch": "19.0.0", - "nx": ">=21.5.3 < 22.0.0", - "p-map": "4.0.0", - "p-map-series": "2.1.0", - "p-pipe": "3.1.0", - "p-queue": "6.6.2", - "p-reduce": "2.1.0", - "p-waterfall": "2.1.1", - "pacote": "21.0.1", - "pify": "5.0.0", - "read-cmd-shim": "4.0.0", - "resolve-from": "5.0.0", - "rimraf": "^4.4.1", - "semver": "7.7.2", - "set-blocking": "^2.0.0", - "signal-exit": "3.0.7", - "slash": "3.0.0", - "ssri": "12.0.0", - "string-width": "^4.2.3", - "tar": "6.2.1", - "temp-dir": "1.0.0", - "through": "2.3.8", - "tinyglobby": "0.2.12", - "typescript": ">=3 < 6", - "upath": "2.0.1", - "uuid": "^11.1.0", - "validate-npm-package-license": "3.0.4", - "validate-npm-package-name": "6.0.2", - "wide-align": "1.1.5", - "write-file-atomic": "5.0.1", - "write-pkg": "4.0.0", - "yargs": "17.7.2", - "yargs-parser": "21.1.1" + "engines": { + "node": ">=18" }, - "bin": { - "lerna": "dist/cli.js" + "peerDependencies": { + "@types/node": ">=18" }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, "node_modules/lerna/node_modules/@nx/nx-darwin-arm64": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.6.3.tgz", - "integrity": "sha512-y/Wuo+FEky/ehah5UyERpQpUOm+KOc437zRwUrMGumNUFk73DaHVMmqABCZ1J5eqam60XgRZhq05qpRn+8dhtA==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-21.6.8.tgz", + "integrity": "sha512-MG5bhSYhG49r+e0mLuztQVHz1sEy7cs8BvZJ56mm7JNQ1VfbaTyLAR7VcNw8O/1mJA8jYcg9fmxOIZOUnY1cEQ==", "cpu": [ "arm64" ], @@ -15569,9 +16044,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-darwin-x64": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.6.3.tgz", - "integrity": "sha512-+9rogeP6EmlMBcUwflfOmFbQOWgAnJdupeJJuSenzWJCn/bE1C2iIGhuq4u4zajo2VceyN7uirlAWc8cQWCevw==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-21.6.8.tgz", + "integrity": "sha512-e9oXVTd6U6RFEc3k22PGoe5OSy40fyyytl+svSJQmK+5rxZalvAUna/mXtFcQC9m6No2daqqpfAZlyN5nG6WHw==", "cpu": [ "x64" ], @@ -15583,9 +16058,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-freebsd-x64": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.6.3.tgz", - "integrity": "sha512-jrewLpv/J84ze+sC+P0x1INVuXTWqU4qdZIPe0ItrRMDMmxiHdhm6LtHEEo5JYezqM/LgB87yjFE49Qsudtadw==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-21.6.8.tgz", + "integrity": "sha512-gK3rsTXQj0hHCyaAvZmPZeCPkb3jzesgtkXuZf+7pCm5b4wiEA1i22ufp1UzwaTmWgbub/6NVMEDOGsVcay8mA==", "cpu": [ "x64" ], @@ -15597,9 +16072,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.6.3.tgz", - "integrity": "sha512-VyMIKSp1N2ulA2wkAKIH+9a8k4tl67bH2wnvYROTRnfFykeczodfOxWeCAggS//1ccBM05pRxBklMt7fgAqV8w==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-21.6.8.tgz", + "integrity": "sha512-TXt3HTFhM4kuL9larxBuo3XpSngoA1JCtHavfYLRC3A8knACi7LwNQwnF5RWAcYgKMVE3/8IAhV8LuemXrPKKw==", "cpu": [ "arm" ], @@ -15611,9 +16086,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-linux-arm64-gnu": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.6.3.tgz", - "integrity": "sha512-l6/YZp5MJ5TYWbHoaR31lsqd4Ia2AnaGSACeNCUAsUsUNaa099nwmvFaKQEJxUX1aMpe4kHLyVbomK7ydEX+pg==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-21.6.8.tgz", + "integrity": "sha512-QwZREYIhqhDVEIf+KAv2VFipxMUoULXXS3qyLX3/q/4u8Y32fyM5wd+FXpv89cRCiveVsZp8io2W178R6lfKng==", "cpu": [ "arm64" ], @@ -15625,9 +16100,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-linux-arm64-musl": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.6.3.tgz", - "integrity": "sha512-klidxt4eiSxgLa1LW7YUHstm3qsptz+XD1+3w0ofX1rkdVkK1afrfcolzoeZ5nc4Av7MzZB0g0PoFTGHUIBkrw==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-21.6.8.tgz", + "integrity": "sha512-UZJyrZ6utU8g1W7E31iHDhWj1SjMidmDNyrVP4xK6IUrotx6qGrwfwWqzqvphhc1cA7w4Zz9N/rCCPQkdHzjLw==", "cpu": [ "arm64" ], @@ -15639,9 +16114,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-linux-x64-gnu": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.6.3.tgz", - "integrity": "sha512-B5ZvolVUIKKmacbZw1XD2nBIbebE2T6vBbMYq6kZP7PfSsfO5Y0HaWIsK8ulwCj35TPaEn9x/XbHJp5RakU7Ng==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-21.6.8.tgz", + "integrity": "sha512-HXINTg4P0/Yj76vsvqBAb7MNlLpkH1pl9JF2blXScOFXWzNoStd7b6xyrpCROdmi0Hk8y3UEwc8OIyLFIfixJg==", "cpu": [ "x64" ], @@ -15653,9 +16128,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-linux-x64-musl": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.6.3.tgz", - "integrity": "sha512-11L6SigPvjnIFbr4ivXlcH0fOPs55SvT8gkg2TOsSohKFY/Ze4O43NuoZe/7dilLjNgq8aWTbnbSuRK/kFGdBQ==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-21.6.8.tgz", + "integrity": "sha512-2YbXLhuSlElCtQTR1Ib94O3T4fX9uzSIkUMYGL3n04agG0HemXoxJa91TWwwOUMbEZffkhcPsJBOh2S5l47s9Q==", "cpu": [ "x64" ], @@ -15667,9 +16142,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-win32-arm64-msvc": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.6.3.tgz", - "integrity": "sha512-hC84RvGp5YxGhQLitHcg3cohTy7sdsvIRIErq3EsJNlHIaUTZJAegno26sRpRE4Y/5G5RWqfzDCCERg9c3Askw==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-21.6.8.tgz", + "integrity": "sha512-/VSGtqa1oGHo5n24R39ZuGxMrGyf7pxFuCtL5hAzBHdTxFg/VZomPGd7BeV5VN5SbIw+fie+nTGkC5q3TOPGXw==", "cpu": [ "arm64" ], @@ -15681,9 +16156,9 @@ ] }, "node_modules/lerna/node_modules/@nx/nx-win32-x64-msvc": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.6.3.tgz", - "integrity": "sha512-vcnVwrTsOVdN6ovKO6qFDHXYRa+lxKFLRGCUHvJvjTOddT1/xJqkL8NE4i1YDWZiCQCck0BizR3Kvs+N0DqHoQ==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-21.6.8.tgz", + "integrity": "sha512-xeBL7PcDqHH/Zw4d2A2qP7eLImzzcMO3hiKs5G42Wi92ACejAdUqpIduTL4RpArsXIHm5VEbE4KvHNii1mMU1A==", "cpu": [ "x64" ], @@ -15694,6 +16169,18 @@ "win32" ] }, + "node_modules/lerna/node_modules/@types/node": { + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, "node_modules/lerna/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -15813,6 +16300,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/lerna/node_modules/iconv-lite": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/lerna/node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -15823,6 +16327,33 @@ "node": ">= 4" } }, + "node_modules/lerna/node_modules/inquirer": { + "version": "12.9.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.9.6.tgz", + "integrity": "sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.0", + "@inquirer/core": "^10.2.2", + "@inquirer/prompts": "^7.8.6", + "@inquirer/type": "^3.0.8", + "mute-stream": "^2.0.0", + "run-async": "^4.0.5", + "rxjs": "^7.8.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/lerna/node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", @@ -15870,9 +16401,9 @@ } }, "node_modules/lerna/node_modules/nx": { - "version": "21.6.3", - "resolved": "https://registry.npmjs.org/nx/-/nx-21.6.3.tgz", - "integrity": "sha512-CD/R7JV9OWy1UNsm6BOAMvH7m7EpqDKVHbBjoR8wmxYaTKkOQ9lPpi5yYIyRPpONK/uHCqYyeKa2cM3zP6euqw==", + "version": "21.6.8", + "resolved": "https://registry.npmjs.org/nx/-/nx-21.6.8.tgz", + "integrity": "sha512-NilGEk1Cngs3Se9JW+f9cDeN6RBvmABhpEtgMvOK8RAAZszq6B380oCzKcQljhnrbQ6+v6j/Vb7hBPTCvXb0Ng==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -15881,7 +16412,7 @@ "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.2", "@zkochan/js-yaml": "0.0.7", - "axios": "^1.8.3", + "axios": "^1.12.0", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", @@ -15918,16 +16449,16 @@ "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "21.6.3", - "@nx/nx-darwin-x64": "21.6.3", - "@nx/nx-freebsd-x64": "21.6.3", - "@nx/nx-linux-arm-gnueabihf": "21.6.3", - "@nx/nx-linux-arm64-gnu": "21.6.3", - "@nx/nx-linux-arm64-musl": "21.6.3", - "@nx/nx-linux-x64-gnu": "21.6.3", - "@nx/nx-linux-x64-musl": "21.6.3", - "@nx/nx-win32-arm64-msvc": "21.6.3", - "@nx/nx-win32-x64-msvc": "21.6.3" + "@nx/nx-darwin-arm64": "21.6.8", + "@nx/nx-darwin-x64": "21.6.8", + "@nx/nx-freebsd-x64": "21.6.8", + "@nx/nx-linux-arm-gnueabihf": "21.6.8", + "@nx/nx-linux-arm64-gnu": "21.6.8", + "@nx/nx-linux-arm64-musl": "21.6.8", + "@nx/nx-linux-x64-gnu": "21.6.8", + "@nx/nx-linux-x64-musl": "21.6.8", + "@nx/nx-win32-arm64-msvc": "21.6.8", + "@nx/nx-win32-x64-msvc": "21.6.8" }, "peerDependencies": { "@swc-node/register": "^1.8.0", @@ -16072,6 +16603,21 @@ "uuid": "dist/esm/bin/uuid" } }, + "node_modules/lerna/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -16240,9 +16786,9 @@ } }, "node_modules/libnpmpublish/node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", "dev": true, "funding": [ { @@ -16316,6 +16862,22 @@ "node": "^18.17.0 || >=20.5.0" } }, + "node_modules/libnpmpublish/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/libnpmpublish/node_modules/npm-package-arg": { "version": "12.0.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz", @@ -16472,6 +17034,22 @@ "node": ">=16" } }, + "node_modules/linkinator/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/load-json-file": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", @@ -16499,13 +17077,17 @@ } }, "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/loader-utils": { @@ -16916,9 +17498,9 @@ } }, "node_modules/marked": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", - "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", + "version": "16.4.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.1.tgz", + "integrity": "sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==", "dev": true, "license": "MIT", "bin": { @@ -16954,22 +17536,16 @@ } }, "node_modules/memfs": { - "version": "4.48.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.48.1.tgz", - "integrity": "sha512-vWO+1ROkhOALF1UnT9aNOOflq5oFDlqwTXaPg6duo07fBLxSH0+bcF0TY1lbA1zTNKyGgDxgaDdKx5MaewLX5A==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, - "license": "Apache-2.0", + "license": "Unlicense", "dependencies": { - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" + "fs-monkey": "^1.0.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">= 4.0.0" } }, "node_modules/meow": { @@ -17812,19 +18388,16 @@ "license": "ISC" }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, "node_modules/minimist": { @@ -18061,6 +18634,32 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/mocha/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": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/mocha/node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -18082,6 +18681,43 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mocha/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/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": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/mocha/node_modules/workerpool": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", @@ -18149,6 +18785,108 @@ } } }, + "node_modules/msw/node_modules/@inquirer/confirm": { + "version": "5.1.19", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.19.tgz", + "integrity": "sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.0", + "@inquirer/type": "^3.0.9" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/@inquirer/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.0.tgz", + "integrity": "sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.1", + "@inquirer/figures": "^1.0.14", + "@inquirer/type": "^3.0.9", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/@inquirer/type": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.9.tgz", + "integrity": "sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/@types/node": { + "version": "24.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz", + "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/msw/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/msw/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/msw/node_modules/type-fest": { "version": "4.41.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", @@ -18162,6 +18900,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/msw/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -18384,9 +19137,9 @@ } }, "node_modules/node-gyp": { - "version": "11.4.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.4.2.tgz", - "integrity": "sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==", + "version": "11.5.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-11.5.0.tgz", + "integrity": "sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ==", "dev": true, "license": "MIT", "dependencies": { @@ -18476,11 +19229,11 @@ } }, "node_modules/node-gyp/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -18545,9 +19298,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", - "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -18679,9 +19432,9 @@ } }, "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.0.tgz", - "integrity": "sha512-gEf705MZLrDPkbbhi8PnoO4ZwYgKoNL+ISZ3AjZMht2r3N5tuTwncyDi6Fv2/qDnMmZxgs0yI8WDOyR8q3G+SQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz", + "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==", "dev": true, "license": "ISC", "dependencies": { @@ -18728,11 +19481,11 @@ } }, "node_modules/npm-packlist/node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/brace-expansion": "^5.0.0" }, @@ -19891,6 +20644,22 @@ "node": "20 || >=22" } }, + "node_modules/pacote/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/pacote/node_modules/p-map": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", @@ -19923,11 +20692,11 @@ } }, "node_modules/pacote/node_modules/tar": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.1.tgz", - "integrity": "sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz", + "integrity": "sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -20041,6 +20810,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/parse-json/node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -20539,16 +21315,6 @@ "protobufjs": "^7.0.0" } }, - "node_modules/protobufjs-cli/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/protobufjs-cli/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -20570,19 +21336,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/protobufjs-cli/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/protocols": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", @@ -21225,9 +21978,9 @@ } }, "node_modules/require-in-the-middle": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.0.tgz", - "integrity": "sha512-9s0pnM5tH8G4dSI3pms2GboYOs25LwOGnRMxN/Hx3TYT1K0rh6OjaWf4dI0DAQnMyaEXWoGVnSTPQasqwzTTAA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", "license": "MIT", "dependencies": { "debug": "^4.3.5", @@ -21262,12 +22015,12 @@ } }, "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -21564,62 +22317,24 @@ "license": "MIT" }, "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 8.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -22075,16 +22790,6 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/sinon/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -22120,6 +22825,36 @@ "node": "^18.0.0 || >=20.0.0" } }, + "node_modules/size-limit/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": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/size-limit/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": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -23216,6 +23951,63 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -23927,6 +24719,22 @@ "typedoc": "0.26.x || 0.27.x" } }, + "node_modules/typedoc/node_modules/minimatch": { + "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": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", @@ -23995,6 +24803,15 @@ "dev": true, "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-canonical-property-names-ecmascript": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", @@ -24125,9 +24942,9 @@ } }, "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==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", "dev": true, "funding": [ { @@ -24502,6 +25319,62 @@ } } }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-middleware/node_modules/memfs": { + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.50.0.tgz", + "integrity": "sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + } + }, "node_modules/webpack-dev-middleware/node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -24512,17 +25385,37 @@ "node": ">= 0.6" } }, - "node_modules/webpack-dev-middleware/node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 0.6" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, "node_modules/webpack-dev-server": { @@ -24597,29 +25490,34 @@ "node": ">= 0.6" } }, - "node_modules/webpack-dev-server/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "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" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://paulmillr.com/funding/" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "peerDependencies": { + "ajv": "^8.8.2" } }, "node_modules/webpack-dev-server/node_modules/content-disposition": { @@ -24768,6 +25666,13 @@ "node": ">= 10" } }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/webpack-dev-server/node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -24853,6 +25758,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/webpack-dev-server/node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -24943,6 +25868,94 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -25081,9 +26094,9 @@ "license": "MIT" }, "node_modules/workerpool": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", - "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", "dev": true, "license": "Apache-2.0" }, @@ -25589,6 +26602,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "packages/opentelemetry-context-async-hooks/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-context-zone": { "name": "@opentelemetry/context-zone", "version": "2.2.0", @@ -25642,6 +26662,13 @@ "zone.js": "^0.10.2 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^0.14.0 || ^0.15.0" } }, + "packages/opentelemetry-context-zone-peer-dep/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-core": { "name": "@opentelemetry/core", "version": "2.2.0", @@ -25676,6 +26703,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "packages/opentelemetry-core/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-exporter-jaeger": { "name": "@opentelemetry/exporter-jaeger", "version": "2.2.0", @@ -25705,6 +26739,13 @@ "@opentelemetry/api": "^1.0.0" } }, + "packages/opentelemetry-exporter-jaeger/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-exporter-zipkin": { "name": "@opentelemetry/exporter-zipkin", "version": "2.2.0", @@ -25747,6 +26788,13 @@ "@opentelemetry/api": "^1.0.0" } }, + "packages/opentelemetry-exporter-zipkin/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-propagator-b3": { "name": "@opentelemetry/propagator-b3", "version": "2.2.0", @@ -25770,6 +26818,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "packages/opentelemetry-propagator-b3/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-propagator-jaeger": { "name": "@opentelemetry/propagator-jaeger", "version": "2.2.0", @@ -25804,6 +26859,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "packages/opentelemetry-propagator-jaeger/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-resources": { "name": "@opentelemetry/resources", "version": "2.2.0", @@ -25840,6 +26902,13 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, + "packages/opentelemetry-resources/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-sdk-trace-base": { "name": "@opentelemetry/sdk-trace-base", "version": "2.2.0", @@ -25877,6 +26946,13 @@ "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, + "packages/opentelemetry-sdk-trace-base/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-sdk-trace-node": { "name": "@opentelemetry/sdk-trace-node", "version": "2.2.0", @@ -25905,6 +26981,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "packages/opentelemetry-sdk-trace-node/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-sdk-trace-web": { "name": "@opentelemetry/sdk-trace-web", "version": "2.2.0", @@ -25950,6 +27033,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "packages/opentelemetry-sdk-trace-web/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/opentelemetry-shim-opentracing": { "name": "@opentelemetry/shim-opentracing", "version": "2.2.0", @@ -25977,6 +27067,13 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, + "packages/opentelemetry-shim-opentracing/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/sdk-metrics": { "name": "@opentelemetry/sdk-metrics", "version": "2.2.0", @@ -26014,6 +27111,13 @@ "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, + "packages/sdk-metrics/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "packages/template": { "name": "@opentelemetry/template", "version": "2.2.0", @@ -26026,6 +27130,13 @@ "node": "^18.19.0 || >=20.6.0" } }, + "packages/template/node_modules/@types/node": { + "version": "18.6.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.6.5.tgz", + "integrity": "sha512-Xjt5ZGUa5WusGZJ4WJPbOT8QOqp6nDynVFRKcUt32bOgvXEoc6o085WNkYTMO7ifAj2isEfQQ2cseE+wT6jsRw==", + "dev": true, + "license": "MIT" + }, "semantic-conventions": { "name": "@opentelemetry/semantic-conventions", "version": "1.37.0", @@ -26048,13 +27159,6 @@ "engines": { "node": ">=14" } - }, - "semantic-conventions/node_modules/@types/node": { - "version": "14.18.63", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", - "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==", - "dev": true, - "license": "MIT" } } } From d1d59a79b8e844fd1ca7cd1d34b835179fab38ea Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 17:21:30 -0500 Subject: [PATCH 26/58] rename package --- .../{opentelemetry-configuration => configuration}/.eslintignore | 0 .../{opentelemetry-configuration => configuration}/.eslintrc.js | 0 .../{opentelemetry-configuration => configuration}/LICENSE | 0 .../{opentelemetry-configuration => configuration}/README.md | 0 .../{opentelemetry-configuration => configuration}/package.json | 0 .../src/ConfigProvider.ts | 0 .../src/EnvironmentConfigProvider.ts | 0 .../src/FileConfigProvider.ts | 0 .../src/IConfigProvider.ts | 0 .../{opentelemetry-configuration => configuration}/src/index.ts | 0 .../src/models/commonModel.ts | 0 .../src/models/configModel.ts | 0 .../src/models/loggerProviderModel.ts | 0 .../src/models/meterProviderModel.ts | 0 .../src/models/resourceModel.ts | 0 .../src/models/tracerProviderModel.ts | 0 .../{opentelemetry-configuration => configuration}/src/utils.ts | 0 .../test/ConfigProvider.test.ts | 0 .../test/fixtures/invalid.yaml | 0 .../test/fixtures/kitchen-sink.yaml | 0 .../test/fixtures/sdk-migration-config.yaml | 0 .../test/fixtures/short-config.yml | 0 .../test/fixtures/test-for-coverage.yaml | 0 .../test/utils.test.ts | 0 .../{opentelemetry-configuration => configuration}/tsconfig.json | 0 25 files changed, 0 insertions(+), 0 deletions(-) rename experimental/packages/{opentelemetry-configuration => configuration}/.eslintignore (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/.eslintrc.js (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/LICENSE (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/README.md (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/package.json (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/ConfigProvider.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/EnvironmentConfigProvider.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/FileConfigProvider.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/IConfigProvider.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/index.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/models/commonModel.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/models/configModel.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/models/loggerProviderModel.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/models/meterProviderModel.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/models/resourceModel.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/models/tracerProviderModel.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/src/utils.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/test/ConfigProvider.test.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/test/fixtures/invalid.yaml (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/test/fixtures/kitchen-sink.yaml (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/test/fixtures/sdk-migration-config.yaml (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/test/fixtures/short-config.yml (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/test/fixtures/test-for-coverage.yaml (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/test/utils.test.ts (100%) rename experimental/packages/{opentelemetry-configuration => configuration}/tsconfig.json (100%) diff --git a/experimental/packages/opentelemetry-configuration/.eslintignore b/experimental/packages/configuration/.eslintignore similarity index 100% rename from experimental/packages/opentelemetry-configuration/.eslintignore rename to experimental/packages/configuration/.eslintignore diff --git a/experimental/packages/opentelemetry-configuration/.eslintrc.js b/experimental/packages/configuration/.eslintrc.js similarity index 100% rename from experimental/packages/opentelemetry-configuration/.eslintrc.js rename to experimental/packages/configuration/.eslintrc.js diff --git a/experimental/packages/opentelemetry-configuration/LICENSE b/experimental/packages/configuration/LICENSE similarity index 100% rename from experimental/packages/opentelemetry-configuration/LICENSE rename to experimental/packages/configuration/LICENSE diff --git a/experimental/packages/opentelemetry-configuration/README.md b/experimental/packages/configuration/README.md similarity index 100% rename from experimental/packages/opentelemetry-configuration/README.md rename to experimental/packages/configuration/README.md diff --git a/experimental/packages/opentelemetry-configuration/package.json b/experimental/packages/configuration/package.json similarity index 100% rename from experimental/packages/opentelemetry-configuration/package.json rename to experimental/packages/configuration/package.json diff --git a/experimental/packages/opentelemetry-configuration/src/ConfigProvider.ts b/experimental/packages/configuration/src/ConfigProvider.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/ConfigProvider.ts rename to experimental/packages/configuration/src/ConfigProvider.ts diff --git a/experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts b/experimental/packages/configuration/src/EnvironmentConfigProvider.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts rename to experimental/packages/configuration/src/EnvironmentConfigProvider.ts diff --git a/experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts b/experimental/packages/configuration/src/FileConfigProvider.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts rename to experimental/packages/configuration/src/FileConfigProvider.ts diff --git a/experimental/packages/opentelemetry-configuration/src/IConfigProvider.ts b/experimental/packages/configuration/src/IConfigProvider.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/IConfigProvider.ts rename to experimental/packages/configuration/src/IConfigProvider.ts diff --git a/experimental/packages/opentelemetry-configuration/src/index.ts b/experimental/packages/configuration/src/index.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/index.ts rename to experimental/packages/configuration/src/index.ts diff --git a/experimental/packages/opentelemetry-configuration/src/models/commonModel.ts b/experimental/packages/configuration/src/models/commonModel.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/models/commonModel.ts rename to experimental/packages/configuration/src/models/commonModel.ts diff --git a/experimental/packages/opentelemetry-configuration/src/models/configModel.ts b/experimental/packages/configuration/src/models/configModel.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/models/configModel.ts rename to experimental/packages/configuration/src/models/configModel.ts diff --git a/experimental/packages/opentelemetry-configuration/src/models/loggerProviderModel.ts b/experimental/packages/configuration/src/models/loggerProviderModel.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/models/loggerProviderModel.ts rename to experimental/packages/configuration/src/models/loggerProviderModel.ts diff --git a/experimental/packages/opentelemetry-configuration/src/models/meterProviderModel.ts b/experimental/packages/configuration/src/models/meterProviderModel.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/models/meterProviderModel.ts rename to experimental/packages/configuration/src/models/meterProviderModel.ts diff --git a/experimental/packages/opentelemetry-configuration/src/models/resourceModel.ts b/experimental/packages/configuration/src/models/resourceModel.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/models/resourceModel.ts rename to experimental/packages/configuration/src/models/resourceModel.ts diff --git a/experimental/packages/opentelemetry-configuration/src/models/tracerProviderModel.ts b/experimental/packages/configuration/src/models/tracerProviderModel.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/models/tracerProviderModel.ts rename to experimental/packages/configuration/src/models/tracerProviderModel.ts diff --git a/experimental/packages/opentelemetry-configuration/src/utils.ts b/experimental/packages/configuration/src/utils.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/src/utils.ts rename to experimental/packages/configuration/src/utils.ts diff --git a/experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts b/experimental/packages/configuration/test/ConfigProvider.test.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/test/ConfigProvider.test.ts rename to experimental/packages/configuration/test/ConfigProvider.test.ts diff --git a/experimental/packages/opentelemetry-configuration/test/fixtures/invalid.yaml b/experimental/packages/configuration/test/fixtures/invalid.yaml similarity index 100% rename from experimental/packages/opentelemetry-configuration/test/fixtures/invalid.yaml rename to experimental/packages/configuration/test/fixtures/invalid.yaml diff --git a/experimental/packages/opentelemetry-configuration/test/fixtures/kitchen-sink.yaml b/experimental/packages/configuration/test/fixtures/kitchen-sink.yaml similarity index 100% rename from experimental/packages/opentelemetry-configuration/test/fixtures/kitchen-sink.yaml rename to experimental/packages/configuration/test/fixtures/kitchen-sink.yaml diff --git a/experimental/packages/opentelemetry-configuration/test/fixtures/sdk-migration-config.yaml b/experimental/packages/configuration/test/fixtures/sdk-migration-config.yaml similarity index 100% rename from experimental/packages/opentelemetry-configuration/test/fixtures/sdk-migration-config.yaml rename to experimental/packages/configuration/test/fixtures/sdk-migration-config.yaml diff --git a/experimental/packages/opentelemetry-configuration/test/fixtures/short-config.yml b/experimental/packages/configuration/test/fixtures/short-config.yml similarity index 100% rename from experimental/packages/opentelemetry-configuration/test/fixtures/short-config.yml rename to experimental/packages/configuration/test/fixtures/short-config.yml diff --git a/experimental/packages/opentelemetry-configuration/test/fixtures/test-for-coverage.yaml b/experimental/packages/configuration/test/fixtures/test-for-coverage.yaml similarity index 100% rename from experimental/packages/opentelemetry-configuration/test/fixtures/test-for-coverage.yaml rename to experimental/packages/configuration/test/fixtures/test-for-coverage.yaml diff --git a/experimental/packages/opentelemetry-configuration/test/utils.test.ts b/experimental/packages/configuration/test/utils.test.ts similarity index 100% rename from experimental/packages/opentelemetry-configuration/test/utils.test.ts rename to experimental/packages/configuration/test/utils.test.ts diff --git a/experimental/packages/opentelemetry-configuration/tsconfig.json b/experimental/packages/configuration/tsconfig.json similarity index 100% rename from experimental/packages/opentelemetry-configuration/tsconfig.json rename to experimental/packages/configuration/tsconfig.json From 9fd520e69ff08f33f22a21fdc1c3d705cf0aaccc Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 17:46:55 -0500 Subject: [PATCH 27/58] rename functions and objects --- experimental/CHANGELOG.md | 1 + .../{ConfigProvider.ts => ConfigFactory.ts} | 12 +- ...rovider.ts => EnvironmentConfigFactory.ts} | 6 +- ...ConfigProvider.ts => FileConfigFactory.ts} | 6 +- .../{IConfigProvider.ts => IConfigFactory.ts} | 6 +- .../packages/configuration/src/index.ts | 6 +- .../configuration/test/ConfigProvider.test.ts | 168 ++++++------------ 7 files changed, 77 insertions(+), 128 deletions(-) rename experimental/packages/configuration/src/{ConfigProvider.ts => ConfigFactory.ts} (65%) rename experimental/packages/configuration/src/{EnvironmentConfigProvider.ts => EnvironmentConfigFactory.ts} (99%) rename experimental/packages/configuration/src/{FileConfigProvider.ts => FileConfigFactory.ts} (99%) rename experimental/packages/configuration/src/{IConfigProvider.ts => IConfigFactory.ts} (83%) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index df09b7ee2d8..ecfcfcac217 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -11,6 +11,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :rocket: Features * feat(exporter-prometheus): support withoutScopeInfo option [#5993](https://github.com/open-telemetry/opentelemetry-js/pull/5993) @cjihrig +* feat(configuration): improvements on package [#xxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxx) @maryliag ### :bug: Bug Fixes diff --git a/experimental/packages/configuration/src/ConfigProvider.ts b/experimental/packages/configuration/src/ConfigFactory.ts similarity index 65% rename from experimental/packages/configuration/src/ConfigProvider.ts rename to experimental/packages/configuration/src/ConfigFactory.ts index 3236d25836c..3e44bd160d2 100644 --- a/experimental/packages/configuration/src/ConfigProvider.ts +++ b/experimental/packages/configuration/src/ConfigFactory.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { ConfigProvider } from './IConfigProvider'; -import { EnvironmentConfigProvider } from './EnvironmentConfigProvider'; -import { FileConfigProvider, hasValidConfigFile } from './FileConfigProvider'; +import { ConfigFactory } from './IConfigFactory'; +import { EnvironmentConfigFactory } from './EnvironmentConfigFactory'; +import { FileConfigFactory, hasValidConfigFile } from './FileConfigFactory'; -export function createConfigProvider(): ConfigProvider { +export function createConfigFactory(): ConfigFactory { if (hasValidConfigFile()) { - return new FileConfigProvider(); + return new FileConfigFactory(); } - return new EnvironmentConfigProvider(); + return new EnvironmentConfigFactory(); } diff --git a/experimental/packages/configuration/src/EnvironmentConfigProvider.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts similarity index 99% rename from experimental/packages/configuration/src/EnvironmentConfigProvider.ts rename to experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 6406612a869..09de2b9c0d1 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigProvider.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -25,7 +25,7 @@ import { diagLogLevelFromString, getNumberFromEnv, } from '@opentelemetry/core'; -import { ConfigProvider } from './IConfigProvider'; +import { ConfigFactory } from './IConfigFactory'; import { ExemplarFilter, ExporterDefaultHistogramAggregation, @@ -35,7 +35,7 @@ import { /** * EnvironmentConfigProvider provides a configuration based on environment variables. */ -export class EnvironmentConfigProvider implements ConfigProvider { +export class EnvironmentConfigFactory implements ConfigFactory { private _config: ConfigurationModel; constructor() { @@ -62,7 +62,7 @@ export class EnvironmentConfigProvider implements ConfigProvider { setLoggerProvider(this._config); } - getInstrumentationConfig(): ConfigurationModel { + getConfigModel(): ConfigurationModel { return this._config; } } diff --git a/experimental/packages/configuration/src/FileConfigProvider.ts b/experimental/packages/configuration/src/FileConfigFactory.ts similarity index 99% rename from experimental/packages/configuration/src/FileConfigProvider.ts rename to experimental/packages/configuration/src/FileConfigFactory.ts index 2ddd8a6c52c..fcb36667c87 100644 --- a/experimental/packages/configuration/src/FileConfigProvider.ts +++ b/experimental/packages/configuration/src/FileConfigFactory.ts @@ -21,7 +21,7 @@ import { ConfigurationModel, initializeDefaultConfiguration, } from './models/configModel'; -import { ConfigProvider } from './IConfigProvider'; +import { ConfigFactory } from './IConfigFactory'; import * as fs from 'fs'; import * as yaml from 'yaml'; import { @@ -61,7 +61,7 @@ import { ViewStream, } from './models/meterProviderModel'; -export class FileConfigProvider implements ConfigProvider { +export class FileConfigFactory implements ConfigFactory { private _config: ConfigurationModel; constructor() { @@ -69,7 +69,7 @@ export class FileConfigProvider implements ConfigProvider { parseConfigFile(this._config); } - getInstrumentationConfig(): ConfigurationModel { + getConfigModel(): ConfigurationModel { return this._config; } } diff --git a/experimental/packages/configuration/src/IConfigProvider.ts b/experimental/packages/configuration/src/IConfigFactory.ts similarity index 83% rename from experimental/packages/configuration/src/IConfigProvider.ts rename to experimental/packages/configuration/src/IConfigFactory.ts index 752b4c8298f..eaf7b099450 100644 --- a/experimental/packages/configuration/src/IConfigProvider.ts +++ b/experimental/packages/configuration/src/IConfigFactory.ts @@ -16,11 +16,11 @@ import { ConfigurationModel } from './models/configModel'; -export interface ConfigProvider { +export interface ConfigFactory { /** - * Returns a ConfigurationModel, used for instrumentation configuration + * Returns a ConfigurationModel. * * @returns ConfigurationModel a Configuration Model with all configuration attributes */ - getInstrumentationConfig(): ConfigurationModel; + getConfigModel(): ConfigurationModel; } diff --git a/experimental/packages/configuration/src/index.ts b/experimental/packages/configuration/src/index.ts index fd2dcbefc6d..a939431e4e9 100644 --- a/experimental/packages/configuration/src/index.ts +++ b/experimental/packages/configuration/src/index.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export type { ConfigProvider } from './IConfigProvider'; -export type { ConfigurationModel as Configuration } from './models/configModel'; -export { createConfigProvider } from './ConfigProvider'; +export type { ConfigFactory } from './IConfigFactory'; +export type { ConfigurationModel } from './models/configModel'; +export { createConfigFactory } from './ConfigFactory'; diff --git a/experimental/packages/configuration/test/ConfigProvider.test.ts b/experimental/packages/configuration/test/ConfigProvider.test.ts index 2c3d6050075..6dc65282927 100644 --- a/experimental/packages/configuration/test/ConfigProvider.test.ts +++ b/experimental/packages/configuration/test/ConfigProvider.test.ts @@ -15,9 +15,9 @@ */ import * as assert from 'assert'; -import { Configuration } from '../src'; +import { ConfigurationModel } from '../src'; import { DiagLogLevel } from '@opentelemetry/api'; -import { createConfigProvider } from '../src/ConfigProvider'; +import { createConfigFactory } from '../src/ConfigFactory'; import { OtlpHttpEncoding } from '../src/models/commonModel'; import { ExemplarFilter, @@ -32,8 +32,7 @@ import { setPropagators, setResources, setTracerProvider, -} from '../src/EnvironmentConfigProvider'; -import { ConfigurationModel } from '../src/models/configModel'; +} from '../src/EnvironmentConfigFactory'; import { parseConfigFile, setResourceAttributes, @@ -43,9 +42,9 @@ import { setLoggerProvider as setFileLoggerProvider, setMeterProvider as setFileMeterProvider, getTemporalityPreference, -} from '../src/FileConfigProvider'; +} from '../src/FileConfigFactory'; -const defaultConfig: Configuration = { +const defaultConfig: ConfigurationModel = { disabled: false, log_level: DiagLogLevel.INFO, node_resource_detectors: ['all'], @@ -136,7 +135,7 @@ const defaultConfig: Configuration = { }, }; -const configFromFile: Configuration = { +const configFromFile: ConfigurationModel = { disabled: false, log_level: DiagLogLevel.INFO, node_resource_detectors: ['all'], @@ -627,7 +626,7 @@ const configFromFile: Configuration = { }, }; -const defaultConfigFromFileWithEnvVariables: Configuration = { +const defaultConfigFromFileWithEnvVariables: ConfigurationModel = { disabled: false, log_level: DiagLogLevel.INFO, node_resource_detectors: ['all'], @@ -755,56 +754,44 @@ describe('ConfigProvider', function () { describe('get values from environment variables', function () { it('should initialize config with default values', function () { - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - defaultConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), defaultConfig); }); it('should return config with disable true', function () { process.env.OTEL_SDK_DISABLED = 'true'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, disabled: true, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with log level as debug', function () { process.env.OTEL_LOG_LEVEL = 'DEBUG'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, log_level: DiagLogLevel.DEBUG, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with a list of options for node resource detectors', function () { process.env.OTEL_NODE_RESOURCE_DETECTORS = 'env,host, serviceinstance'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, node_resource_detectors: ['env', 'host', 'serviceinstance'], }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with a resource attribute list', function () { process.env.OTEL_RESOURCE_ATTRIBUTES = 'service.namespace=my-namespace,service.version=1.0.0'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, resource: { attributes_list: @@ -823,16 +810,13 @@ describe('ConfigProvider', function () { ], }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with custom service name', function () { process.env.OTEL_SERVICE_NAME = 'my service name'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, resource: { attributes: [ @@ -844,44 +828,35 @@ describe('ConfigProvider', function () { ], }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with custom attribute_limits', function () { process.env.OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT = '100'; process.env.OTEL_ATTRIBUTE_COUNT_LIMIT = '200'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, attribute_limits: { attribute_value_length_limit: 100, attribute_count_limit: 200, }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with custom propagator', function () { process.env.OTEL_PROPAGATORS = 'tracecontext,jaeger'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, propagator: { composite: [{ tracecontext: null }, { jaeger: null }], composite_list: 'tracecontext,jaeger', }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with custom tracer_provider', function () { @@ -906,7 +881,7 @@ describe('ConfigProvider', function () { process.env.OTEL_EXPORTER_OTLP_TRACES_COMPRESSION = 'gzip'; process.env.OTEL_EXPORTER_OTLP_TRACES_TIMEOUT = '2000'; process.env.OTEL_EXPORTER_OTLP_TRACES_HEADERS = 'host=localhost'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { limits: { @@ -950,11 +925,8 @@ describe('ConfigProvider', function () { }, }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with custom meter_provider', function () { @@ -975,7 +947,7 @@ describe('ConfigProvider', function () { process.env.OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION = 'base2_exponential_bucket_histogram'; process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'always_on'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, meter_provider: { readers: [ @@ -1003,11 +975,8 @@ describe('ConfigProvider', function () { exemplar_filter: ExemplarFilter.AlwaysOn, }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should return config with custom logger_provider', function () { @@ -1026,7 +995,7 @@ describe('ConfigProvider', function () { process.env.OTEL_EXPORTER_OTLP_LOGS_COMPRESSION = 'gzip'; process.env.OTEL_EXPORTER_OTLP_LOGS_TIMEOUT = '700'; process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'host=localhost'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, logger_provider: { limits: { @@ -1057,11 +1026,8 @@ describe('ConfigProvider', function () { ], }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should use backup options for exporters', function () { @@ -1074,7 +1040,7 @@ describe('ConfigProvider', function () { process.env.OTEL_EXPORTER_OTLP_COMPRESSION = 'backup_compression'; process.env.OTEL_EXPORTER_OTLP_TIMEOUT = '12000'; process.env.OTEL_EXPORTER_OTLP_HEADERS = 'backup_headers=123'; - const expectedConfig: Configuration = { + const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { processors: [ @@ -1151,11 +1117,8 @@ describe('ConfigProvider', function () { ], }, }; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('checks to keep good code coverage', function () { @@ -1348,50 +1311,41 @@ describe('ConfigProvider', function () { it('should initialize config with default values from valid config file', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = 'test/fixtures/kitchen-sink.yaml'; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - configFromFile - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), configFromFile); }); it('should return error from invalid config file', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = './fixtures/kitchen-sink.txt'; assert.throws(() => { - createConfigProvider(); + createConfigFactory(); }); }); it('should return error from invalid config file format', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = 'test/fixtures/invalid.yaml'; assert.throws(() => { - createConfigProvider(); + createConfigFactory(); }); }); it('should initialize config with default values with empty string for config file', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = ''; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - defaultConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), defaultConfig); }); it('should initialize config with default values with all whitespace for config file', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = ' '; - const configProvider = createConfigProvider(); - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - defaultConfig - ); + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), defaultConfig); }); it('should initialize config with default values from valid short config file', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = 'test/fixtures/short-config.yml'; - const configProvider = createConfigProvider(); - const expectedConfig: Configuration = { + const configProvider = createConfigFactory(); + const expectedConfig: ConfigurationModel = { ...defaultConfig, resource: { attributes_list: 'service.instance.id=123', @@ -1404,10 +1358,7 @@ describe('ConfigProvider', function () { ], }, }; - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should initialize config with config file that contains environment variables', function () { @@ -1470,8 +1421,8 @@ describe('ConfigProvider', function () { process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'logs-header'; process.env.OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT = '28'; process.env.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT = '29'; - const configProvider = createConfigProvider(); - const expectedConfig: Configuration = { + const configProvider = createConfigFactory(); + const expectedConfig: ConfigurationModel = { ...defaultConfigFromFileWithEnvVariables, resource: { attributes_list: 'attributes', @@ -1592,19 +1543,16 @@ describe('ConfigProvider', function () { }, }; - assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), - expectedConfig - ); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); it('should initialize config with fallbacks defined in config file when corresponding environment variables are not defined', function () { process.env.OTEL_EXPERIMENTAL_CONFIG_FILE = 'test/fixtures/sdk-migration-config.yaml'; - const configProvider = createConfigProvider(); + const configProvider = createConfigFactory(); assert.deepStrictEqual( - configProvider.getInstrumentationConfig(), + configProvider.getConfigModel(), defaultConfigFromFileWithEnvVariables ); }); From 2d700a747f3318eaf1e11f9392a089826ef65280 Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 17:52:53 -0500 Subject: [PATCH 28/58] update changelog --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index ecfcfcac217..17f23f6449d 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -11,7 +11,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :rocket: Features * feat(exporter-prometheus): support withoutScopeInfo option [#5993](https://github.com/open-telemetry/opentelemetry-js/pull/5993) @cjihrig -* feat(configuration): improvements on package [#xxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxx) @maryliag +* feat(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag ### :bug: Bug Fixes From ac283ba17cb4ae0d808e447297fede5e3d9b1d02 Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 18:05:24 -0500 Subject: [PATCH 29/58] update import --- experimental/packages/opentelemetry-sdk-node/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index 3c8deb077d3..31e68f86d44 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -50,7 +50,7 @@ import { import { B3InjectEncoding, B3Propagator } from '@opentelemetry/propagator-b3'; import { JaegerPropagator } from '@opentelemetry/propagator-jaeger'; import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks'; -import { Configuration } from '../../opentelemetry-configuration/build/src'; +import { Configuration } from '@opentelemetry/configuration'; const RESOURCE_DETECTOR_ENVIRONMENT = 'env'; const RESOURCE_DETECTOR_HOST = 'host'; From b730aa91d0d971a50b87729ebc1d190e5928d3a4 Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 18:10:22 -0500 Subject: [PATCH 30/58] more updates to package files --- .../packages/configuration/package.json | 3 +- package-lock.json | 54 +++++++++---------- tsconfig.json | 7 +-- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/experimental/packages/configuration/package.json b/experimental/packages/configuration/package.json index db72c2365d1..5a4f10c0a44 100644 --- a/experimental/packages/configuration/package.json +++ b/experimental/packages/configuration/package.json @@ -1,6 +1,5 @@ { "name": "@opentelemetry/configuration", - "private": true, "version": "0.208.0", "description": "OpenTelemetry Configuration", "main": "build/src/index.js", @@ -56,6 +55,6 @@ "ts-loader": "9.5.4", "typescript": "5.0.4" }, - "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/opentelemetry-configuration", + "homepage": "https://github.com/open-telemetry/opentelemetry-js/tree/main/experimental/packages/configuration", "sideEffects": false } diff --git a/package-lock.json b/package-lock.json index c1889b875d2..d52ac683f2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -489,6 +489,32 @@ "dev": true, "license": "MIT" }, + "experimental/packages/configuration": { + "name": "@opentelemetry/configuration", + "version": "0.208.0", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.2.0", + "yaml": "^2.0.0" + }, + "devDependencies": { + "@opentelemetry/api": "^1.9.0", + "@types/mocha": "10.0.10", + "@types/node": "18.6.5", + "@types/sinon": "17.0.4", + "mocha": "11.7.5", + "nyc": "17.1.0", + "sinon": "18.0.1", + "ts-loader": "9.5.4", + "typescript": "5.0.4" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, "experimental/packages/exporter-logs-otlp-grpc": { "name": "@opentelemetry/exporter-logs-otlp-grpc", "version": "0.208.0", @@ -757,32 +783,6 @@ "@opentelemetry/api": "^1.3.0" } }, - "experimental/packages/opentelemetry-configuration": { - "name": "@opentelemetry/configuration", - "version": "0.208.0", - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "2.2.0", - "yaml": "^2.0.0" - }, - "devDependencies": { - "@opentelemetry/api": "^1.9.0", - "@types/mocha": "10.0.10", - "@types/node": "18.6.5", - "@types/sinon": "17.0.4", - "mocha": "11.7.5", - "nyc": "17.1.0", - "sinon": "18.0.1", - "ts-loader": "9.5.4", - "typescript": "5.0.4" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.9.0" - } - }, "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc": { "name": "@opentelemetry/exporter-metrics-otlp-grpc", "version": "0.208.0", @@ -6287,7 +6287,7 @@ "link": true }, "node_modules/@opentelemetry/configuration": { - "resolved": "experimental/packages/opentelemetry-configuration", + "resolved": "experimental/packages/configuration", "link": true }, "node_modules/@opentelemetry/context-async-hooks": { diff --git a/tsconfig.json b/tsconfig.json index 58f4ff7e340..4259065d80b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "entryPoints": [ "api", "experimental/packages/api-logs", + "experimental/packages/configuration", "experimental/packages/exporter-logs-otlp-grpc", "experimental/packages/exporter-logs-otlp-http", "experimental/packages/exporter-logs-otlp-proto", @@ -64,6 +65,9 @@ { "path": "experimental/packages/api-logs" }, + { + "path": "experimental/packages/configuration" + }, { "path": "experimental/packages/exporter-logs-otlp-grpc" }, @@ -85,9 +89,6 @@ { "path": "experimental/packages/opentelemetry-browser-detector" }, - { - "path": "experimental/packages/opentelemetry-configuration" - }, { "path": "experimental/packages/opentelemetry-exporter-metrics-otlp-grpc" }, From 5ce7acc10ee5b45d462b45b8c4a71613b71a3aa6 Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 18:16:30 -0500 Subject: [PATCH 31/58] update usage from latest config package --- .../packages/opentelemetry-sdk-node/src/sdk.ts | 12 ++++++------ .../packages/opentelemetry-sdk-node/src/utils.ts | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 8c3cc9c74da..b9ab592d460 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -73,9 +73,9 @@ import { getInstanceID, } from './utils'; import { - ConfigProvider, - Configuration, - createConfigProvider, + ConfigFactory, + ConfigurationModel, + createConfigFactory, } from '@opentelemetry/configuration'; import { ATTR_SERVICE_INSTANCE_ID } from './semconv'; @@ -223,7 +223,7 @@ function configureMetricProviderFromEnv(): IMetricReader[] { * nodeSdk.start(); // registers all configured SDK components */ export class NodeSDK { - private _config: Configuration; + private _config: ConfigurationModel; private _tracerProviderConfig?: TracerProviderConfig; private _loggerProviderConfig?: LoggerProviderConfig; private _meterProviderConfig?: MeterProviderConfig; @@ -246,8 +246,8 @@ export class NodeSDK { * Create a new NodeJS SDK instance */ public constructor(configuration: Partial = {}) { - const configProvider: ConfigProvider = createConfigProvider(); - this._config = configProvider.getInstrumentationConfig(); + const configFactory: ConfigFactory = createConfigFactory(); + this._config = configFactory.getConfigModel(); if (this._config.disabled) { this._disabled = true; // Functions with possible side-effects are set diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index 31e68f86d44..49aad42464c 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -50,7 +50,7 @@ import { import { B3InjectEncoding, B3Propagator } from '@opentelemetry/propagator-b3'; import { JaegerPropagator } from '@opentelemetry/propagator-jaeger'; import { AsyncLocalStorageContextManager } from '@opentelemetry/context-async-hooks'; -import { Configuration } from '@opentelemetry/configuration'; +import { ConfigurationModel } from '@opentelemetry/configuration'; const RESOURCE_DETECTOR_ENVIRONMENT = 'env'; const RESOURCE_DETECTOR_HOST = 'host'; @@ -59,7 +59,7 @@ const RESOURCE_DETECTOR_PROCESS = 'process'; const RESOURCE_DETECTOR_SERVICE_INSTANCE_ID = 'serviceinstance'; export function getResourceDetectorsFromEnv( - config: Configuration + config: ConfigurationModel ): Array { // When updating this list, make sure to also update the section `resourceDetectors` on README. const resourceDetectors = new Map([ @@ -89,7 +89,7 @@ export function getResourceDetectorsFromEnv( }); } -export function getInstanceID(config: Configuration): string | undefined { +export function getInstanceID(config: ConfigurationModel): string | undefined { if (config.resource?.attributes) { for (let i = 0; i < config.resource.attributes.length; i++) { const element = config.resource.attributes[i]; From 2d640538c69ce2173b18d015746eded0648d9960 Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 18:17:45 -0500 Subject: [PATCH 32/58] update changelog --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 4956771772e..4d8672405f4 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -12,6 +12,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(exporter-prometheus): support withoutScopeInfo option [#5993](https://github.com/open-telemetry/opentelemetry-js/pull/5993) @cjihrig * feat(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag +* feat(opentelemetry-sdk-node): use declarative config for resource attributes [#6044](https://github.com/open-telemetry/opentelemetry-js/pull/6044) @maryliag ### :bug: Bug Fixes @@ -24,7 +25,6 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ## 0.208.0 * feat(opentelemetry-configuration): set attributes from attribute list from env variables [#6043](https://github.com/open-telemetry/opentelemetry-js/pull/6043) @maryliag -* feat(opentelemetry-sdk-node): use declarative config for resource attributes [#6044](https://github.com/open-telemetry/opentelemetry-js/pull/6044) @maryliag ### :boom: Breaking Changes From 6270aa5f76c03184b721b720cbc1eb3a93d1a24d Mon Sep 17 00:00:00 2001 From: maryliag Date: Wed, 12 Nov 2025 18:51:35 -0500 Subject: [PATCH 33/58] update changelog --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 4d8672405f4..a673a46d829 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -11,7 +11,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :rocket: Features * feat(exporter-prometheus): support withoutScopeInfo option [#5993](https://github.com/open-telemetry/opentelemetry-js/pull/5993) @cjihrig -* feat(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag +* refactor(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag * feat(opentelemetry-sdk-node): use declarative config for resource attributes [#6044](https://github.com/open-telemetry/opentelemetry-js/pull/6044) @maryliag ### :bug: Bug Fixes From ffb3ea5035cca18f80545c9b5617dada01c55586 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 09:58:00 -0500 Subject: [PATCH 34/58] set exporter type from env variable --- experimental/CHANGELOG.md | 3 +- .../src/EnvironmentConfigFactory.ts | 95 ++++++++++--------- ...Provider.test.ts => ConfigFactory.test.ts} | 52 ++++++++++ 3 files changed, 106 insertions(+), 44 deletions(-) rename experimental/packages/configuration/test/{ConfigProvider.test.ts => ConfigFactory.test.ts} (97%) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 44f85b4b660..894031e058a 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -11,7 +11,8 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 ### :rocket: Features * feat(exporter-prometheus): support withoutScopeInfo option [#5993](https://github.com/open-telemetry/opentelemetry-js/pull/5993) @cjihrig -* feat(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag +* refactor(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag +* feat(configuration): set logger provider exporter type from env variable [#xxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxx) @maryliag ### :bug: Bug Fixes diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 09de2b9c0d1..82101ac79a5 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -456,55 +456,64 @@ export function setLoggerProvider(config: ConfigurationModel): void { batch.max_export_batch_size = maxExportBatchSize; } - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') - ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` - : null); - if (endpoint && batch.exporter.otlp_http) { - batch.exporter.otlp_http.endpoint = endpoint; - } + const exporterType = getStringFromEnv('OTEL_LOGS_EXPORTER'); + if (exporterType === 'console') { + batch.exporter = { console: {} }; + } else if (exporterType === 'none') { + batch.exporter = {}; + } else { + // 'otlp' and default + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') + ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` + : null); + if (endpoint && batch.exporter.otlp_http) { + batch.exporter.otlp_http.endpoint = endpoint; + } - const certificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); - if (certificateFile && batch.exporter.otlp_http) { - batch.exporter.otlp_http.certificate_file = certificateFile; - } + const certificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); + if (certificateFile && batch.exporter.otlp_http) { + batch.exporter.otlp_http.certificate_file = certificateFile; + } - const clientKeyFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); - if (clientKeyFile && batch.exporter.otlp_http) { - batch.exporter.otlp_http.client_key_file = clientKeyFile; - } + const clientKeyFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); + if (clientKeyFile && batch.exporter.otlp_http) { + batch.exporter.otlp_http.client_key_file = clientKeyFile; + } - const clientCertificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); - if (clientCertificateFile && batch.exporter.otlp_http) { - batch.exporter.otlp_http.client_certificate_file = clientCertificateFile; - } + const clientCertificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); + if (clientCertificateFile && batch.exporter.otlp_http) { + batch.exporter.otlp_http.client_certificate_file = + clientCertificateFile; + } - const compression = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); - if (compression && batch.exporter.otlp_http) { - batch.exporter.otlp_http.compression = compression; - } + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); + if (compression && batch.exporter.otlp_http) { + batch.exporter.otlp_http.compression = compression; + } - const timeout = - getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? - getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); - if (timeout && batch.exporter.otlp_http) { - batch.exporter.otlp_http.timeout = timeout; - } + const timeout = + getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); + if (timeout && batch.exporter.otlp_http) { + batch.exporter.otlp_http.timeout = timeout; + } - const headersList = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); - if (headersList && batch.exporter.otlp_http) { - batch.exporter.otlp_http.headers_list = headersList; + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); + if (headersList && batch.exporter.otlp_http) { + batch.exporter.otlp_http.headers_list = headersList; + } } config.logger_provider.processors[0].batch = batch; diff --git a/experimental/packages/configuration/test/ConfigProvider.test.ts b/experimental/packages/configuration/test/ConfigFactory.test.ts similarity index 97% rename from experimental/packages/configuration/test/ConfigProvider.test.ts rename to experimental/packages/configuration/test/ConfigFactory.test.ts index 6dc65282927..3d2a03ddc80 100644 --- a/experimental/packages/configuration/test/ConfigProvider.test.ts +++ b/experimental/packages/configuration/test/ConfigFactory.test.ts @@ -1030,6 +1030,58 @@ describe('ConfigProvider', function () { assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); + it('should return config with logger_provider with console exporter', function () { + process.env.OTEL_LOGS_EXPORTER = 'console'; + const expectedConfig: ConfigurationModel = { + ...defaultConfig, + logger_provider: { + limits: { + attribute_count_limit: 128, + }, + processors: [ + { + batch: { + schedule_delay: 1000, + export_timeout: 30000, + max_queue_size: 2048, + max_export_batch_size: 512, + exporter: { + console: {}, + }, + }, + }, + ], + }, + }; + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); + }); + + it('should return config with logger_provider with no exporter', function () { + process.env.OTEL_LOGS_EXPORTER = 'none'; + const expectedConfig: ConfigurationModel = { + ...defaultConfig, + logger_provider: { + limits: { + attribute_count_limit: 128, + }, + processors: [ + { + batch: { + schedule_delay: 1000, + export_timeout: 30000, + max_queue_size: 2048, + max_export_batch_size: 512, + exporter: {}, + }, + }, + ], + }, + }; + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); + }); + it('should use backup options for exporters', function () { process.env.OTEL_EXPORTER_OTLP_CERTIFICATE = 'backup_certificate_file.pem'; From 3b1c78148b728e4064aa98a8b94d885a6e33f498 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 10:35:09 -0500 Subject: [PATCH 35/58] update chaneglog --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 894031e058a..959cc309b6b 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -12,7 +12,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(exporter-prometheus): support withoutScopeInfo option [#5993](https://github.com/open-telemetry/opentelemetry-js/pull/5993) @cjihrig * refactor(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag -* feat(configuration): set logger provider exporter type from env variable [#xxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxx) @maryliag +* feat(configuration): set logger provider exporter type from env variable [#6104](https://github.com/open-telemetry/opentelemetry-js/pull/6104) @maryliag ### :bug: Bug Fixes From 511902885f20bd238c0c3b67bdb9f8b23b6686a0 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 14:15:59 -0500 Subject: [PATCH 36/58] handle list --- .../src/EnvironmentConfigFactory.ts | 124 +++++++++--------- 1 file changed, 65 insertions(+), 59 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 82101ac79a5..f6437af06c0 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -456,66 +456,72 @@ export function setLoggerProvider(config: ConfigurationModel): void { batch.max_export_batch_size = maxExportBatchSize; } - const exporterType = getStringFromEnv('OTEL_LOGS_EXPORTER'); - if (exporterType === 'console') { - batch.exporter = { console: {} }; - } else if (exporterType === 'none') { - batch.exporter = {}; - } else { - // 'otlp' and default - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') - ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` - : null); - if (endpoint && batch.exporter.otlp_http) { - batch.exporter.otlp_http.endpoint = endpoint; - } - - const certificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); - if (certificateFile && batch.exporter.otlp_http) { - batch.exporter.otlp_http.certificate_file = certificateFile; - } - - const clientKeyFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); - if (clientKeyFile && batch.exporter.otlp_http) { - batch.exporter.otlp_http.client_key_file = clientKeyFile; - } - - const clientCertificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); - if (clientCertificateFile && batch.exporter.otlp_http) { - batch.exporter.otlp_http.client_certificate_file = - clientCertificateFile; - } - - const compression = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); - if (compression && batch.exporter.otlp_http) { - batch.exporter.otlp_http.compression = compression; - } - - const timeout = - getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? - getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); - if (timeout && batch.exporter.otlp_http) { - batch.exporter.otlp_http.timeout = timeout; - } - - const headersList = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); - if (headersList && batch.exporter.otlp_http) { - batch.exporter.otlp_http.headers_list = headersList; + const exportersType = getStringListFromEnv('OTEL_LOGS_EXPORTER') ?? ['otlp']; + if (exportersType) { + config.logger_provider.processors = []; + for (let i = 0; i < exportersType.length; i++) { + const exporterType = exportersType[i]; + const batchInfo = { ...batch}; + if (exporterType === 'console') { + batchInfo.exporter = { console: {} }; + } else if (exporterType === 'none') { + batchInfo.exporter = {}; + } else { + // 'otlp' and default + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') + ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` + : null); + if (endpoint && batchInfo.exporter.otlp_http) { + batchInfo.exporter.otlp_http.endpoint = endpoint; + } + + const certificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); + if (certificateFile && batchInfo.exporter.otlp_http) { + batchInfo.exporter.otlp_http.certificate_file = certificateFile; + } + + const clientKeyFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); + if (clientKeyFile && batchInfo.exporter.otlp_http) { + batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; + } + + const clientCertificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); + if (clientCertificateFile && batchInfo.exporter.otlp_http) { + batchInfo.exporter.otlp_http.client_certificate_file = + clientCertificateFile; + } + + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); + if (compression && batchInfo.exporter.otlp_http) { + batchInfo.exporter.otlp_http.compression = compression; + } + + const timeout = + getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); + if (timeout && batchInfo.exporter.otlp_http) { + batchInfo.exporter.otlp_http.timeout = timeout; + } + + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); + if (headersList && batchInfo.exporter.otlp_http) { + batchInfo.exporter.otlp_http.headers_list = headersList; + } + } + config.logger_provider.processors.push({ batch: batchInfo }); } } - - config.logger_provider.processors[0].batch = batch; } } From 75bae8cc01ac3ca9d508527ff2f2a2c4aed71e9b Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 14:25:26 -0500 Subject: [PATCH 37/58] add tests --- .../configuration/test/ConfigFactory.test.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/experimental/packages/configuration/test/ConfigFactory.test.ts b/experimental/packages/configuration/test/ConfigFactory.test.ts index 3d2a03ddc80..bd0664a40ae 100644 --- a/experimental/packages/configuration/test/ConfigFactory.test.ts +++ b/experimental/packages/configuration/test/ConfigFactory.test.ts @@ -1082,6 +1082,48 @@ describe('ConfigProvider', function () { assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); + it('should return config with logger_provider with console exporter', function () { + process.env.OTEL_LOGS_EXPORTER = 'otlp,console'; + const expectedConfig: ConfigurationModel = { + ...defaultConfig, + logger_provider: { + limits: { + attribute_count_limit: 128, + }, + processors: [ + { + batch: { + schedule_delay: 1000, + export_timeout: 30000, + max_queue_size: 2048, + max_export_batch_size: 512, + exporter: { + otlp_http: { + endpoint: 'http://localhost:4318/v1/logs', + timeout: 10000, + encoding: OtlpHttpEncoding.Protobuf, + }, + }, + }, + }, + { + batch: { + schedule_delay: 1000, + export_timeout: 30000, + max_queue_size: 2048, + max_export_batch_size: 512, + exporter: { + console: {}, + }, + }, + }, + ], + }, + }; + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); + }); + it('should use backup options for exporters', function () { process.env.OTEL_EXPORTER_OTLP_CERTIFICATE = 'backup_certificate_file.pem'; From 8e04a4c6788ca3fe6e7ece6368a250ee05e76f4b Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 14:26:55 -0500 Subject: [PATCH 38/58] fix lint --- .../packages/configuration/src/EnvironmentConfigFactory.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index f6437af06c0..c5ca82f97c2 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -456,12 +456,14 @@ export function setLoggerProvider(config: ConfigurationModel): void { batch.max_export_batch_size = maxExportBatchSize; } - const exportersType = getStringListFromEnv('OTEL_LOGS_EXPORTER') ?? ['otlp']; + const exportersType = getStringListFromEnv('OTEL_LOGS_EXPORTER') ?? [ + 'otlp', + ]; if (exportersType) { config.logger_provider.processors = []; for (let i = 0; i < exportersType.length; i++) { const exporterType = exportersType[i]; - const batchInfo = { ...batch}; + const batchInfo = { ...batch }; if (exporterType === 'console') { batchInfo.exporter = { console: {} }; } else if (exporterType === 'none') { From 52eaff1b8c143e6adcde01e5ae997e38bcacae1f Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 16:21:17 -0500 Subject: [PATCH 39/58] handle protocol --- .../src/EnvironmentConfigFactory.ts | 106 ++++++++++++------ .../configuration/test/ConfigFactory.test.ts | 76 +++++++++++++ 2 files changed, 148 insertions(+), 34 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index c5ca82f97c2..58348a9c055 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -31,6 +31,7 @@ import { ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, } from './models/meterProviderModel'; +import { OtlpHttpEncoding } from './models/commonModel'; /** * EnvironmentConfigProvider provides a configuration based on environment variables. @@ -469,57 +470,94 @@ export function setLoggerProvider(config: ConfigurationModel): void { } else if (exporterType === 'none') { batchInfo.exporter = {}; } else { - // 'otlp' and default - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') - ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` - : null); - if (endpoint && batchInfo.exporter.otlp_http) { - batchInfo.exporter.otlp_http.endpoint = endpoint; - } - + // 'otlp' and default + const protocol = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? 'http/protobuf'); const certificateFile = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); - if (certificateFile && batchInfo.exporter.otlp_http) { - batchInfo.exporter.otlp_http.certificate_file = certificateFile; - } - const clientKeyFile = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); - if (clientKeyFile && batchInfo.exporter.otlp_http) { - batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; - } - const clientCertificateFile = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); - if (clientCertificateFile && batchInfo.exporter.otlp_http) { - batchInfo.exporter.otlp_http.client_certificate_file = - clientCertificateFile; - } - const compression = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); - if (compression && batchInfo.exporter.otlp_http) { - batchInfo.exporter.otlp_http.compression = compression; - } - const timeout = getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? - getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT'); - if (timeout && batchInfo.exporter.otlp_http) { - batchInfo.exporter.otlp_http.timeout = timeout; - } - + (getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? 10000); const headersList = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); - if (headersList && batchInfo.exporter.otlp_http) { - batchInfo.exporter.otlp_http.headers_list = headersList; + + if (protocol === 'grpc') { + delete batchInfo.exporter.otlp_http; + batchInfo.exporter.otlp_grpc = {}; + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT'); + if (endpoint) { + batchInfo.exporter.otlp_grpc.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_grpc.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_grpc.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_grpc.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_grpc.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_grpc.headers_list = headersList; + } + + } else { + if (batchInfo.exporter.otlp_http == null) { + batchInfo.exporter.otlp_http = {}; + } + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') + ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` + : null); + if (endpoint) { + batchInfo.exporter.otlp_http.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_http.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_http.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_http.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_http.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_http.headers_list = headersList; + } + + if (protocol === 'http/json') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.JSON; + } else if (protocol === 'http/protobuf') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.Protobuf; + } } } config.logger_provider.processors.push({ batch: batchInfo }); diff --git a/experimental/packages/configuration/test/ConfigFactory.test.ts b/experimental/packages/configuration/test/ConfigFactory.test.ts index bd0664a40ae..2a8b8e9ff1f 100644 --- a/experimental/packages/configuration/test/ConfigFactory.test.ts +++ b/experimental/packages/configuration/test/ConfigFactory.test.ts @@ -1124,6 +1124,82 @@ describe('ConfigProvider', function () { assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); + it('should return config with logger_provider with otlp grpc exporter', function () { + process.env.OTEL_LOGS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'grpc'; + process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://localhost:4317'; + process.env.OTEL_EXPORTER_OTLP_TIMEOUT = '10000'; + process.env.OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE = 'log-cert.pem'; + process.env.OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY = 'log-key.pem'; + process.env.OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE = + 'log-client-cert.pem'; + process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'host=localhost'; + process.env.OTEL_EXPORTER_OTLP_LOGS_COMPRESSION = 'gzip'; + const expectedConfig: ConfigurationModel = { + ...defaultConfig, + logger_provider: { + limits: { + attribute_count_limit: 128, + }, + processors: [ + { + batch: { + schedule_delay: 1000, + export_timeout: 30000, + max_queue_size: 2048, + max_export_batch_size: 512, + exporter: { + otlp_grpc: { + endpoint: 'http://localhost:4317', + timeout: 10000, + certificate_file: 'log-cert.pem', + client_key_file: 'log-key.pem', + client_certificate_file: 'log-client-cert.pem', + headers_list: 'host=localhost', + compression: 'gzip', + }, + }, + }, + }, + ], + }, + }; + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); + }); + + it('should return config with logger_provider with otlp http/json exporter', function () { + process.env.OTEL_LOGS_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/json'; + const expectedConfig: ConfigurationModel = { + ...defaultConfig, + logger_provider: { + limits: { + attribute_count_limit: 128, + }, + processors: [ + { + batch: { + schedule_delay: 1000, + export_timeout: 30000, + max_queue_size: 2048, + max_export_batch_size: 512, + exporter: { + otlp_http: { + endpoint: 'http://localhost:4318/v1/logs', + timeout: 10000, + encoding: OtlpHttpEncoding.JSON, + }, + }, + }, + }, + ], + }, + }; + const configProvider = createConfigFactory(); + assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); + }); + it('should use backup options for exporters', function () { process.env.OTEL_EXPORTER_OTLP_CERTIFICATE = 'backup_certificate_file.pem'; From f21152fa1e6258222d8b76054b319eeef5201147 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 20:23:20 -0500 Subject: [PATCH 40/58] lint --- .../configuration/src/EnvironmentConfigFactory.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 58348a9c055..c093aea5a45 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -470,9 +470,11 @@ export function setLoggerProvider(config: ConfigurationModel): void { } else if (exporterType === 'none') { batchInfo.exporter = {}; } else { - // 'otlp' and default - const protocol = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? 'http/protobuf'); + // 'otlp' and default + const protocol = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? + 'http/protobuf'; const certificateFile = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); @@ -487,7 +489,8 @@ export function setLoggerProvider(config: ConfigurationModel): void { getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); const timeout = getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? - (getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? 10000); + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? + 10000; const headersList = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); @@ -520,7 +523,6 @@ export function setLoggerProvider(config: ConfigurationModel): void { if (headersList) { batchInfo.exporter.otlp_grpc.headers_list = headersList; } - } else { if (batchInfo.exporter.otlp_http == null) { batchInfo.exporter.otlp_http = {}; From 321abdb6eb794df4c957bcba6aa5d5b80712d241 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 20:49:51 -0500 Subject: [PATCH 41/58] align with sdk --- .../src/EnvironmentConfigFactory.ts | 27 ++++++++++++------ .../configuration/test/ConfigFactory.test.ts | 28 ++++--------------- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index c093aea5a45..c09dbc5a123 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -32,6 +32,7 @@ import { ExporterTemporalityPreference, } from './models/meterProviderModel'; import { OtlpHttpEncoding } from './models/commonModel'; +import { diag } from '@opentelemetry/api'; /** * EnvironmentConfigProvider provides a configuration based on environment variables. @@ -457,18 +458,28 @@ export function setLoggerProvider(config: ConfigurationModel): void { batch.max_export_batch_size = maxExportBatchSize; } - const exportersType = getStringListFromEnv('OTEL_LOGS_EXPORTER') ?? [ - 'otlp', - ]; - if (exportersType) { + const exportersType = Array.from( + new Set(getStringListFromEnv('OTEL_LOGS_EXPORTER')) + ) ?? ['otlp']; + if (exportersType.length === 0) { + exportersType.push('otlp'); + } + if (exportersType.length > 0) { config.logger_provider.processors = []; + if (exportersType.includes('none')) { + diag.info( + `OTEL_LOGS_EXPORTER contains "none". Logger provider will not be initialized.` + ); + return; + } + for (let i = 0; i < exportersType.length; i++) { const exporterType = exportersType[i]; const batchInfo = { ...batch }; if (exporterType === 'console') { - batchInfo.exporter = { console: {} }; - } else if (exporterType === 'none') { - batchInfo.exporter = {}; + config.logger_provider.processors.push({ + simple: { exporter: { console: {} } }, + }); } else { // 'otlp' and default const protocol = @@ -561,8 +572,8 @@ export function setLoggerProvider(config: ConfigurationModel): void { batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.Protobuf; } } + config.logger_provider.processors.push({ batch: batchInfo }); } - config.logger_provider.processors.push({ batch: batchInfo }); } } } diff --git a/experimental/packages/configuration/test/ConfigFactory.test.ts b/experimental/packages/configuration/test/ConfigFactory.test.ts index 2a8b8e9ff1f..018c149e835 100644 --- a/experimental/packages/configuration/test/ConfigFactory.test.ts +++ b/experimental/packages/configuration/test/ConfigFactory.test.ts @@ -1040,11 +1040,7 @@ describe('ConfigProvider', function () { }, processors: [ { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, + simple: { exporter: { console: {}, }, @@ -1058,31 +1054,21 @@ describe('ConfigProvider', function () { }); it('should return config with logger_provider with no exporter', function () { - process.env.OTEL_LOGS_EXPORTER = 'none'; + process.env.OTEL_LOGS_EXPORTER = 'none,console'; const expectedConfig: ConfigurationModel = { ...defaultConfig, logger_provider: { limits: { attribute_count_limit: 128, }, - processors: [ - { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: {}, - }, - }, - ], + processors: [], }, }; const configProvider = createConfigFactory(); assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); - it('should return config with logger_provider with console exporter', function () { + it('should return config with logger_provider with exporter list', function () { process.env.OTEL_LOGS_EXPORTER = 'otlp,console'; const expectedConfig: ConfigurationModel = { ...defaultConfig, @@ -1107,11 +1093,7 @@ describe('ConfigProvider', function () { }, }, { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, + simple: { exporter: { console: {}, }, From 9938a750173e09c0710964273e6bf4a121f52fcf Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 20:58:23 -0500 Subject: [PATCH 42/58] clenaup --- .../packages/configuration/src/EnvironmentConfigFactory.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index c09dbc5a123..21f4533e079 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -460,7 +460,7 @@ export function setLoggerProvider(config: ConfigurationModel): void { const exportersType = Array.from( new Set(getStringListFromEnv('OTEL_LOGS_EXPORTER')) - ) ?? ['otlp']; + ); if (exportersType.length === 0) { exportersType.push('otlp'); } From 69231be4efb86a225648b29c1847614171eab771 Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 21:21:41 -0500 Subject: [PATCH 43/58] backup option for grpc endpoint --- .../packages/configuration/src/EnvironmentConfigFactory.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 21f4533e079..88da1b7ba62 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -511,7 +511,8 @@ export function setLoggerProvider(config: ConfigurationModel): void { batchInfo.exporter.otlp_grpc = {}; const endpoint = getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT'); + getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? + 'http://localhost:4317'; if (endpoint) { batchInfo.exporter.otlp_grpc.endpoint = endpoint; } From d5f1218dc2845e4771bb8f0d7d25f268ac78034d Mon Sep 17 00:00:00 2001 From: maryliag Date: Thu, 13 Nov 2025 21:24:39 -0500 Subject: [PATCH 44/58] cleanup --- .../src/EnvironmentConfigFactory.ts | 213 +++++++++--------- 1 file changed, 106 insertions(+), 107 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 88da1b7ba62..3cda8c0efdb 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -464,117 +464,116 @@ export function setLoggerProvider(config: ConfigurationModel): void { if (exportersType.length === 0) { exportersType.push('otlp'); } - if (exportersType.length > 0) { - config.logger_provider.processors = []; - if (exportersType.includes('none')) { - diag.info( - `OTEL_LOGS_EXPORTER contains "none". Logger provider will not be initialized.` - ); - return; - } - for (let i = 0; i < exportersType.length; i++) { - const exporterType = exportersType[i]; - const batchInfo = { ...batch }; - if (exporterType === 'console') { - config.logger_provider.processors.push({ - simple: { exporter: { console: {} } }, - }); + config.logger_provider.processors = []; + if (exportersType.includes('none')) { + diag.info( + `OTEL_LOGS_EXPORTER contains "none". Logger provider will not be initialized.` + ); + return; + } + + for (let i = 0; i < exportersType.length; i++) { + const exporterType = exportersType[i]; + const batchInfo = { ...batch }; + if (exporterType === 'console') { + config.logger_provider.processors.push({ + simple: { exporter: { console: {} } }, + }); + } else { + // 'otlp' and default + const protocol = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? + 'http/protobuf'; + const certificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); + const clientKeyFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); + const clientCertificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); + const timeout = + getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? + 10000; + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); + + if (protocol === 'grpc') { + delete batchInfo.exporter.otlp_http; + batchInfo.exporter.otlp_grpc = {}; + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? + 'http://localhost:4317'; + if (endpoint) { + batchInfo.exporter.otlp_grpc.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_grpc.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_grpc.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_grpc.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_grpc.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_grpc.headers_list = headersList; + } } else { - // 'otlp' and default - const protocol = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? - 'http/protobuf'; - const certificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); - const clientKeyFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); - const clientCertificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); - const compression = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); - const timeout = - getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? - getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? - 10000; - const headersList = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); - - if (protocol === 'grpc') { - delete batchInfo.exporter.otlp_http; - batchInfo.exporter.otlp_grpc = {}; - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? - 'http://localhost:4317'; - if (endpoint) { - batchInfo.exporter.otlp_grpc.endpoint = endpoint; - } - if (certificateFile) { - batchInfo.exporter.otlp_grpc.certificate_file = certificateFile; - } - if (clientKeyFile) { - batchInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; - } - if (clientCertificateFile) { - batchInfo.exporter.otlp_grpc.client_certificate_file = - clientCertificateFile; - } - if (compression) { - batchInfo.exporter.otlp_grpc.compression = compression; - } - if (timeout) { - batchInfo.exporter.otlp_grpc.timeout = timeout; - } - if (headersList) { - batchInfo.exporter.otlp_grpc.headers_list = headersList; - } - } else { - if (batchInfo.exporter.otlp_http == null) { - batchInfo.exporter.otlp_http = {}; - } - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') - ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` - : null); - if (endpoint) { - batchInfo.exporter.otlp_http.endpoint = endpoint; - } - if (certificateFile) { - batchInfo.exporter.otlp_http.certificate_file = certificateFile; - } - if (clientKeyFile) { - batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; - } - if (clientCertificateFile) { - batchInfo.exporter.otlp_http.client_certificate_file = - clientCertificateFile; - } - if (compression) { - batchInfo.exporter.otlp_http.compression = compression; - } - if (timeout) { - batchInfo.exporter.otlp_http.timeout = timeout; - } - if (headersList) { - batchInfo.exporter.otlp_http.headers_list = headersList; - } - - if (protocol === 'http/json') { - batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.JSON; - } else if (protocol === 'http/protobuf') { - batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.Protobuf; - } + if (batchInfo.exporter.otlp_http == null) { + batchInfo.exporter.otlp_http = {}; + } + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') + ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` + : null); + if (endpoint) { + batchInfo.exporter.otlp_http.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_http.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_http.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_http.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_http.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_http.headers_list = headersList; + } + + if (protocol === 'http/json') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.JSON; + } else if (protocol === 'http/protobuf') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.Protobuf; } - config.logger_provider.processors.push({ batch: batchInfo }); } + config.logger_provider.processors.push({ batch: batchInfo }); } } } From b8ab8d116f778b56ad2bb6fa4b9f285b0dd86417 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 14 Nov 2025 17:53:12 -0500 Subject: [PATCH 45/58] create logger provider --- .../opentelemetry-sdk-node/src/sdk.ts | 98 ++++++++----------- .../opentelemetry-sdk-node/test/sdk.test.ts | 4 +- 2 files changed, 43 insertions(+), 59 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index b9ab592d460..286fb65ac0d 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -63,7 +63,7 @@ import { } from '@opentelemetry/sdk-trace-node'; import { ATTR_SERVICE_NAME } from '@opentelemetry/semantic-conventions'; import { NodeSDKConfiguration } from './types'; -import { getStringFromEnv, getStringListFromEnv } from '@opentelemetry/core'; +import { getStringListFromEnv } from '@opentelemetry/core'; import { getResourceDetectorsFromEnv, getSpanProcessorsFromEnv, @@ -76,6 +76,7 @@ import { ConfigFactory, ConfigurationModel, createConfigFactory, + LogRecordExporterModel, } from '@opentelemetry/configuration'; import { ATTR_SERVICE_INSTANCE_ID } from './semconv'; @@ -325,7 +326,7 @@ export class NodeSDK { "The 'logRecordProcessor' option is deprecated. Please use 'logRecordProcessors' instead." ); } else { - this.configureLoggerProviderFromEnv(); + this.configureLoggerProviderFromConfigFactory(); } if ( @@ -474,68 +475,51 @@ export class NodeSDK { ); } - private configureLoggerProviderFromEnv(): void { - const enabledExporters = getStringListFromEnv('OTEL_LOGS_EXPORTER') ?? []; - - if (enabledExporters.length === 0) { - diag.debug('OTEL_LOGS_EXPORTER is empty. Using default otlp exporter.'); - enabledExporters.push('otlp'); - } - - if (enabledExporters.includes('none')) { - diag.info( - `OTEL_LOGS_EXPORTER contains "none". Logger provider will not be initialized.` - ); - return; + private getExporterType(exporter: LogRecordExporterModel): LogRecordExporter { + if (exporter.otlp_http) { + if (exporter.otlp_http.encoding === 'json') { + return new OTLPHttpLogExporter(); + } + if (exporter.otlp_http.encoding === 'protobuf') { + return new OTLPProtoLogExporter(); + } + diag.warn(`Unsupported OTLP logs protocol. Using http/protobuf.`); + return new OTLPProtoLogExporter(); + } else if (exporter.otlp_grpc) { + return new OTLPGrpcLogExporter(); + } else if (exporter.console) { + return new ConsoleLogRecordExporter(); } + diag.warn(`Unsupported Exporter value. Using OTLP http/protobuf.`); + return new OTLPProtoLogExporter(); + } - const exporters: LogRecordExporter[] = []; - - enabledExporters.forEach(exporter => { - if (exporter === 'otlp') { - const protocol = ( - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') - )?.trim(); - - switch (protocol) { - case 'grpc': - exporters.push(new OTLPGrpcLogExporter()); - break; - case 'http/json': - exporters.push(new OTLPHttpLogExporter()); - break; - case 'http/protobuf': - exporters.push(new OTLPProtoLogExporter()); - break; - case undefined: - case '': - exporters.push(new OTLPProtoLogExporter()); - break; - default: - diag.warn( - `Unsupported OTLP logs protocol: "${protocol}". Using http/protobuf.` - ); - exporters.push(new OTLPProtoLogExporter()); - } - } else if (exporter === 'console') { - exporters.push(new ConsoleLogRecordExporter()); - } else { - diag.warn( - `Unsupported OTEL_LOGS_EXPORTER value: "${exporter}". Supported values are: otlp, console, none.` + private configureLoggerProviderFromConfigFactory(): void { + const logRecordProcessors: LogRecordProcessor[] = []; + console.log(">>>> P: ", this._config.logger_provider); + + const enabledProcessors = this._config.logger_provider?.processors; + enabledProcessors?.forEach(processor => { + if (processor.batch) { + logRecordProcessors.push( + new BatchLogRecordProcessor( + this.getExporterType(processor.batch.exporter) + ) + ); + } + if (processor.simple) { + logRecordProcessors.push( + new SimpleLogRecordProcessor( + this.getExporterType(processor.simple.exporter) + ) ); } }); - if (exporters.length > 0) { + console.log(">>>> logRecordProcessors: ", logRecordProcessors); + if (logRecordProcessors.length > 0) { this._loggerProviderConfig = { - logRecordProcessors: exporters.map(exporter => { - if (exporter instanceof ConsoleLogRecordExporter) { - return new SimpleLogRecordProcessor(exporter); - } else { - return new BatchLogRecordProcessor(exporter); - } - }), + logRecordProcessors: logRecordProcessors, }; } } diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 6442a3ee032..c954f044fa2 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -1180,7 +1180,7 @@ describe('Node SDK', () => { await sdk.shutdown(); }); - it('should fall back to OTEL_EXPORTER_OTLP_PROTOCOL', async () => { + it('should fall back to OTEL_EXPORTER_OTLP_PROTOCOL for logger', async () => { process.env.OTEL_LOGS_EXPORTER = 'otlp'; process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); @@ -1337,7 +1337,7 @@ describe('Node SDK', () => { await sdk.shutdown(); }); - it('should fall back to OTEL_EXPORTER_OTLP_PROTOCOL', async () => { + it('should fall back to OTEL_EXPORTER_OTLP_PROTOCOL for metrics', async () => { process.env.OTEL_METRICS_EXPORTER = 'otlp'; process.env.OTEL_EXPORTER_OTLP_METRICS_PROTOCOL = 'grpc'; const sdk = new NodeSDK(); From 11d8db6b2b85739e508204defd95095e2539d435 Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 14 Nov 2025 17:54:01 -0500 Subject: [PATCH 46/58] eexport model --- experimental/packages/configuration/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/experimental/packages/configuration/src/index.ts b/experimental/packages/configuration/src/index.ts index a939431e4e9..de04c2df68e 100644 --- a/experimental/packages/configuration/src/index.ts +++ b/experimental/packages/configuration/src/index.ts @@ -16,4 +16,5 @@ export type { ConfigFactory } from './IConfigFactory'; export type { ConfigurationModel } from './models/configModel'; +export type { LogRecordExporter as LogRecordExporterModel } from './models/loggerProviderModel'; export { createConfigFactory } from './ConfigFactory'; From 4dc01349ab35d2dcdc6e4e89b8e7f24a0ad97d6a Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 14 Nov 2025 18:52:06 -0500 Subject: [PATCH 47/58] use config --- .../packages/opentelemetry-sdk-node/src/sdk.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 286fb65ac0d..2b4db15f199 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -496,14 +496,18 @@ export class NodeSDK { private configureLoggerProviderFromConfigFactory(): void { const logRecordProcessors: LogRecordProcessor[] = []; - console.log(">>>> P: ", this._config.logger_provider); - const enabledProcessors = this._config.logger_provider?.processors; enabledProcessors?.forEach(processor => { if (processor.batch) { logRecordProcessors.push( new BatchLogRecordProcessor( - this.getExporterType(processor.batch.exporter) + this.getExporterType(processor.batch.exporter), + { + maxQueueSize: processor.batch.max_queue_size, + maxExportBatchSize: processor.batch.max_export_batch_size, + scheduledDelayMillis: processor.batch.schedule_delay, + exportTimeoutMillis: processor.batch.export_timeout, + } ) ); } @@ -515,8 +519,6 @@ export class NodeSDK { ); } }); - - console.log(">>>> logRecordProcessors: ", logRecordProcessors); if (logRecordProcessors.length > 0) { this._loggerProviderConfig = { logRecordProcessors: logRecordProcessors, From af09b0eb820e3e65b92614b5f36862eaaf2994eb Mon Sep 17 00:00:00 2001 From: maryliag Date: Fri, 14 Nov 2025 19:41:36 -0500 Subject: [PATCH 48/58] readme --- experimental/CHANGELOG.md | 1 + .../packages/opentelemetry-sdk-node/README.md | 73 +++++++++++++++++++ .../opentelemetry-sdk-node/src/sdk.ts | 11 ++- 3 files changed, 82 insertions(+), 3 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 8300d24c7d8..8d708b3992b 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -14,6 +14,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * refactor(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag * feat(opentelemetry-sdk-node): use declarative config for resource attributes [#6044](https://github.com/open-telemetry/opentelemetry-js/pull/6044) @maryliag * feat(configuration): set logger provider exporter type from env variable [#6104](https://github.com/open-telemetry/opentelemetry-js/pull/6104) @maryliag +* feat(opentelemetry-sdk-node): use declarative config for logger provider [#xxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxxx) @maryliag ### :bug: Bug Fixes diff --git a/experimental/packages/opentelemetry-sdk-node/README.md b/experimental/packages/opentelemetry-sdk-node/README.md index 1f8f22605f5..ef11a34e99c 100644 --- a/experimental/packages/opentelemetry-sdk-node/README.md +++ b/experimental/packages/opentelemetry-sdk-node/README.md @@ -79,6 +79,79 @@ process.on("SIGTERM", () => { }); ``` +## Configuration file + +The SDK configuration can be done through a configuration yaml file. + +To setup create the file and set the environment variable `OTEL_EXPERIMENTAL_CONFIG_FILE` to its path e.g. `test/fixtures/kitchen-sink.yaml`. + +If the environment variable is set, the configuration will only be used from the file and the correspondent environment +variables will not be used, unless they're in the config file itself (e.g. `disabled: ${OTEL_SDK_DISABLED:-false}`) + +Example of all available configurations: + +```yml +# The file format version. +# The yaml format is documented at +# https://github.com/open-telemetry/opentelemetry-configuration/tree/main/schema +file_format: "1.0-rc.2" +# Configure if the SDK is disabled or not. +disabled: false +# Configure the log level of the internal logger used by the SDK. +# If omitted, info is used. +log_level: info +# Configure logger provider. +# If omitted, a noop logger provider is used. +logger_provider: + # Configure log record processors. + processors: + - # Configure a batch log record processor. + batch: + # Configure delay interval (in milliseconds) between two consecutive exports. + # Value must be non-negative. + # If omitted or null, 1000 is used. + schedule_delay: 5000 + # Configure maximum allowed time (in milliseconds) to export data. + # Value must be non-negative. A value of 0 indicates no limit (infinity). + # If omitted or null, 30000 is used. + export_timeout: 30000 + # Configure maximum queue size. Value must be positive. + # If omitted or null, 2048 is used. + max_queue_size: 2048 + # Configure maximum batch size. Value must be positive. + # If omitted or null, 512 is used. + max_export_batch_size: 512 + # Configure exporter. + exporter: + # Configure exporter to be OTLP with HTTP transport. + otlp_http: + # Configure compression. + # Values include: gzip, none. Implementations may support other compression algorithms. + # If omitted or null, none is used. + compression: gzip + # Configure the encoding used for messages. + # Values include: protobuf, json. Implementations may not support json. + # If omitted or null, protobuf is used. + encoding: protobuf + - # Configure a batch log record processor. + batch: + # Configure exporter. + exporter: + # Configure exporter to be OTLP with gRPC transport. + otlp_grpc: + # Configure compression. + # Values include: gzip, none. Implementations may support other compression algorithms. + # If omitted or null, none is used. + compression: gzip + - # Configure a simple log record processor. + simple: + # Configure exporter. + exporter: + # Configure exporter to be console. + console: + +``` + ## Configuration Below is a full list of configuration options which may be passed into the `NodeSDK` constructor; diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 2b4db15f199..fa9cb1b066c 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -79,6 +79,7 @@ import { LogRecordExporterModel, } from '@opentelemetry/configuration'; import { ATTR_SERVICE_INSTANCE_ID } from './semconv'; +import { CompressionAlgorithm } from '@opentelemetry/otlp-exporter-base'; type TracerProviderConfig = { tracerConfig: NodeTracerConfig; @@ -478,7 +479,12 @@ export class NodeSDK { private getExporterType(exporter: LogRecordExporterModel): LogRecordExporter { if (exporter.otlp_http) { if (exporter.otlp_http.encoding === 'json') { - return new OTLPHttpLogExporter(); + return new OTLPHttpLogExporter({ + compression: + exporter.otlp_http.compression === 'gzip' + ? CompressionAlgorithm.GZIP + : CompressionAlgorithm.NONE, + }); } if (exporter.otlp_http.encoding === 'protobuf') { return new OTLPProtoLogExporter(); @@ -496,8 +502,7 @@ export class NodeSDK { private configureLoggerProviderFromConfigFactory(): void { const logRecordProcessors: LogRecordProcessor[] = []; - const enabledProcessors = this._config.logger_provider?.processors; - enabledProcessors?.forEach(processor => { + this._config.logger_provider?.processors?.forEach(processor => { if (processor.batch) { logRecordProcessors.push( new BatchLogRecordProcessor( From f662e7181913c300cb17bc49ca6c8f64ac2f1144 Mon Sep 17 00:00:00 2001 From: maryliag Date: Mon, 17 Nov 2025 18:17:42 -0500 Subject: [PATCH 49/58] update changelog --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 8d708b3992b..82b8d1b65b6 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -14,7 +14,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * refactor(configuration): improvements on package [#6101](https://github.com/open-telemetry/opentelemetry-js/pull/6101) @maryliag * feat(opentelemetry-sdk-node): use declarative config for resource attributes [#6044](https://github.com/open-telemetry/opentelemetry-js/pull/6044) @maryliag * feat(configuration): set logger provider exporter type from env variable [#6104](https://github.com/open-telemetry/opentelemetry-js/pull/6104) @maryliag -* feat(opentelemetry-sdk-node): use declarative config for logger provider [#xxx](https://github.com/open-telemetry/opentelemetry-js/pull/xxxx) @maryliag +* feat(opentelemetry-sdk-node): use declarative config for logger provider [#6111](https://github.com/open-telemetry/opentelemetry-js/pull/6111) @maryliag ### :bug: Bug Fixes From ce99df9373ceade544a80d3a9c638c347b13f0c8 Mon Sep 17 00:00:00 2001 From: maryliag Date: Mon, 17 Nov 2025 18:38:03 -0500 Subject: [PATCH 50/58] fix messedup merge --- .../src/EnvironmentConfigFactory.ts | 2 +- .../configuration/test/ConfigFactory.test.ts | 152 ------------------ 2 files changed, 1 insertion(+), 153 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 16718d7991b..e070e7f9d4b 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -361,7 +361,7 @@ export function setMeterProvider(config: ConfigurationModel): void { config.meter_provider.readers = []; if (exportersType.includes('none')) { diag.info( - `OTEL_METRICS_EXPORTER contains "none". Meter provider will not be initialized.` + `OTEL_METRICS_EXPORTER contains "none". Metric provider will not be initialized.` ); return; } diff --git a/experimental/packages/configuration/test/ConfigFactory.test.ts b/experimental/packages/configuration/test/ConfigFactory.test.ts index 85103219be8..a0200c60615 100644 --- a/experimental/packages/configuration/test/ConfigFactory.test.ts +++ b/experimental/packages/configuration/test/ConfigFactory.test.ts @@ -1622,158 +1622,6 @@ describe('ConfigFactory', function () { assert.deepStrictEqual(configFactory.getConfigModel(), expectedConfig); }); - it('should return config with logger_provider with console exporter', function () { - process.env.OTEL_LOGS_EXPORTER = 'console'; - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - logger_provider: { - limits: { - attribute_count_limit: 128, - }, - processors: [ - { - simple: { - exporter: { - console: {}, - }, - }, - }, - ], - }, - }; - const configProvider = createConfigFactory(); - assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); - }); - - it('should return config with logger_provider with no exporter', function () { - process.env.OTEL_LOGS_EXPORTER = 'none,console'; - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - logger_provider: { - limits: { - attribute_count_limit: 128, - }, - processors: [], - }, - }; - const configProvider = createConfigFactory(); - assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); - }); - - it('should return config with logger_provider with exporter list', function () { - process.env.OTEL_LOGS_EXPORTER = 'otlp,console'; - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - logger_provider: { - limits: { - attribute_count_limit: 128, - }, - processors: [ - { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/logs', - timeout: 10000, - encoding: OtlpHttpEncoding.Protobuf, - }, - }, - }, - }, - { - simple: { - exporter: { - console: {}, - }, - }, - }, - ], - }, - }; - const configProvider = createConfigFactory(); - assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); - }); - - it('should return config with logger_provider with otlp grpc exporter', function () { - process.env.OTEL_LOGS_EXPORTER = 'otlp'; - process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'grpc'; - process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://localhost:4317'; - process.env.OTEL_EXPORTER_OTLP_TIMEOUT = '10000'; - process.env.OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE = 'log-cert.pem'; - process.env.OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY = 'log-key.pem'; - process.env.OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE = - 'log-client-cert.pem'; - process.env.OTEL_EXPORTER_OTLP_LOGS_HEADERS = 'host=localhost'; - process.env.OTEL_EXPORTER_OTLP_LOGS_COMPRESSION = 'gzip'; - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - logger_provider: { - limits: { - attribute_count_limit: 128, - }, - processors: [ - { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: { - otlp_grpc: { - endpoint: 'http://localhost:4317', - timeout: 10000, - certificate_file: 'log-cert.pem', - client_key_file: 'log-key.pem', - client_certificate_file: 'log-client-cert.pem', - headers_list: 'host=localhost', - compression: 'gzip', - }, - }, - }, - }, - ], - }, - }; - const configProvider = createConfigFactory(); - assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); - }); - - it('should return config with logger_provider with otlp http/json exporter', function () { - process.env.OTEL_LOGS_EXPORTER = 'otlp'; - process.env.OTEL_EXPORTER_OTLP_PROTOCOL = 'http/json'; - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - logger_provider: { - limits: { - attribute_count_limit: 128, - }, - processors: [ - { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/logs', - timeout: 10000, - encoding: OtlpHttpEncoding.JSON, - }, - }, - }, - }, - ], - }, - }; - const configProvider = createConfigFactory(); - assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); - }); - it('should use backup options for exporters', function () { process.env.OTEL_EXPORTER_OTLP_CERTIFICATE = 'backup_certificate_file.pem'; From 3d39ce68ddb0e83595ab622f01efdde31be4540e Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 11:33:30 -0500 Subject: [PATCH 51/58] update message --- experimental/packages/opentelemetry-sdk-node/src/sdk.ts | 2 +- experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 6d80d9cad5b..59dbe18b3db 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -126,7 +126,7 @@ function configureMetricProviderFromEnv(): IMetricReader[] { if (enabledExporters.includes('none')) { diag.info( - `OTEL_METRICS_EXPORTER contains "none". Metric provider will not be initialized.` + `OTEL_METRICS_EXPORTER contains "none". Meter provider will not be initialized.` ); return metricReaders; } diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 45a973a7392..34919580779 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -1210,7 +1210,7 @@ describe('Node SDK', () => { }); }); - describe('configuring metric provider from env', () => { + describe('configuring meter provider from env', () => { let stubLogger: Sinon.SinonStub; beforeEach(() => { @@ -1233,7 +1233,7 @@ describe('Node SDK', () => { assert.ok(!(metrics.getMeterProvider() instanceof MeterProvider)); assert.strictEqual( stubLogger.args[0][0], - 'OTEL_METRICS_EXPORTER contains "none". Metric provider will not be initialized.' + 'OTEL_METRICS_EXPORTER contains "none". Meter provider will not be initialized.' ); await sdk.shutdown(); }); From 687dba031eed7278a15a0f81470d69ab1d47c304 Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 21:37:51 -0500 Subject: [PATCH 52/58] no providers by default --- .../src/EnvironmentConfigFactory.ts | 963 +++++++++--------- .../configuration/src/FileConfigFactory.ts | 28 +- .../configuration/src/models/configModel.ts | 18 +- .../src/models/loggerProviderModel.ts | 19 +- .../src/models/meterProviderModel.ts | 19 +- .../src/models/tracerProviderModel.ts | 19 +- .../configuration/test/ConfigFactory.test.ts | 554 +++++----- 7 files changed, 734 insertions(+), 886 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 16718d7991b..8f5a16a5d41 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -30,9 +30,13 @@ import { ExemplarFilter, ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, + initializeDefaultMeterProviderConfiguration, + PeriodicMetricReader, } from './models/meterProviderModel'; import { OtlpHttpEncoding } from './models/commonModel'; import { diag } from '@opentelemetry/api'; +import { BatchSpanProcessor, initializeDefaultTracerProviderConfiguration } from './models/tracerProviderModel'; +import { BatchLogRecordProcessor, initializeDefaultLoggerProviderConfiguration } from './models/loggerProviderModel'; /** * EnvironmentConfigProvider provides a configuration based on environment variables. @@ -141,9 +145,20 @@ export function setPropagators(config: ConfigurationModel): void { } export function setTracerProvider(config: ConfigurationModel): void { - if (config.tracer_provider == null) { - config.tracer_provider = { processors: [] }; + const exportersType = Array.from( + new Set(getStringListFromEnv('OTEL_TRACES_EXPORTER')) + ); + if (exportersType.length === 0) { + return; + } + if (exportersType.includes('none')) { + diag.info( + `OTEL_TRACES_EXPORTER contains "none". Tracer provider will not be initialized.` + ); + return; } + config.tracer_provider = initializeDefaultTracerProviderConfiguration(); + if (config.tracer_provider.limits == null) { config.tracer_provider.limits = {}; } @@ -188,377 +203,358 @@ export function setTracerProvider(config: ConfigurationModel): void { linkAttributeCountLimit; } - const batch = config.tracer_provider.processors[0]?.batch; - if (batch) { - const scheduleDelay = getNumberFromEnv('OTEL_BSP_SCHEDULE_DELAY'); - if (scheduleDelay) { - batch.schedule_delay = scheduleDelay; - } - - const exportTimeout = getNumberFromEnv('OTEL_BSP_EXPORT_TIMEOUT'); - if (exportTimeout) { - batch.export_timeout = exportTimeout; - } + const batch : BatchSpanProcessor = { exporter: {} }; + const scheduleDelay = getNumberFromEnv('OTEL_BSP_SCHEDULE_DELAY') ?? 5000; + if (scheduleDelay) { + batch.schedule_delay = scheduleDelay; + } - const maxQueueSize = getNumberFromEnv('OTEL_BSP_MAX_QUEUE_SIZE'); - if (maxQueueSize) { - batch.max_queue_size = maxQueueSize; - } + const exportTimeout = getNumberFromEnv('OTEL_BSP_EXPORT_TIMEOUT') ?? 30000; + if (exportTimeout) { + batch.export_timeout = exportTimeout; + } - const maxExportBatchSize = getNumberFromEnv( - 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE' - ); - if (maxExportBatchSize) { - batch.max_export_batch_size = maxExportBatchSize; - } + const maxQueueSize = getNumberFromEnv('OTEL_BSP_MAX_QUEUE_SIZE') ?? 2048; + if (maxQueueSize) { + batch.max_queue_size = maxQueueSize; + } - const exportersType = Array.from( - new Set(getStringListFromEnv('OTEL_TRACES_EXPORTER')) - ); - if (exportersType.length === 0) { - exportersType.push('otlp'); - } + const maxExportBatchSize = getNumberFromEnv( + 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE' + ) ?? 512; + if (maxExportBatchSize) { + batch.max_export_batch_size = maxExportBatchSize; + } - config.tracer_provider.processors = []; - if (exportersType.includes('none')) { - diag.info( - `OTEL_TRACES_EXPORTER contains "none". Tracer provider will not be initialized.` - ); - return; - } - for (let i = 0; i < exportersType.length; i++) { - const exporterType = exportersType[i]; - const batchInfo = { ...batch }; - if (exporterType === 'console') { - config.tracer_provider.processors.push({ - simple: { exporter: { console: {} } }, - }); - } else if (exporterType === 'zipkin') { - batchInfo.exporter = { - zipkin: { - endpoint: - getStringFromEnv('OTEL_EXPORTER_ZIPKIN_ENDPOINT') ?? - 'http://localhost:9411/api/v2/spans', - timeout: getNumberFromEnv('OTEL_EXPORTER_ZIPKIN_TIMEOUT') ?? 10000, - }, - }; - config.tracer_provider.processors.push({ batch: batchInfo }); + for (let i = 0; i < exportersType.length; i++) { + const exporterType = exportersType[i]; + const batchInfo = { ...batch }; + if (exporterType === 'console') { + config.tracer_provider.processors.push({ + simple: { exporter: { console: {} } }, + }); + } else if (exporterType === 'zipkin') { + batchInfo.exporter = { + zipkin: { + endpoint: + getStringFromEnv('OTEL_EXPORTER_ZIPKIN_ENDPOINT') ?? + 'http://localhost:9411/api/v2/spans', + timeout: getNumberFromEnv('OTEL_EXPORTER_ZIPKIN_TIMEOUT') ?? 10000, + }, + }; + config.tracer_provider.processors.push({ batch: batchInfo }); + } else { + // 'otlp' and default + const protocol = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_PROTOCOL') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? + 'http/protobuf'; + const certificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); + const clientKeyFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); + const clientCertificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); + const timeout = + getNumberFromEnv('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? + 10000; + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); + + if (protocol === 'grpc') { + delete batchInfo.exporter.otlp_http; + batchInfo.exporter.otlp_grpc = {}; + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? + 'http://localhost:4317'; + if (endpoint) { + batchInfo.exporter.otlp_grpc.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_grpc.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_grpc.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_grpc.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_grpc.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_grpc.headers_list = headersList; + } } else { - // 'otlp' and default - const protocol = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_PROTOCOL') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? - 'http/protobuf'; - const certificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); - const clientKeyFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); - const clientCertificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); - const compression = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_COMPRESSION') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); - const timeout = - getNumberFromEnv('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT') ?? - getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? - 10000; - const headersList = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_HEADERS') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); - - if (protocol === 'grpc') { - delete batchInfo.exporter.otlp_http; - batchInfo.exporter.otlp_grpc = {}; - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? - 'http://localhost:4317'; - if (endpoint) { - batchInfo.exporter.otlp_grpc.endpoint = endpoint; - } - if (certificateFile) { - batchInfo.exporter.otlp_grpc.certificate_file = certificateFile; - } - if (clientKeyFile) { - batchInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; - } - if (clientCertificateFile) { - batchInfo.exporter.otlp_grpc.client_certificate_file = - clientCertificateFile; - } - if (compression) { - batchInfo.exporter.otlp_grpc.compression = compression; - } - if (timeout) { - batchInfo.exporter.otlp_grpc.timeout = timeout; - } - if (headersList) { - batchInfo.exporter.otlp_grpc.headers_list = headersList; - } - } else { - if (batchInfo.exporter.otlp_http == null) { - batchInfo.exporter.otlp_http = {}; - } - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') - ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/traces` - : null); - if (endpoint) { - batchInfo.exporter.otlp_http.endpoint = endpoint; - } - if (certificateFile) { - batchInfo.exporter.otlp_http.certificate_file = certificateFile; - } - if (clientKeyFile) { - batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; - } - if (clientCertificateFile) { - batchInfo.exporter.otlp_http.client_certificate_file = - clientCertificateFile; - } - if (compression) { - batchInfo.exporter.otlp_http.compression = compression; - } - if (timeout) { - batchInfo.exporter.otlp_http.timeout = timeout; - } - if (headersList) { - batchInfo.exporter.otlp_http.headers_list = headersList; - } + if (batchInfo.exporter.otlp_http == null) { + batchInfo.exporter.otlp_http = {}; + } + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') + ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/traces` + : 'http://localhost:4318/v1/traces'); + if (endpoint) { + batchInfo.exporter.otlp_http.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_http.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_http.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_http.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_http.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_http.headers_list = headersList; + } + if (protocol === 'http/json') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.JSON; + } else if (protocol === 'http/protobuf') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.Protobuf; } - - config.tracer_provider.processors.push({ batch: batchInfo }); } + + config.tracer_provider.processors.push({ batch: batchInfo }); } } } export function setMeterProvider(config: ConfigurationModel): void { - const readerPeriodic = - config.meter_provider?.readers && config.meter_provider?.readers.length > 0 - ? config.meter_provider?.readers[0].periodic - : undefined; - if (config.meter_provider == null) { - config.meter_provider = { readers: [{}] }; - } - if (readerPeriodic) { - const interval = getNumberFromEnv('OTEL_METRIC_EXPORT_INTERVAL'); - if (interval) { - readerPeriodic.interval = interval; - } - - const exportersType = Array.from( - new Set(getStringListFromEnv('OTEL_METRICS_EXPORTER')) + const exportersType = Array.from( + new Set(getStringListFromEnv('OTEL_METRICS_EXPORTER')) + ); + if (exportersType.length === 0) { + return; + } + if (exportersType.includes('none')) { + diag.info( + `OTEL_METRICS_EXPORTER contains "none". Meter provider will not be initialized.` ); - if (exportersType.length === 0) { - exportersType.push('otlp'); - } + return; + } + config.meter_provider = initializeDefaultMeterProviderConfiguration(); - config.meter_provider.readers = []; - if (exportersType.includes('none')) { - diag.info( - `OTEL_METRICS_EXPORTER contains "none". Meter provider will not be initialized.` - ); - return; + const readerPeriodic: PeriodicMetricReader = { exporter: {} }; + const interval = getNumberFromEnv('OTEL_METRIC_EXPORT_INTERVAL') ?? 60000; + if (interval) { + readerPeriodic.interval = interval; + } + for (let i = 0; i < exportersType.length; i++) { + const exporterType = exportersType[i]; + const readerPeriodicInfo = { ...readerPeriodic }; + const timeout = getNumberFromEnv('OTEL_METRIC_EXPORT_TIMEOUT') ?? 30000; + if (timeout) { + readerPeriodicInfo.timeout = timeout; } - for (let i = 0; i < exportersType.length; i++) { - const exporterType = exportersType[i]; - const readerPeriodicInfo = { ...readerPeriodic }; - const timeout = getNumberFromEnv('OTEL_METRIC_EXPORT_TIMEOUT') ?? 30000; - if (timeout) { - readerPeriodicInfo.timeout = timeout; - } - // TODO: add prometheus exporter support - if (exporterType === 'console') { - readerPeriodicInfo.exporter = { console: {} }; - } else { - // 'otlp' and default - const protocol = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_PROTOCOL') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? - 'http/protobuf'; - const certificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); - const clientKeyFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); - const clientCertificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); - const compression = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_COMPRESSION') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); - const timeoutExporter = - getNumberFromEnv('OTEL_EXPORTER_OTLP_METRICS_TIMEOUT') ?? - getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? - 10000; - const headersList = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_HEADERS') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); - const temporalityPreference = - getStringFromEnv( - 'OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE' - ) ?? 'cumulative'; - const defaultHistogramAggregation = - getStringFromEnv( - 'OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION' - ) ?? 'explicit_bucket_histogram'; - - if (protocol === 'grpc') { - delete readerPeriodicInfo.exporter.otlp_http; - readerPeriodicInfo.exporter.otlp_grpc = {}; - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_ENDPOINT') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? - 'http://localhost:4317'; - if (endpoint) { - readerPeriodicInfo.exporter.otlp_grpc.endpoint = endpoint; - } - if (certificateFile) { - readerPeriodicInfo.exporter.otlp_grpc.certificate_file = - certificateFile; - } - if (clientKeyFile) { - readerPeriodicInfo.exporter.otlp_grpc.client_key_file = - clientKeyFile; - } - if (clientCertificateFile) { - readerPeriodicInfo.exporter.otlp_grpc.client_certificate_file = - clientCertificateFile; - } - if (compression) { - readerPeriodicInfo.exporter.otlp_grpc.compression = compression; - } - if (timeoutExporter) { - readerPeriodicInfo.exporter.otlp_grpc.timeout = timeoutExporter; - } - if (headersList) { - readerPeriodicInfo.exporter.otlp_grpc.headers_list = headersList; - } - if (temporalityPreference) { - switch (temporalityPreference) { - case 'cumulative': - readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = - ExporterTemporalityPreference.Cumulative; - break; - case 'delta': - readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = - ExporterTemporalityPreference.Delta; - break; - case 'low_memory': - readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = - ExporterTemporalityPreference.LowMemory; - break; - default: - readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = - ExporterTemporalityPreference.Cumulative; - break; - } - } - if (defaultHistogramAggregation) { - switch (defaultHistogramAggregation) { - case 'explicit_bucket_histogram': - readerPeriodicInfo.exporter.otlp_grpc.default_histogram_aggregation = - ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; - break; - case 'base2_exponential_bucket_histogram': - readerPeriodicInfo.exporter.otlp_grpc.default_histogram_aggregation = - ExporterDefaultHistogramAggregation.Base2ExponentialBucketHistogram; - break; - default: - readerPeriodicInfo.exporter.otlp_grpc.default_histogram_aggregation = - ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; - break; - } - } - } else { - if (readerPeriodicInfo.exporter.otlp_http == null) { - readerPeriodicInfo.exporter.otlp_http = {}; - } - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_ENDPOINT') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') - ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/metrics` - : null); - if (endpoint) { - readerPeriodicInfo.exporter.otlp_http.endpoint = endpoint; - } - if (certificateFile) { - readerPeriodicInfo.exporter.otlp_http.certificate_file = - certificateFile; - } - if (clientKeyFile) { - readerPeriodicInfo.exporter.otlp_http.client_key_file = - clientKeyFile; - } - if (clientCertificateFile) { - readerPeriodicInfo.exporter.otlp_http.client_certificate_file = - clientCertificateFile; - } - if (compression) { - readerPeriodicInfo.exporter.otlp_http.compression = compression; - } - if (timeoutExporter) { - readerPeriodicInfo.exporter.otlp_http.timeout = timeoutExporter; - } - if (headersList) { - readerPeriodicInfo.exporter.otlp_http.headers_list = headersList; + // TODO: add prometheus exporter support + if (exporterType === 'console') { + readerPeriodicInfo.exporter = { console: {} }; + } else { + // 'otlp' and default + const protocol = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_PROTOCOL') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? + 'http/protobuf'; + const certificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); + const clientKeyFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); + const clientCertificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); + const timeoutExporter = + getNumberFromEnv('OTEL_EXPORTER_OTLP_METRICS_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? + 10000; + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); + const temporalityPreference = + getStringFromEnv( + 'OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE' + ) ?? 'cumulative'; + const defaultHistogramAggregation = + getStringFromEnv( + 'OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION' + ) ?? 'explicit_bucket_histogram'; + + if (protocol === 'grpc') { + delete readerPeriodicInfo.exporter.otlp_http; + readerPeriodicInfo.exporter.otlp_grpc = {}; + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_ENDPOINT') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? + 'http://localhost:4317'; + if (endpoint) { + readerPeriodicInfo.exporter.otlp_grpc.endpoint = endpoint; + } + if (certificateFile) { + readerPeriodicInfo.exporter.otlp_grpc.certificate_file = + certificateFile; + } + if (clientKeyFile) { + readerPeriodicInfo.exporter.otlp_grpc.client_key_file = + clientKeyFile; + } + if (clientCertificateFile) { + readerPeriodicInfo.exporter.otlp_grpc.client_certificate_file = + clientCertificateFile; + } + if (compression) { + readerPeriodicInfo.exporter.otlp_grpc.compression = compression; + } + if (timeoutExporter) { + readerPeriodicInfo.exporter.otlp_grpc.timeout = timeoutExporter; + } + if (headersList) { + readerPeriodicInfo.exporter.otlp_grpc.headers_list = headersList; + } + if (temporalityPreference) { + switch (temporalityPreference) { + case 'cumulative': + readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = + ExporterTemporalityPreference.Cumulative; + break; + case 'delta': + readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = + ExporterTemporalityPreference.Delta; + break; + case 'low_memory': + readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = + ExporterTemporalityPreference.LowMemory; + break; + default: + readerPeriodicInfo.exporter.otlp_grpc.temporality_preference = + ExporterTemporalityPreference.Cumulative; + break; } - if (temporalityPreference) { - switch (temporalityPreference) { - case 'cumulative': - readerPeriodicInfo.exporter.otlp_http.temporality_preference = - ExporterTemporalityPreference.Cumulative; - break; - case 'delta': - readerPeriodicInfo.exporter.otlp_http.temporality_preference = - ExporterTemporalityPreference.Delta; - break; - case 'low_memory': - readerPeriodicInfo.exporter.otlp_http.temporality_preference = - ExporterTemporalityPreference.LowMemory; - break; - default: - readerPeriodicInfo.exporter.otlp_http.temporality_preference = - ExporterTemporalityPreference.Cumulative; - break; - } + } + if (defaultHistogramAggregation) { + switch (defaultHistogramAggregation) { + case 'explicit_bucket_histogram': + readerPeriodicInfo.exporter.otlp_grpc.default_histogram_aggregation = + ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; + break; + case 'base2_exponential_bucket_histogram': + readerPeriodicInfo.exporter.otlp_grpc.default_histogram_aggregation = + ExporterDefaultHistogramAggregation.Base2ExponentialBucketHistogram; + break; + default: + readerPeriodicInfo.exporter.otlp_grpc.default_histogram_aggregation = + ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; + break; } - if (defaultHistogramAggregation) { - switch (defaultHistogramAggregation) { - case 'explicit_bucket_histogram': - readerPeriodicInfo.exporter.otlp_http.default_histogram_aggregation = - ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; - break; - case 'base2_exponential_bucket_histogram': - readerPeriodicInfo.exporter.otlp_http.default_histogram_aggregation = - ExporterDefaultHistogramAggregation.Base2ExponentialBucketHistogram; - break; - default: - readerPeriodicInfo.exporter.otlp_http.default_histogram_aggregation = - ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; - break; - } + } + } else { + if (readerPeriodicInfo.exporter.otlp_http == null) { + readerPeriodicInfo.exporter.otlp_http = {}; + } + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_ENDPOINT') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') + ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/metrics` + : 'http://localhost:4318/v1/metrics'); + if (endpoint) { + readerPeriodicInfo.exporter.otlp_http.endpoint = endpoint; + } + if (certificateFile) { + readerPeriodicInfo.exporter.otlp_http.certificate_file = + certificateFile; + } + if (clientKeyFile) { + readerPeriodicInfo.exporter.otlp_http.client_key_file = + clientKeyFile; + } + if (clientCertificateFile) { + readerPeriodicInfo.exporter.otlp_http.client_certificate_file = + clientCertificateFile; + } + if (compression) { + readerPeriodicInfo.exporter.otlp_http.compression = compression; + } + if (timeoutExporter) { + readerPeriodicInfo.exporter.otlp_http.timeout = timeoutExporter; + } + if (headersList) { + readerPeriodicInfo.exporter.otlp_http.headers_list = headersList; + } + if (temporalityPreference) { + switch (temporalityPreference) { + case 'cumulative': + readerPeriodicInfo.exporter.otlp_http.temporality_preference = + ExporterTemporalityPreference.Cumulative; + break; + case 'delta': + readerPeriodicInfo.exporter.otlp_http.temporality_preference = + ExporterTemporalityPreference.Delta; + break; + case 'low_memory': + readerPeriodicInfo.exporter.otlp_http.temporality_preference = + ExporterTemporalityPreference.LowMemory; + break; + default: + readerPeriodicInfo.exporter.otlp_http.temporality_preference = + ExporterTemporalityPreference.Cumulative; + break; } - if (protocol === 'http/json') { - readerPeriodicInfo.exporter.otlp_http.encoding = - OtlpHttpEncoding.JSON; - } else if (protocol === 'http/protobuf') { - readerPeriodicInfo.exporter.otlp_http.encoding = - OtlpHttpEncoding.Protobuf; + } + if (defaultHistogramAggregation) { + switch (defaultHistogramAggregation) { + case 'explicit_bucket_histogram': + readerPeriodicInfo.exporter.otlp_http.default_histogram_aggregation = + ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; + break; + case 'base2_exponential_bucket_histogram': + readerPeriodicInfo.exporter.otlp_http.default_histogram_aggregation = + ExporterDefaultHistogramAggregation.Base2ExponentialBucketHistogram; + break; + default: + readerPeriodicInfo.exporter.otlp_http.default_histogram_aggregation = + ExporterDefaultHistogramAggregation.ExplicitBucketHistogram; + break; } } + if (protocol === 'http/json') { + readerPeriodicInfo.exporter.otlp_http.encoding = + OtlpHttpEncoding.JSON; + } else if (protocol === 'http/protobuf') { + readerPeriodicInfo.exporter.otlp_http.encoding = + OtlpHttpEncoding.Protobuf; + } } - config.meter_provider.readers.push({ periodic: readerPeriodicInfo }); } + config.meter_provider.readers.push({ periodic: readerPeriodicInfo }); } - const exemplarFilter = getStringFromEnv('OTEL_METRICS_EXEMPLAR_FILTER'); + + const exemplarFilter = getStringFromEnv('OTEL_METRICS_EXEMPLAR_FILTER') ?? 'trace_based'; if (exemplarFilter) { switch (exemplarFilter) { case 'trace_based': @@ -578,9 +574,20 @@ export function setMeterProvider(config: ConfigurationModel): void { } export function setLoggerProvider(config: ConfigurationModel): void { - if (config.logger_provider == null) { - config.logger_provider = { processors: [] }; + const exportersType = Array.from( + new Set(getStringListFromEnv('OTEL_LOGS_EXPORTER')) + ); + if (exportersType.length === 0) { + return; } + if (exportersType.includes('none')) { + diag.info( + `OTEL_LOGS_EXPORTER contains "none". Logger provider will not be initialized.` + ); + return; + } + config.logger_provider = initializeDefaultLoggerProviderConfiguration(); + const attributeValueLengthLimit = getNumberFromEnv( 'OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT' ); @@ -601,151 +608,131 @@ export function setLoggerProvider(config: ConfigurationModel): void { } } - const batch = - config.logger_provider?.processors && - config.logger_provider?.processors.length > 0 - ? config.logger_provider?.processors[0].batch - : undefined; - if (batch) { - const scheduleDelay = getNumberFromEnv('OTEL_BLRP_SCHEDULE_DELAY'); - if (scheduleDelay) { - batch.schedule_delay = scheduleDelay; - } - - const exportTimeout = getNumberFromEnv('OTEL_BLRP_EXPORT_TIMEOUT'); - if (exportTimeout) { - batch.export_timeout = exportTimeout; - } - - const maxQueueSize = getNumberFromEnv('OTEL_BLRP_MAX_QUEUE_SIZE'); - if (maxQueueSize) { - batch.max_queue_size = maxQueueSize; - } + const batch : BatchLogRecordProcessor = { exporter: {} }; + const scheduleDelay = getNumberFromEnv('OTEL_BLRP_SCHEDULE_DELAY') ?? 1000; + if (scheduleDelay) { + batch.schedule_delay = scheduleDelay; + } - const maxExportBatchSize = getNumberFromEnv( - 'OTEL_BLRP_MAX_EXPORT_BATCH_SIZE' - ); - if (maxExportBatchSize) { - batch.max_export_batch_size = maxExportBatchSize; - } + const exportTimeout = getNumberFromEnv('OTEL_BLRP_EXPORT_TIMEOUT') ?? 30000; + if (exportTimeout) { + batch.export_timeout = exportTimeout; + } - const exportersType = Array.from( - new Set(getStringListFromEnv('OTEL_LOGS_EXPORTER')) - ); - if (exportersType.length === 0) { - exportersType.push('otlp'); - } + const maxQueueSize = getNumberFromEnv('OTEL_BLRP_MAX_QUEUE_SIZE') ?? 2048; + if (maxQueueSize) { + batch.max_queue_size = maxQueueSize; + } - config.logger_provider.processors = []; - if (exportersType.includes('none')) { - diag.info( - `OTEL_LOGS_EXPORTER contains "none". Logger provider will not be initialized.` - ); - return; - } + const maxExportBatchSize = getNumberFromEnv( + 'OTEL_BLRP_MAX_EXPORT_BATCH_SIZE' + ) ?? 512; + if (maxExportBatchSize) { + batch.max_export_batch_size = maxExportBatchSize; + } - for (let i = 0; i < exportersType.length; i++) { - const exporterType = exportersType[i]; - const batchInfo = { ...batch }; - if (exporterType === 'console') { - config.logger_provider.processors.push({ - simple: { exporter: { console: {} } }, - }); + for (let i = 0; i < exportersType.length; i++) { + const exporterType = exportersType[i]; + const batchInfo = { ...batch }; + if (exporterType === 'console') { + config.logger_provider.processors.push({ + simple: { exporter: { console: {} } }, + }); + } else { + // 'otlp' and default + const protocol = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? + 'http/protobuf'; + const certificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); + const clientKeyFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); + const clientCertificateFile = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); + const compression = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); + const timeout = + getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? + getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? + 10000; + const headersList = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); + + if (protocol === 'grpc') { + delete batchInfo.exporter.otlp_http; + batchInfo.exporter.otlp_grpc = {}; + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? + 'http://localhost:4317'; + if (endpoint) { + batchInfo.exporter.otlp_grpc.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_grpc.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_grpc.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_grpc.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_grpc.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_grpc.headers_list = headersList; + } } else { - // 'otlp' and default - const protocol = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_PROTOCOL') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_PROTOCOL') ?? - 'http/protobuf'; - const certificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CERTIFICATE'); - const clientKeyFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_KEY'); - const clientCertificateFile = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE'); - const compression = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_COMPRESSION') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_COMPRESSION'); - const timeout = - getNumberFromEnv('OTEL_EXPORTER_OTLP_LOGS_TIMEOUT') ?? - getNumberFromEnv('OTEL_EXPORTER_OTLP_TIMEOUT') ?? - 10000; - const headersList = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_HEADERS') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); - - if (protocol === 'grpc') { - delete batchInfo.exporter.otlp_http; - batchInfo.exporter.otlp_grpc = {}; - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') ?? - 'http://localhost:4317'; - if (endpoint) { - batchInfo.exporter.otlp_grpc.endpoint = endpoint; - } - if (certificateFile) { - batchInfo.exporter.otlp_grpc.certificate_file = certificateFile; - } - if (clientKeyFile) { - batchInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; - } - if (clientCertificateFile) { - batchInfo.exporter.otlp_grpc.client_certificate_file = - clientCertificateFile; - } - if (compression) { - batchInfo.exporter.otlp_grpc.compression = compression; - } - if (timeout) { - batchInfo.exporter.otlp_grpc.timeout = timeout; - } - if (headersList) { - batchInfo.exporter.otlp_grpc.headers_list = headersList; - } - } else { - if (batchInfo.exporter.otlp_http == null) { - batchInfo.exporter.otlp_http = {}; - } - const endpoint = - getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? - (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') - ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` - : null); - if (endpoint) { - batchInfo.exporter.otlp_http.endpoint = endpoint; - } - if (certificateFile) { - batchInfo.exporter.otlp_http.certificate_file = certificateFile; - } - if (clientKeyFile) { - batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; - } - if (clientCertificateFile) { - batchInfo.exporter.otlp_http.client_certificate_file = - clientCertificateFile; - } - if (compression) { - batchInfo.exporter.otlp_http.compression = compression; - } - if (timeout) { - batchInfo.exporter.otlp_http.timeout = timeout; - } - if (headersList) { - batchInfo.exporter.otlp_http.headers_list = headersList; - } + if (batchInfo.exporter.otlp_http == null) { + batchInfo.exporter.otlp_http = {}; + } + const endpoint = + getStringFromEnv('OTEL_EXPORTER_OTLP_LOGS_ENDPOINT') ?? + (getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT') + ? `${getStringFromEnv('OTEL_EXPORTER_OTLP_ENDPOINT')}/v1/logs` + : 'http://localhost:4318/v1/logs'); + if (endpoint) { + batchInfo.exporter.otlp_http.endpoint = endpoint; + } + if (certificateFile) { + batchInfo.exporter.otlp_http.certificate_file = certificateFile; + } + if (clientKeyFile) { + batchInfo.exporter.otlp_http.client_key_file = clientKeyFile; + } + if (clientCertificateFile) { + batchInfo.exporter.otlp_http.client_certificate_file = + clientCertificateFile; + } + if (compression) { + batchInfo.exporter.otlp_http.compression = compression; + } + if (timeout) { + batchInfo.exporter.otlp_http.timeout = timeout; + } + if (headersList) { + batchInfo.exporter.otlp_http.headers_list = headersList; + } - if (protocol === 'http/json') { - batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.JSON; - } else if (protocol === 'http/protobuf') { - batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.Protobuf; - } + if (protocol === 'http/json') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.JSON; + } else if (protocol === 'http/protobuf') { + batchInfo.exporter.otlp_http.encoding = OtlpHttpEncoding.Protobuf; } - config.logger_provider.processors.push({ batch: batchInfo }); } + config.logger_provider.processors.push({ batch: batchInfo }); } } + } diff --git a/experimental/packages/configuration/src/FileConfigFactory.ts b/experimental/packages/configuration/src/FileConfigFactory.ts index fcb36667c87..3d717f7b800 100644 --- a/experimental/packages/configuration/src/FileConfigFactory.ts +++ b/experimental/packages/configuration/src/FileConfigFactory.ts @@ -34,11 +34,13 @@ import { } from './utils'; import { NameStringValuePair, OtlpHttpEncoding } from './models/commonModel'; import { + initializeDefaultTracerProviderConfiguration, SpanExporter, SpanProcessor, TracerProvider, } from './models/tracerProviderModel'; import { + initializeDefaultLoggerProviderConfiguration, LoggerProvider, LogRecordExporter, LogRecordProcessor, @@ -50,6 +52,7 @@ import { ExemplarFilter, ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, + initializeDefaultMeterProviderConfiguration, InstrumentType, MeterProvider, MetricProducer, @@ -448,12 +451,8 @@ export function setTracerProvider( config: ConfigurationModel, tracerProvider: TracerProvider ): void { - if (tracerProvider) { - if (config.tracer_provider == null) { - config.tracer_provider = { - processors: [], - }; - } + if (tracerProvider?.processors?.length > 0) { + config.tracer_provider = initializeDefaultTracerProviderConfiguration(); // Limits if (tracerProvider['limits']) { if (config.tracer_provider.limits == null) { @@ -776,9 +775,7 @@ export function setMeterProvider( meterProvider: MeterProvider ): void { if (meterProvider) { - if (config.meter_provider == null) { - config.meter_provider = { readers: [] }; - } + config.meter_provider = initializeDefaultMeterProviderConfiguration(); const exemplarFilter = getStringFromConfigFile( meterProvider['exemplar_filter'] ); @@ -1061,9 +1058,7 @@ export function setLoggerProvider( loggerProvider: LoggerProvider ): void { if (loggerProvider) { - if (config.logger_provider == null) { - config.logger_provider = { processors: [] }; - } + config.logger_provider = initializeDefaultLoggerProviderConfiguration(); // Limits if (loggerProvider['limits']) { const attributeValueLengthLimit = getNumberFromConfigFile( @@ -1090,9 +1085,6 @@ export function setLoggerProvider( // Processors if (loggerProvider['processors']) { if (loggerProvider['processors'].length > 0) { - if (config.logger_provider == null) { - config.logger_provider = { processors: [] }; - } config.logger_provider.processors = []; for (let i = 0; i < loggerProvider['processors'].length; i++) { const processorType = Object.keys(loggerProvider['processors'][i])[0]; @@ -1148,9 +1140,6 @@ export function setLoggerProvider( ] ); if (defaultConfigDisabled || defaultConfigDisabled === false) { - if (config.logger_provider == null) { - config.logger_provider = { processors: [] }; - } config.logger_provider['logger_configurator/development'] = { default_config: { disabled: defaultConfigDisabled, @@ -1185,9 +1174,6 @@ export function setLoggerProvider( }); } } - if (config.logger_provider == null) { - config.logger_provider = { processors: [] }; - } if (config.logger_provider['logger_configurator/development'] == null) { config.logger_provider['logger_configurator/development'] = {}; } diff --git a/experimental/packages/configuration/src/models/configModel.ts b/experimental/packages/configuration/src/models/configModel.ts index 63450cf8d1b..3e918fd3248 100644 --- a/experimental/packages/configuration/src/models/configModel.ts +++ b/experimental/packages/configuration/src/models/configModel.ts @@ -16,19 +16,10 @@ 'use strict'; import { DiagLogLevel } from '@opentelemetry/api'; -import { - initializeDefaultTracerProviderConfiguration, - TracerProvider, -} from './tracerProviderModel'; -import { - initializeDefaultLoggerProviderConfiguration, - LoggerProvider, -} from './loggerProviderModel'; +import { TracerProvider } from './tracerProviderModel'; +import { LoggerProvider } from './loggerProviderModel'; import { Resource } from './resourceModel'; -import { - initializeDefaultMeterProviderConfiguration, - MeterProvider, -} from './meterProviderModel'; +import { MeterProvider } from './meterProviderModel'; export interface ConfigurationModel { /** @@ -95,9 +86,6 @@ export function initializeDefaultConfiguration(): ConfigurationModel { composite: [{ tracecontext: null }, { baggage: null }], composite_list: 'tracecontext,baggage', }, - tracer_provider: initializeDefaultTracerProviderConfiguration(), - meter_provider: initializeDefaultMeterProviderConfiguration(), - logger_provider: initializeDefaultLoggerProviderConfiguration(), }; return config; diff --git a/experimental/packages/configuration/src/models/loggerProviderModel.ts b/experimental/packages/configuration/src/models/loggerProviderModel.ts index 1816a28d993..607ccb43c1f 100644 --- a/experimental/packages/configuration/src/models/loggerProviderModel.ts +++ b/experimental/packages/configuration/src/models/loggerProviderModel.ts @@ -18,29 +18,12 @@ import { OtlpFileExporter, OtlpGrpcExporter, - OtlpHttpEncoding, OtlpHttpExporter, } from './commonModel'; export function initializeDefaultLoggerProviderConfiguration(): LoggerProvider { return { - processors: [ - { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/logs', - timeout: 10000, - encoding: OtlpHttpEncoding.Protobuf, - }, - }, - }, - }, - ], + processors: [], limits: { attribute_count_limit: 128, }, diff --git a/experimental/packages/configuration/src/models/meterProviderModel.ts b/experimental/packages/configuration/src/models/meterProviderModel.ts index 4759530e2b3..df0654096bc 100644 --- a/experimental/packages/configuration/src/models/meterProviderModel.ts +++ b/experimental/packages/configuration/src/models/meterProviderModel.ts @@ -23,24 +23,7 @@ import { export function initializeDefaultMeterProviderConfiguration(): MeterProvider { return { - readers: [ - { - periodic: { - interval: 60000, - timeout: 30000, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/metrics', - timeout: 10000, - temporality_preference: ExporterTemporalityPreference.Cumulative, - default_histogram_aggregation: - ExporterDefaultHistogramAggregation.ExplicitBucketHistogram, - encoding: OtlpHttpEncoding.Protobuf, - }, - }, - }, - }, - ], + readers: [], exemplar_filter: ExemplarFilter.TraceBased, }; } diff --git a/experimental/packages/configuration/src/models/tracerProviderModel.ts b/experimental/packages/configuration/src/models/tracerProviderModel.ts index 5e337a66a1a..fae23d2e32e 100644 --- a/experimental/packages/configuration/src/models/tracerProviderModel.ts +++ b/experimental/packages/configuration/src/models/tracerProviderModel.ts @@ -18,29 +18,12 @@ import { OtlpFileExporter, OtlpGrpcExporter, - OtlpHttpEncoding, OtlpHttpExporter, } from './commonModel'; export function initializeDefaultTracerProviderConfiguration(): TracerProvider { return { - processors: [ - { - batch: { - schedule_delay: 5000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/traces', - timeout: 10000, - encoding: OtlpHttpEncoding.Protobuf, - }, - }, - }, - }, - ], + processors: [], limits: { attribute_count_limit: 128, event_count_limit: 128, diff --git a/experimental/packages/configuration/test/ConfigFactory.test.ts b/experimental/packages/configuration/test/ConfigFactory.test.ts index a0200c60615..23375dd6d16 100644 --- a/experimental/packages/configuration/test/ConfigFactory.test.ts +++ b/experimental/packages/configuration/test/ConfigFactory.test.ts @@ -24,25 +24,23 @@ import { ExporterDefaultHistogramAggregation, ExporterTemporalityPreference, InstrumentType, + MeterProvider, } from '../src/models/meterProviderModel'; import { setAttributeLimits, - setLoggerProvider, setMeterProvider, setPropagators, setResources, - setTracerProvider, } from '../src/EnvironmentConfigFactory'; import { parseConfigFile, setResourceAttributes, setAttributeLimits as setFileAttributeLimits, setPropagator, - setTracerProvider as setFileTracerProvider, - setLoggerProvider as setFileLoggerProvider, setMeterProvider as setFileMeterProvider, getTemporalityPreference, } from '../src/FileConfigFactory'; +import { TracerProvider } from '../src/models/tracerProviderModel'; const defaultConfig: ConfigurationModel = { disabled: false, @@ -56,82 +54,24 @@ const defaultConfig: ConfigurationModel = { composite: [{ tracecontext: null }, { baggage: null }], composite_list: 'tracecontext,baggage', }, - tracer_provider: { - processors: [ - { - batch: { - schedule_delay: 5000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/traces', - timeout: 10000, - encoding: OtlpHttpEncoding.Protobuf, - }, - }, - }, - }, - ], - limits: { - attribute_count_limit: 128, - event_count_limit: 128, - link_count_limit: 128, - event_attribute_count_limit: 128, - link_attribute_count_limit: 128, - }, - sampler: { - parent_based: { - root: { always_on: undefined }, - remote_parent_sampled: { always_on: undefined }, - remote_parent_not_sampled: { always_off: undefined }, - local_parent_sampled: { always_on: undefined }, - local_parent_not_sampled: { always_off: undefined }, - }, - }, - }, - meter_provider: { - readers: [ - { - periodic: { - interval: 60000, - timeout: 30000, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/metrics', - timeout: 10000, - temporality_preference: ExporterTemporalityPreference.Cumulative, - default_histogram_aggregation: - ExporterDefaultHistogramAggregation.ExplicitBucketHistogram, - encoding: OtlpHttpEncoding.Protobuf, - }, - }, - }, - }, - ], - exemplar_filter: ExemplarFilter.TraceBased, +}; + +const defaultTracerProvider: TracerProvider = { + processors: [], + limits: { + attribute_count_limit: 128, + event_count_limit: 128, + link_count_limit: 128, + event_attribute_count_limit: 128, + link_attribute_count_limit: 128, }, - logger_provider: { - processors: [ - { - batch: { - schedule_delay: 1000, - export_timeout: 30000, - max_queue_size: 2048, - max_export_batch_size: 512, - exporter: { - otlp_http: { - endpoint: 'http://localhost:4318/v1/logs', - timeout: 10000, - encoding: OtlpHttpEncoding.Protobuf, - }, - }, - }, - }, - ], - limits: { - attribute_count_limit: 128, + sampler: { + parent_based: { + root: { always_on: undefined }, + remote_parent_sampled: { always_on: undefined }, + remote_parent_not_sampled: { always_off: undefined }, + local_parent_sampled: { always_on: undefined }, + local_parent_not_sampled: { always_off: undefined }, }, }, }; @@ -299,7 +239,6 @@ const configFromFile: ConfigurationModel = { }, }, ], - limits: { attribute_count_limit: 128, attribute_value_length_limit: 4096, @@ -861,6 +800,7 @@ describe('ConfigFactory', function () { }); it('should return config with custom tracer_provider', function () { + process.env.OTEL_TRACES_EXPORTER = 'otlp'; process.env.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT = '100'; process.env.OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT = '200'; process.env.OTEL_SPAN_EVENT_COUNT_LIMIT = '300'; @@ -930,12 +870,43 @@ describe('ConfigFactory', function () { assert.deepStrictEqual(configFactory.getConfigModel(), expectedConfig); }); + it('should return config with tracer_provider otlp and json protocol', function () { + process.env.OTEL_TRACES_EXPORTER = 'otlp'; + process.env.OTEL_EXPORTER_OTLP_TRACES_PROTOCOL = 'http/json'; + + const expectedConfig: ConfigurationModel = { + ...defaultConfig, + tracer_provider: { + ...defaultTracerProvider, + processors: [ + { + batch: { + schedule_delay: 5000, + export_timeout: 30000, + max_queue_size: 2048, + max_export_batch_size: 512, + exporter: { + otlp_http: { + endpoint: 'http://localhost:4318/v1/traces', + timeout: 10000, + encoding: OtlpHttpEncoding.JSON, + }, + }, + }, + }, + ], + }, + }; + const configFactory = createConfigFactory(); + assert.deepStrictEqual(configFactory.getConfigModel(), expectedConfig); + }); + it('should return config with tracer_provider with console exporter', function () { process.env.OTEL_TRACES_EXPORTER = 'console'; const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { - ...defaultConfig.tracer_provider, + ...defaultTracerProvider, processors: [ { simple: { @@ -956,7 +927,7 @@ describe('ConfigFactory', function () { const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { - ...defaultConfig.tracer_provider, + ...defaultTracerProvider, processors: [ { batch: { @@ -979,7 +950,7 @@ describe('ConfigFactory', function () { assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); }); - it('should return config with tracer_provider with default zipkin exporter', function () { + it('should return config with tracer_provider with custom zipkin exporter', function () { process.env.OTEL_TRACES_EXPORTER = 'zipkin'; process.env.OTEL_EXPORTER_ZIPKIN_ENDPOINT = 'http://custom:9411/api/v2/spans'; @@ -987,7 +958,7 @@ describe('ConfigFactory', function () { const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { - ...defaultConfig.tracer_provider, + ...defaultTracerProvider, processors: [ { batch: { @@ -1018,7 +989,7 @@ describe('ConfigFactory', function () { const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { - ...defaultConfig.tracer_provider, + ...defaultTracerProvider, processors: [ { batch: { @@ -1065,15 +1036,8 @@ describe('ConfigFactory', function () { it('should return config with tracer_provider with no exporter', function () { process.env.OTEL_TRACES_EXPORTER = 'none,console'; - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - tracer_provider: { - ...defaultConfig.tracer_provider, - processors: [], - }, - }; const configProvider = createConfigFactory(); - assert.deepStrictEqual(configProvider.getConfigModel(), expectedConfig); + assert.deepStrictEqual(configProvider.getConfigModel(), defaultConfig); }); it('should return config with tracer_provider with otlp grpc exporter', function () { @@ -1088,7 +1052,7 @@ describe('ConfigFactory', function () { const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { - ...defaultConfig.tracer_provider, + ...defaultTracerProvider, processors: [ { batch: { @@ -1119,6 +1083,7 @@ describe('ConfigFactory', function () { it('should return config with custom meter_provider', function () { process.env.OTEL_METRIC_EXPORT_INTERVAL = '100'; process.env.OTEL_METRIC_EXPORT_TIMEOUT = '200'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT = 'http://test.com:4318/v1/metrics'; process.env.OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE = @@ -1193,16 +1158,8 @@ describe('ConfigFactory', function () { it('should return config with meter_provider with no exporter', function () { process.env.OTEL_METRICS_EXPORTER = 'none,console'; - - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - meter_provider: { - readers: [], - exemplar_filter: ExemplarFilter.TraceBased, - }, - }; const configFactory = createConfigFactory(); - assert.deepStrictEqual(configFactory.getConfigModel(), expectedConfig); + assert.deepStrictEqual(configFactory.getConfigModel(), defaultConfig); }); it('should return config with meter_provider with list of exporters', function () { @@ -1426,6 +1383,7 @@ describe('ConfigFactory', function () { process.env.OTEL_BLRP_EXPORT_TIMEOUT = '400'; process.env.OTEL_BLRP_MAX_QUEUE_SIZE = '500'; process.env.OTEL_BLRP_MAX_EXPORT_BATCH_SIZE = '600'; + process.env.OTEL_LOGS_EXPORTER = 'otlp'; process.env.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT = 'http://test.com:4318/v1/logs'; process.env.OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE = 'certificate_file.txt'; @@ -1495,17 +1453,8 @@ describe('ConfigFactory', function () { it('should return config with logger_provider with no exporter', function () { process.env.OTEL_LOGS_EXPORTER = 'none,console'; - const expectedConfig: ConfigurationModel = { - ...defaultConfig, - logger_provider: { - limits: { - attribute_count_limit: 128, - }, - processors: [], - }, - }; const configFactory = createConfigFactory(); - assert.deepStrictEqual(configFactory.getConfigModel(), expectedConfig); + assert.deepStrictEqual(configFactory.getConfigModel(), defaultConfig); }); it('should return config with logger_provider with exporter list', function () { @@ -1632,13 +1581,20 @@ describe('ConfigFactory', function () { process.env.OTEL_EXPORTER_OTLP_COMPRESSION = 'backup_compression'; process.env.OTEL_EXPORTER_OTLP_TIMEOUT = '12000'; process.env.OTEL_EXPORTER_OTLP_HEADERS = 'backup_headers=123'; + process.env.OTEL_TRACES_EXPORTER = 'otlp'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; + process.env.OTEL_LOGS_EXPORTER = 'otlp'; const expectedConfig: ConfigurationModel = { ...defaultConfig, tracer_provider: { + ...defaultTracerProvider, processors: [ { batch: { - ...defaultConfig.tracer_provider?.processors[0].batch, + export_timeout: 30000, + max_export_batch_size: 512, + max_queue_size: 2048, + schedule_delay: 5000, exporter: { otlp_http: { endpoint: 'http://backup.com:4318/v1/traces', @@ -1654,11 +1610,9 @@ describe('ConfigFactory', function () { }, }, ], - limits: defaultConfig.tracer_provider?.limits, - sampler: defaultConfig.tracer_provider?.sampler, }, meter_provider: { - ...defaultConfig.meter_provider, + exemplar_filter: ExemplarFilter.TraceBased, readers: [ { periodic: { @@ -1685,7 +1639,9 @@ describe('ConfigFactory', function () { ], }, logger_provider: { - ...defaultConfig.logger_provider, + limits: { + attribute_count_limit: 128, + }, processors: [ { batch: { @@ -1744,185 +1700,65 @@ describe('ConfigFactory', function () { assert.deepStrictEqual(config, { propagator: {} }); config = {}; - setTracerProvider(config); - assert.deepStrictEqual(config, { - tracer_provider: { limits: {}, processors: [] }, - }); - - config = {}; - process.env.OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT = '3'; - setLoggerProvider(config); - assert.deepStrictEqual(config, { - logger_provider: { - limits: { - attribute_count_limit: 128, - attribute_value_length_limit: 3, - }, - processors: [], - }, - }); - - config = { - meter_provider: { - readers: [{ periodic: { exporter: { otlp_http: undefined } } }], - }, - }; - process.env.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE = - 'cumulative'; - setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [ - { - periodic: { - exporter: { - otlp_http: { - default_histogram_aggregation: 'explicit_bucket_histogram', - encoding: 'protobuf', - temporality_preference: 'cumulative', - timeout: 10000, - }, - }, - timeout: 30000, - }, - }, - ], - }, - }); - process.env.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE = 'low_memory'; + process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'always_off'; + process.env.OTEL_METRICS_EXPORTER = 'otlp'; setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [ - { - periodic: { - exporter: { - otlp_http: { - default_histogram_aggregation: 'explicit_bucket_histogram', - encoding: 'protobuf', - temporality_preference: 'low_memory', - timeout: 10000, - }, - }, - timeout: 30000, - }, - }, - ], - }, - }); - process.env.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE = 'default'; - setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [ - { - periodic: { - exporter: { - otlp_http: { - default_histogram_aggregation: 'explicit_bucket_histogram', - encoding: 'protobuf', - temporality_preference: 'cumulative', - timeout: 10000, - }, + let expectedMeterProvider: MeterProvider = { + exemplar_filter: ExemplarFilter.AlwaysOff, + readers: [ + { + periodic: { + exporter: { + otlp_http: { + default_histogram_aggregation: + ExporterDefaultHistogramAggregation.ExplicitBucketHistogram, + encoding: OtlpHttpEncoding.Protobuf, + endpoint: 'http://localhost:4318/v1/metrics', + temporality_preference: + ExporterTemporalityPreference.LowMemory, + timeout: 10000, }, - timeout: 30000, }, + interval: 60000, + timeout: 30000, }, - ], - }, - }); - delete process.env.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE; - - config = { - meter_provider: { - readers: [{ periodic: { exporter: { otlp_http: undefined } } }], - }, + }, + ], }; - process.env.OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION = - 'explicit_bucket_histogram'; - setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [ - { - periodic: { - exporter: { - otlp_http: { - default_histogram_aggregation: 'explicit_bucket_histogram', - encoding: 'protobuf', - temporality_preference: 'cumulative', - timeout: 10000, - }, - }, - timeout: 30000, - }, - }, - ], - }, - }); + assert.deepStrictEqual(config.meter_provider, expectedMeterProvider); + config = {}; + process.env.OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE = 'default'; process.env.OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION = 'default'; + process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'default'; setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [ - { - periodic: { - exporter: { - otlp_http: { - default_histogram_aggregation: 'explicit_bucket_histogram', - encoding: 'protobuf', - temporality_preference: 'cumulative', - timeout: 10000, - }, + expectedMeterProvider = { + exemplar_filter: ExemplarFilter.TraceBased, + readers: [ + { + periodic: { + exporter: { + otlp_http: { + default_histogram_aggregation: + ExporterDefaultHistogramAggregation.ExplicitBucketHistogram, + encoding: OtlpHttpEncoding.Protobuf, + endpoint: 'http://localhost:4318/v1/metrics', + temporality_preference: + ExporterTemporalityPreference.Cumulative, + timeout: 10000, }, - timeout: 30000, }, + interval: 60000, + timeout: 30000, }, - ], - }, - }); - - config = {}; - setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [{}], - }, - }); - - process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'trace_based'; - setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [{}], - exemplar_filter: 'trace_based', - }, - }); - - config = {}; - process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'always_off'; - setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [{}], - exemplar_filter: 'always_off', - }, - }); - - config = {}; - process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'default'; - setMeterProvider(config); - assert.deepStrictEqual(config, { - meter_provider: { - readers: [{}], - exemplar_filter: 'trace_based', - }, - }); + }, + ], + }; + assert.deepStrictEqual(config.meter_provider, expectedMeterProvider); }); }); @@ -2200,45 +2036,20 @@ describe('ConfigFactory', function () { propagator: { composite: [{ tracecontext: null }] }, }); - config = {}; - setFileTracerProvider(config, { processors: [] }); - assert.deepStrictEqual(config, { - tracer_provider: { processors: [] }, - }); - - config = {}; - setFileLoggerProvider(config, { processors: [] }); - assert.deepStrictEqual(config, { - logger_provider: { processors: [] }, - }); - const res = getTemporalityPreference( ExporterTemporalityPreference.LowMemory ); assert.deepStrictEqual(res, 'low_memory'); - config = {}; - setFileMeterProvider(config, { readers: [] }); - assert.deepStrictEqual(config, { - meter_provider: { readers: [] }, - }); - config = {}; setFileMeterProvider(config, { readers: [], exemplar_filter: ExemplarFilter.AlwaysOn, - }); - assert.deepStrictEqual(config, { - meter_provider: { readers: [], exemplar_filter: 'always_on' }, - }); - - config = {}; - setFileMeterProvider(config, { - readers: [], views: [{ selector: { instrument_type: InstrumentType.Counter } }], }); assert.deepStrictEqual(config, { meter_provider: { + exemplar_filter: 'always_on', readers: [], views: [{ selector: { instrument_type: 'counter' } }], }, @@ -2251,6 +2062,7 @@ describe('ConfigFactory', function () { }); assert.deepStrictEqual(config, { meter_provider: { + exemplar_filter: 'trace_based', readers: [], views: [{ selector: { instrument_type: 'gauge' } }], }, @@ -2265,6 +2077,7 @@ describe('ConfigFactory', function () { }); assert.deepStrictEqual(config, { meter_provider: { + exemplar_filter: 'trace_based', readers: [], views: [{ selector: { instrument_type: 'observable_counter' } }], }, @@ -2279,6 +2092,7 @@ describe('ConfigFactory', function () { }); assert.deepStrictEqual(config, { meter_provider: { + exemplar_filter: 'trace_based', readers: [], views: [{ selector: { instrument_type: 'observable_gauge' } }], }, @@ -2297,6 +2111,7 @@ describe('ConfigFactory', function () { }); assert.deepStrictEqual(config, { meter_provider: { + exemplar_filter: 'trace_based', readers: [], views: [ { selector: { instrument_type: 'observable_up_down_counter' } }, @@ -2310,13 +2125,136 @@ describe('ConfigFactory', function () { views: [ { selector: { instrument_type: InstrumentType.UpDownCounter } }, ], + exemplar_filter: 'default' as ExemplarFilter, }); assert.deepStrictEqual(config, { meter_provider: { + exemplar_filter: 'trace_based', readers: [], views: [{ selector: { instrument_type: 'up_down_counter' } }], }, }); + + config = {}; + setFileMeterProvider(config, { + views: [{ stream: { aggregation: { default: {} } } }], + readers: [], + }); + assert.deepStrictEqual(config, { + meter_provider: { + exemplar_filter: 'trace_based', + readers: [], + views: [ + { + stream: { + aggregation: { + default: {}, + }, + }, + }, + ], + }, + }); + + config = {}; + setFileMeterProvider(config, { + views: [{ stream: { aggregation: { drop: {} } } }], + readers: [], + }); + assert.deepStrictEqual(config, { + meter_provider: { + exemplar_filter: 'trace_based', + readers: [], + views: [ + { + stream: { + aggregation: { + drop: {}, + }, + }, + }, + ], + }, + }); + + config = {}; + setFileMeterProvider(config, { + views: [{ stream: { aggregation: { last_value: {} } } }], + readers: [], + }); + assert.deepStrictEqual(config, { + meter_provider: { + exemplar_filter: 'trace_based', + readers: [], + views: [ + { + stream: { + aggregation: { + last_value: {}, + }, + }, + }, + ], + }, + }); + + config = {}; + setFileMeterProvider(config, { + views: [{ stream: { aggregation: { sum: {} } } }], + readers: [], + }); + assert.deepStrictEqual(config, { + meter_provider: { + exemplar_filter: 'trace_based', + readers: [], + views: [ + { + stream: { + aggregation: { + sum: {}, + }, + }, + }, + ], + }, + }); + + config = {}; + setFileMeterProvider(config, { + views: [ + { + stream: { + aggregation: { + base2_exponential_bucket_histogram: { + record_min_max: false, + max_scale: 20, + max_size: 160, + }, + }, + }, + }, + ], + readers: [], + }); + assert.deepStrictEqual(config, { + meter_provider: { + exemplar_filter: 'trace_based', + readers: [], + views: [ + { + stream: { + aggregation: { + base2_exponential_bucket_histogram: { + record_min_max: false, + max_scale: 20, + max_size: 160, + }, + }, + }, + }, + ], + }, + }); }); }); }); From b008c4559fd6406c3b11fcf213328a20ec436a05 Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 21:38:20 -0500 Subject: [PATCH 53/58] changelog --- experimental/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 395399b9837..fdb151b5071 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -16,6 +16,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(configuration): set meter provider exporter type from env variable [#6105](https://github.com/open-telemetry/opentelemetry-js/pull/6105) @maryliag * feat(configuration): set tracer provider exporter type from env variables [#6106](https://github.com/open-telemetry/opentelemetry-js/pull/6106) @maryliag * feat(configuration): set meter provider exporter type from env variable [#6105](https://github.com/open-telemetry/opentelemetry-js/pull/6105) @maryliag +* feat(configuration): doesnt set meter,tracer,logger provider by default [#x](https://github.com/open-telemetry/opentelemetry-js/pull/x) @maryliag ### :bug: Bug Fixes From 94a898e4ef43e60706e5466f7dfa4fb4772789bd Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 21:44:38 -0500 Subject: [PATCH 54/58] update changelog --- experimental/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index 25e6b30439f..1c007491b2b 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -17,7 +17,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(configuration): set tracer provider exporter type from env variables [#6106](https://github.com/open-telemetry/opentelemetry-js/pull/6106) @maryliag * feat(configuration): set meter provider exporter type from env variable [#6105](https://github.com/open-telemetry/opentelemetry-js/pull/6105) @maryliag * refactor(configuration): throw warning and not error for invalid files [#6124](https://github.com/open-telemetry/opentelemetry-js/pull/6124) @maryliag -* feat(configuration): doesnt set meter,tracer,logger provider by default [#x](https://github.com/open-telemetry/opentelemetry-js/pull/x) @maryliag +* feat(configuration): doesnt set meter,tracer,logger provider by default [#6130](https://github.com/open-telemetry/opentelemetry-js/pull/6130) @maryliag ### :bug: Bug Fixes From 90ab46b937de697fc93e58778560466611aae367 Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 21:56:15 -0500 Subject: [PATCH 55/58] dont have default for node resource detectors --- experimental/CHANGELOG.md | 1 + experimental/packages/configuration/src/models/configModel.ts | 1 - experimental/packages/configuration/test/ConfigFactory.test.ts | 3 --- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/experimental/CHANGELOG.md b/experimental/CHANGELOG.md index d5fdf287625..98ab7637060 100644 --- a/experimental/CHANGELOG.md +++ b/experimental/CHANGELOG.md @@ -17,6 +17,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2 * feat(configuration): set tracer provider exporter type from env variables [#6106](https://github.com/open-telemetry/opentelemetry-js/pull/6106) @maryliag * feat(configuration): set meter provider exporter type from env variable [#6105](https://github.com/open-telemetry/opentelemetry-js/pull/6105) @maryliag * refactor(configuration): throw warning and not error for invalid files [#6124](https://github.com/open-telemetry/opentelemetry-js/pull/6124) @maryliag +* refactor(configuration): dont have a default value for node resource detectors [#x](https://github.com/open-telemetry/opentelemetry-js/pull/x) @maryliag ### :bug: Bug Fixes diff --git a/experimental/packages/configuration/src/models/configModel.ts b/experimental/packages/configuration/src/models/configModel.ts index 63450cf8d1b..dd323b9ba38 100644 --- a/experimental/packages/configuration/src/models/configModel.ts +++ b/experimental/packages/configuration/src/models/configModel.ts @@ -86,7 +86,6 @@ export function initializeDefaultConfiguration(): ConfigurationModel { const config: ConfigurationModel = { disabled: false, log_level: DiagLogLevel.INFO, - node_resource_detectors: ['all'], resource: {}, attribute_limits: { attribute_count_limit: 128, diff --git a/experimental/packages/configuration/test/ConfigFactory.test.ts b/experimental/packages/configuration/test/ConfigFactory.test.ts index 1ddba57affc..dbd1e73fcea 100644 --- a/experimental/packages/configuration/test/ConfigFactory.test.ts +++ b/experimental/packages/configuration/test/ConfigFactory.test.ts @@ -48,7 +48,6 @@ import { const defaultConfig: ConfigurationModel = { disabled: false, log_level: DiagLogLevel.INFO, - node_resource_detectors: ['all'], resource: {}, attribute_limits: { attribute_count_limit: 128, @@ -140,7 +139,6 @@ const defaultConfig: ConfigurationModel = { const configFromFile: ConfigurationModel = { disabled: false, log_level: DiagLogLevel.INFO, - node_resource_detectors: ['all'], resource: { schema_url: 'https://opentelemetry.io/schemas/1.16.0', attributes_list: 'service.namespace=my-namespace,service.version=1.0.0', @@ -631,7 +629,6 @@ const configFromFile: ConfigurationModel = { const defaultConfigFromFileWithEnvVariables: ConfigurationModel = { disabled: false, log_level: DiagLogLevel.INFO, - node_resource_detectors: ['all'], resource: { attributes: [ { From fb9fd37cd205fdb6e00d57ad0fc8f82037de7613 Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 22:06:59 -0500 Subject: [PATCH 56/58] fix lint --- .../src/EnvironmentConfigFactory.ts | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts index 8f5a16a5d41..918a044a4f1 100644 --- a/experimental/packages/configuration/src/EnvironmentConfigFactory.ts +++ b/experimental/packages/configuration/src/EnvironmentConfigFactory.ts @@ -35,8 +35,14 @@ import { } from './models/meterProviderModel'; import { OtlpHttpEncoding } from './models/commonModel'; import { diag } from '@opentelemetry/api'; -import { BatchSpanProcessor, initializeDefaultTracerProviderConfiguration } from './models/tracerProviderModel'; -import { BatchLogRecordProcessor, initializeDefaultLoggerProviderConfiguration } from './models/loggerProviderModel'; +import { + BatchSpanProcessor, + initializeDefaultTracerProviderConfiguration, +} from './models/tracerProviderModel'; +import { + BatchLogRecordProcessor, + initializeDefaultLoggerProviderConfiguration, +} from './models/loggerProviderModel'; /** * EnvironmentConfigProvider provides a configuration based on environment variables. @@ -203,7 +209,7 @@ export function setTracerProvider(config: ConfigurationModel): void { linkAttributeCountLimit; } - const batch : BatchSpanProcessor = { exporter: {} }; + const batch: BatchSpanProcessor = { exporter: {} }; const scheduleDelay = getNumberFromEnv('OTEL_BSP_SCHEDULE_DELAY') ?? 5000; if (scheduleDelay) { batch.schedule_delay = scheduleDelay; @@ -219,9 +225,8 @@ export function setTracerProvider(config: ConfigurationModel): void { batch.max_queue_size = maxQueueSize; } - const maxExportBatchSize = getNumberFromEnv( - 'OTEL_BSP_MAX_EXPORT_BATCH_SIZE' - ) ?? 512; + const maxExportBatchSize = + getNumberFromEnv('OTEL_BSP_MAX_EXPORT_BATCH_SIZE') ?? 512; if (maxExportBatchSize) { batch.max_export_batch_size = maxExportBatchSize; } @@ -398,9 +403,8 @@ export function setMeterProvider(config: ConfigurationModel): void { getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_HEADERS') ?? getStringFromEnv('OTEL_EXPORTER_OTLP_HEADERS'); const temporalityPreference = - getStringFromEnv( - 'OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE' - ) ?? 'cumulative'; + getStringFromEnv('OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE') ?? + 'cumulative'; const defaultHistogramAggregation = getStringFromEnv( 'OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION' @@ -421,8 +425,7 @@ export function setMeterProvider(config: ConfigurationModel): void { certificateFile; } if (clientKeyFile) { - readerPeriodicInfo.exporter.otlp_grpc.client_key_file = - clientKeyFile; + readerPeriodicInfo.exporter.otlp_grpc.client_key_file = clientKeyFile; } if (clientCertificateFile) { readerPeriodicInfo.exporter.otlp_grpc.client_certificate_file = @@ -490,8 +493,7 @@ export function setMeterProvider(config: ConfigurationModel): void { certificateFile; } if (clientKeyFile) { - readerPeriodicInfo.exporter.otlp_http.client_key_file = - clientKeyFile; + readerPeriodicInfo.exporter.otlp_http.client_key_file = clientKeyFile; } if (clientCertificateFile) { readerPeriodicInfo.exporter.otlp_http.client_certificate_file = @@ -553,8 +555,9 @@ export function setMeterProvider(config: ConfigurationModel): void { } config.meter_provider.readers.push({ periodic: readerPeriodicInfo }); } - - const exemplarFilter = getStringFromEnv('OTEL_METRICS_EXEMPLAR_FILTER') ?? 'trace_based'; + + const exemplarFilter = + getStringFromEnv('OTEL_METRICS_EXEMPLAR_FILTER') ?? 'trace_based'; if (exemplarFilter) { switch (exemplarFilter) { case 'trace_based': @@ -608,7 +611,7 @@ export function setLoggerProvider(config: ConfigurationModel): void { } } - const batch : BatchLogRecordProcessor = { exporter: {} }; + const batch: BatchLogRecordProcessor = { exporter: {} }; const scheduleDelay = getNumberFromEnv('OTEL_BLRP_SCHEDULE_DELAY') ?? 1000; if (scheduleDelay) { batch.schedule_delay = scheduleDelay; @@ -624,9 +627,8 @@ export function setLoggerProvider(config: ConfigurationModel): void { batch.max_queue_size = maxQueueSize; } - const maxExportBatchSize = getNumberFromEnv( - 'OTEL_BLRP_MAX_EXPORT_BATCH_SIZE' - ) ?? 512; + const maxExportBatchSize = + getNumberFromEnv('OTEL_BLRP_MAX_EXPORT_BATCH_SIZE') ?? 512; if (maxExportBatchSize) { batch.max_export_batch_size = maxExportBatchSize; } @@ -734,5 +736,4 @@ export function setLoggerProvider(config: ConfigurationModel): void { config.logger_provider.processors.push({ batch: batchInfo }); } } - } From ce227e4383552a2cfaf3d8b63b79c5829fffd656 Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 22:19:53 -0500 Subject: [PATCH 57/58] remove instance id changes --- .../packages/opentelemetry-sdk-node/src/sdk.ts | 12 ------------ .../packages/opentelemetry-sdk-node/src/utils.ts | 12 ------------ .../test/util/resource-assertions.ts | 16 ++++------------ 3 files changed, 4 insertions(+), 36 deletions(-) diff --git a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts index 59dbe18b3db..1aedbc459cf 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/sdk.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/sdk.ts @@ -70,14 +70,12 @@ import { getPropagatorFromEnv, setupPropagator, setupContextManager, - getInstanceID, } from './utils'; import { ConfigFactory, ConfigurationModel, createConfigFactory, } from '@opentelemetry/configuration'; -import { ATTR_SERVICE_INSTANCE_ID } from './semconv'; type TracerProviderConfig = { tracerConfig: NodeTracerConfig; @@ -392,16 +390,6 @@ export class NodeSDK { }) ); - const instanceId = getInstanceID(this._config); - this._resource = - instanceId === undefined - ? this._resource - : this._resource.merge( - resourceFromAttributes({ - [ATTR_SERVICE_INSTANCE_ID]: instanceId, - }) - ); - const spanProcessors = this._tracerProviderConfig ? this._tracerProviderConfig.spanProcessors : getSpanProcessorsFromEnv(); diff --git a/experimental/packages/opentelemetry-sdk-node/src/utils.ts b/experimental/packages/opentelemetry-sdk-node/src/utils.ts index 49aad42464c..8ea97fe2b73 100644 --- a/experimental/packages/opentelemetry-sdk-node/src/utils.ts +++ b/experimental/packages/opentelemetry-sdk-node/src/utils.ts @@ -89,18 +89,6 @@ export function getResourceDetectorsFromEnv( }); } -export function getInstanceID(config: ConfigurationModel): string | undefined { - if (config.resource?.attributes) { - for (let i = 0; i < config.resource.attributes.length; i++) { - const element = config.resource.attributes[i]; - if (element.name === 'service.instance.id') { - return element.value?.toString(); - } - } - } - return undefined; -} - export function filterBlanksAndNulls(list: string[]): string[] { return list.map(item => item.trim()).filter(s => s !== 'null' && s !== ''); } diff --git a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts index ec088c766b7..b02e0d7d36a 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/util/resource-assertions.ts @@ -42,18 +42,10 @@ export const assertServiceResource = ( } ) => { assert.strictEqual(resource.attributes[ATTR_SERVICE_NAME], validations.name); - if (validations.instanceId) { - assert.strictEqual( - resource.attributes[ATTR_SERVICE_INSTANCE_ID], - validations.instanceId - ); - } else { - assert.notEqual( - resource.attributes[ATTR_SERVICE_INSTANCE_ID], - null, - `${ATTR_SERVICE_INSTANCE_ID} must not be null` - ); - } + assert.strictEqual( + resource.attributes[ATTR_SERVICE_INSTANCE_ID], + validations.instanceId + ); if (validations.namespace) assert.strictEqual( From ca5405a123f13a293e4da84c3ba6a20761b08011 Mon Sep 17 00:00:00 2001 From: maryliag Date: Tue, 18 Nov 2025 22:44:40 -0500 Subject: [PATCH 58/58] update tests --- .../packages/opentelemetry-sdk-node/test/sdk.test.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts index 208f8b760be..f68911db64f 100644 --- a/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts +++ b/experimental/packages/opentelemetry-sdk-node/test/sdk.test.ts @@ -1100,7 +1100,17 @@ describe('Node SDK', () => { await sdk.shutdown(); }); - it('should use otlp with http/protobuf by default', async () => { + it('should not set logger provider by default', async () => { + const sdk = new NodeSDK(); + sdk.start(); + const loggerProvider = logs.getLoggerProvider(); + const sharedState = (loggerProvider as any)['_sharedState']; + assert.equal(sharedState, undefined); + await sdk.shutdown(); + }); + + it('should use otlp with http/protobuf by default for otlp', async () => { + process.env.OTEL_LOGS_EXPORTER = 'otlp'; const sdk = new NodeSDK(); sdk.start(); const loggerProvider = logs.getLoggerProvider();