From 9657aa59ef2680ec558fcfac8dc1bc6fb164eeb6 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jul 2024 16:21:54 +0100 Subject: [PATCH 01/82] skip flaky suite (#170593) --- x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts index 005747c79c7fe..f06666ed1fd88 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/add_integration.cy.ts @@ -104,7 +104,8 @@ describe.skip('ALL - Add Integration', { tags: ['@ess', '@serverless'] }, () => cy.contains(`version: ${oldVersion}`).should('not.exist'); }); }); - describe('Add integration to policy', () => { + // FLAKY: https://github.com/elastic/kibana/issues/170593 + describe.skip('Add integration to policy', () => { const [integrationName, policyName] = generateRandomStringName(2); let policyId: string; beforeEach(() => { From f2fb57f2fadd39b414c5e6105c0dd403ef3d2558 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Tue, 9 Jul 2024 10:24:27 -0500 Subject: [PATCH 02/82] [Search] Homepage header links (#187419) ## Summary - Added console quickstart link to search homepage - Added Endpoints & API keys link to Homepage header ### Screenshots #### ES3 ![image](https://github.com/elastic/kibana/assets/1972968/41a2a9a8-1290-4f2e-b9c4-f8d88f4c5226) ![image](https://github.com/elastic/kibana/assets/1972968/bbdab0b9-e3be-4e1d-be74-fdba02f74082) ![image](https://github.com/elastic/kibana/assets/1972968/7c5c7dd7-1c13-424c-9102-accd5a7314b6) #### Stack ![image](https://github.com/elastic/kibana/assets/1972968/e926b747-8219-431e-870c-3151f74b3c55) ### Testing To test these changes you can enable the feature flag with the Kibana Dev Console using the following command: ``` POST kbn:/internal/kibana/settings/searchHomepage:homepageEnabled {"value": true} ``` You can then disable the feature flag with the following command: ``` DELETE kbn:/internal/kibana/settings/searchHomepage:homepageEnabled ``` ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../public/components/console_link_button.tsx | 45 +++++++++++++++++++ .../components/endpoints_header_action.tsx | 45 +++++++++++++++++++ .../public/components/search_homepage.tsx | 2 +- .../components/search_homepage_body.tsx | 21 ++++----- .../components/search_homepage_header.tsx | 10 ++++- .../public/components/stack_app.tsx | 2 +- x-pack/plugins/search_homepage/tsconfig.json | 1 + .../page_objects/svl_search_homepage.ts | 42 +++++++++++++++++ .../search/config.feature_flags.ts | 4 +- .../functional/test_suites/search/config.ts | 4 ++ .../test_suites/search/search_homepage.ts | 34 ++++++++++++-- 11 files changed, 189 insertions(+), 21 deletions(-) create mode 100644 x-pack/plugins/search_homepage/public/components/console_link_button.tsx create mode 100644 x-pack/plugins/search_homepage/public/components/endpoints_header_action.tsx diff --git a/x-pack/plugins/search_homepage/public/components/console_link_button.tsx b/x-pack/plugins/search_homepage/public/components/console_link_button.tsx new file mode 100644 index 0000000000000..79511788b2f95 --- /dev/null +++ b/x-pack/plugins/search_homepage/public/components/console_link_button.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React, { useCallback } from 'react'; +import { EuiButtonEmpty } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import type { ConsolePluginStart } from '@kbn/console-plugin/public'; + +import { useKibana } from '../hooks/use_kibana'; + +const canOpenConsole = (plugin?: ConsolePluginStart): boolean => { + if (!plugin) return false; + if (!plugin.isEmbeddedConsoleAvailable || !plugin.openEmbeddedConsole) return false; + return plugin.isEmbeddedConsoleAvailable(); +}; + +export const ConsoleLinkButton = () => { + const { + services: { console: consolePlugin }, + } = useKibana(); + const openConsole = useCallback(() => { + if (!canOpenConsole(consolePlugin)) return; + + consolePlugin!.openEmbeddedConsole!(); + }, [consolePlugin]); + if (consolePlugin === undefined || consolePlugin.openEmbeddedConsole === undefined) return null; + + return ( + + + + ); +}; diff --git a/x-pack/plugins/search_homepage/public/components/endpoints_header_action.tsx b/x-pack/plugins/search_homepage/public/components/endpoints_header_action.tsx new file mode 100644 index 0000000000000..0cc3ae6dea48f --- /dev/null +++ b/x-pack/plugins/search_homepage/public/components/endpoints_header_action.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlyout, EuiHeaderLinks } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + KibanaWiredConnectionDetailsProvider, + ConnectionDetailsFlyoutContent, +} from '@kbn/cloud/connection_details'; + +export const EndpointsHeaderAction = () => { + const [open, setOpen] = React.useState(false); + + return ( + <> + + + setOpen(true)} + data-test-subj="searchHomepageEndpointsHeaderActionEndpointsApiKeysButton" + data-telemetry-id="searchHomepageEndpointsHeaderActionEndpointsApiKeysButton" + > + + + + + {open && ( + setOpen(false)} size="s"> + + + + + )} + + ); +}; diff --git a/x-pack/plugins/search_homepage/public/components/search_homepage.tsx b/x-pack/plugins/search_homepage/public/components/search_homepage.tsx index 7af02cbcf3275..76f34caad0a5d 100644 --- a/x-pack/plugins/search_homepage/public/components/search_homepage.tsx +++ b/x-pack/plugins/search_homepage/public/components/search_homepage.tsx @@ -24,7 +24,7 @@ export const SearchHomepagePage = () => { return ( - + {embeddableConsole} diff --git a/x-pack/plugins/search_homepage/public/components/search_homepage_body.tsx b/x-pack/plugins/search_homepage/public/components/search_homepage_body.tsx index 808393594e7d8..f27da23468711 100644 --- a/x-pack/plugins/search_homepage/public/components/search_homepage_body.tsx +++ b/x-pack/plugins/search_homepage/public/components/search_homepage_body.tsx @@ -6,19 +6,16 @@ */ import React from 'react'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { ConsoleLinkButton } from './console_link_button'; export const SearchHomepageBody = () => ( - -
+ + + + + + ); diff --git a/x-pack/plugins/search_homepage/public/components/search_homepage_header.tsx b/x-pack/plugins/search_homepage/public/components/search_homepage_header.tsx index 941655d67cdab..3ea294bb1138c 100644 --- a/x-pack/plugins/search_homepage/public/components/search_homepage_header.tsx +++ b/x-pack/plugins/search_homepage/public/components/search_homepage_header.tsx @@ -8,7 +8,13 @@ import React from 'react'; import { EuiPageTemplate, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -export const SearchHomepageHeader = () => ( +import { EndpointsHeaderAction } from './endpoints_header_action'; + +export interface SearchHomepageHeaderProps { + showEndpointsAPIKeys: boolean; +} + +export const SearchHomepageHeader = ({ showEndpointsAPIKeys }: SearchHomepageHeaderProps) => ( @@ -21,6 +27,6 @@ export const SearchHomepageHeader = () => ( } data-test-subj="search-homepage-header" - rightSideItems={[]} + rightSideItems={[...(showEndpointsAPIKeys ? [] : [])]} /> ); diff --git a/x-pack/plugins/search_homepage/public/components/stack_app.tsx b/x-pack/plugins/search_homepage/public/components/stack_app.tsx index ca18ac7112c09..f570d81e97c3a 100644 --- a/x-pack/plugins/search_homepage/public/components/stack_app.tsx +++ b/x-pack/plugins/search_homepage/public/components/stack_app.tsx @@ -12,7 +12,7 @@ import { SearchHomepageHeader } from './search_homepage_header'; export const App: React.FC = () => { return ( <> - + ); diff --git a/x-pack/plugins/search_homepage/tsconfig.json b/x-pack/plugins/search_homepage/tsconfig.json index 9f084b32f7d3b..91de974fd2914 100644 --- a/x-pack/plugins/search_homepage/tsconfig.json +++ b/x-pack/plugins/search_homepage/tsconfig.json @@ -23,6 +23,7 @@ "@kbn/share-plugin", "@kbn/usage-collection-plugin", "@kbn/config-schema", + "@kbn/cloud", ], "exclude": [ "target/**/*", diff --git a/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts b/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts index eeb1b6de731f9..44bdd417330a3 100644 --- a/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts +++ b/x-pack/test_serverless/functional/page_objects/svl_search_homepage.ts @@ -22,5 +22,47 @@ export function SvlSearchHomePageProvider({ getService }: FtrProviderContext) { async expectHomepageHeader() { await testSubjects.existOrFail('search-homepage-header', { timeout: 2000 }); }, + async expectConsoleLinkExists() { + await testSubjects.existOrFail('searchHomepageEmbeddedConsoleButton'); + }, + async clickConsoleLink() { + await testSubjects.click('searchHomepageEmbeddedConsoleButton'); + }, + async expectEndpointsLinkExists() { + await testSubjects.existOrFail('searchHomepageEndpointsHeaderActionEndpointsApiKeysButton'); + }, + async clickEndpointsLink() { + await testSubjects.click('searchHomepageEndpointsHeaderActionEndpointsApiKeysButton'); + }, + async expectConnectionDetailsFlyoutToBeOpen() { + await testSubjects.existOrFail('connectionDetailsModalTitle'); + }, + async closeConnectionDetailsFlyout() { + await testSubjects.existOrFail('euiFlyoutCloseButton'); + await testSubjects.click('euiFlyoutCloseButton'); + }, + async expectEndpointsTabIsAvailable() { + await testSubjects.existOrFail('connectionDetailsTabBtn-endpoints'); + await testSubjects.click('connectionDetailsTabBtn-endpoints'); + await testSubjects.existOrFail('connectionDetailsEsUrl'); + await testSubjects.existOrFail('connectionDetailsCloudIdSwitch'); + }, + async expectAPIKeyTabIsAvailable() { + await testSubjects.existOrFail('connectionDetailsTabBtn-apiKeys'); + await testSubjects.click('connectionDetailsTabBtn-apiKeys'); + await testSubjects.existOrFail('connectionDetailsApiKeyNameInput'); + await testSubjects.existOrFail('connectionDetailsApiKeySubmitBtn'); + }, + async createApiKeyInFlyout(keyName: string) { + await testSubjects.existOrFail('connectionDetailsApiKeyNameInput'); + await testSubjects.existOrFail('connectionDetailsApiKeySubmitBtn'); + await testSubjects.setValue('connectionDetailsApiKeyNameInput', keyName); + await testSubjects.click('connectionDetailsApiKeySubmitBtn'); + await testSubjects.existOrFail('connectionDetailsApiKeySuccessForm'); + await testSubjects.existOrFail('connectionDetailsApiKeyValueRow'); + expect(await testSubjects.getVisibleText('connectionDetailsApiKeySuccessForm')).contain( + keyName + ); + }, }; } diff --git a/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts b/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts index f05b5975c90cb..c4b29fdfb443d 100644 --- a/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts +++ b/x-pack/test_serverless/functional/test_suites/search/config.feature_flags.ts @@ -19,9 +19,11 @@ export default createTestConfig({ suiteTags: { exclude: ['skipSvlSearch'] }, // add feature flags kbnServerArgs: [ - `--xpack.security.roleManagementEnabled=true`, + `--xpack.cloud.id='ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg=='`, + `--xpack.cloud.serverless.project_id='fakeprojectid'`, `--xpack.cloud.base_url='https://cloud.elastic.co'`, `--xpack.cloud.organization_url='/account/members'`, + `--xpack.security.roleManagementEnabled=true`, ], // load tests in the index file testFiles: [require.resolve('./index.feature_flags.ts')], diff --git a/x-pack/test_serverless/functional/test_suites/search/config.ts b/x-pack/test_serverless/functional/test_suites/search/config.ts index c2171c532bf23..6853e75d987b8 100644 --- a/x-pack/test_serverless/functional/test_suites/search/config.ts +++ b/x-pack/test_serverless/functional/test_suites/search/config.ts @@ -18,4 +18,8 @@ export default createTestConfig({ // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/esproject/config/elasticsearch.yml esServerArgs: [], + kbnServerArgs: [ + `--xpack.cloud.id='ES3_FTR_TESTS:ZmFrZS1kb21haW4uY2xkLmVsc3RjLmNvJGZha2Vwcm9qZWN0aWQuZXMkZmFrZXByb2plY3RpZC5rYg=='`, + `--xpack.cloud.serverless.project_id='fakeprojectid'`, + ], }); diff --git a/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts b/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts index 1f627921d1592..93af4de797cfa 100644 --- a/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts +++ b/x-pack/test_serverless/functional/test_suites/search/search_homepage.ts @@ -36,22 +36,48 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); it('has search homepage with Home sidenav', async () => { - pageObjects.svlSearchHomePage.expectToBeOnHomepage(); - pageObjects.svlSearchHomePage.expectHomepageHeader(); + await pageObjects.svlSearchHomePage.expectToBeOnHomepage(); + await pageObjects.svlSearchHomePage.expectHomepageHeader(); // Navigate to another page await pageObjects.svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'serverlessConnectors', }); - pageObjects.svlSearchHomePage.expectToNotBeOnHomepage(); + await pageObjects.svlSearchHomePage.expectToNotBeOnHomepage(); // Click Home in Side nav await pageObjects.svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'searchHomepage', }); - pageObjects.svlSearchHomePage.expectToBeOnHomepage(); + await pageObjects.svlSearchHomePage.expectToBeOnHomepage(); }); it('has embedded dev console', async () => { await testHasEmbeddedConsole(pageObjects); }); + + it('has console quickstart link on page', async () => { + await pageObjects.svlSearchHomePage.expectConsoleLinkExists(); + await pageObjects.svlCommonNavigation.devConsole.expectEmbeddedConsoleToBeClosed(); + await pageObjects.svlSearchHomePage.clickConsoleLink(); + await pageObjects.svlCommonNavigation.devConsole.expectEmbeddedConsoleToBeOpen(); + await pageObjects.svlCommonNavigation.devConsole.clickEmbeddedConsoleControlBar(); + await pageObjects.svlCommonNavigation.devConsole.expectEmbeddedConsoleToBeClosed(); + }); + + it('has endpoints link and flyout', async () => { + await pageObjects.svlSearchHomePage.expectEndpointsLinkExists(); + await pageObjects.svlSearchHomePage.clickEndpointsLink(); + await pageObjects.svlSearchHomePage.expectConnectionDetailsFlyoutToBeOpen(); + await pageObjects.svlSearchHomePage.expectEndpointsTabIsAvailable(); + await pageObjects.svlSearchHomePage.closeConnectionDetailsFlyout(); + }); + + it('can create an API key', async () => { + await pageObjects.svlSearchHomePage.expectEndpointsLinkExists(); + await pageObjects.svlSearchHomePage.clickEndpointsLink(); + await pageObjects.svlSearchHomePage.expectConnectionDetailsFlyoutToBeOpen(); + await pageObjects.svlSearchHomePage.expectAPIKeyTabIsAvailable(); + await pageObjects.svlSearchHomePage.createApiKeyInFlyout('ftr-test-key'); + await pageObjects.svlSearchHomePage.closeConnectionDetailsFlyout(); + }); }); } From 3812c9028272fbc97148cc24f5f18bc12c045976 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Tue, 9 Jul 2024 16:32:01 +0100 Subject: [PATCH 03/82] skip flaky suite (#187456) --- .../components/connectors/resilient/use_get_severity.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx index 964daacb4a6bf..bf2ba2a4ece3c 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/use_get_severity.test.tsx @@ -19,7 +19,8 @@ jest.mock('./api'); const useKibanaMock = useKibana as jest.Mocked; -describe('useGetSeverity', () => { +// FLAKY: https://github.com/elastic/kibana/issues/187456 +describe.skip('useGetSeverity', () => { const { http } = useKibanaMock().services; let appMockRender: AppMockRenderer; From a3f7c7a8817640f14ba570c8d225704aa998d4ea Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Tue, 9 Jul 2024 17:56:58 +0200 Subject: [PATCH 04/82] Add @kbn/crypto-browser to ui-shared-deps (#187740) ## Summary Fix https://github.com/elastic/kibana/issues/135718 --- packages/kbn-crypto-browser/BUILD.bazel | 32 +++++++++++++++++++ packages/kbn-ui-shared-deps-src/BUILD.bazel | 1 + .../kbn-ui-shared-deps-src/src/definitions.js | 1 + packages/kbn-ui-shared-deps-src/src/entry.js | 1 + 4 files changed, 35 insertions(+) create mode 100644 packages/kbn-crypto-browser/BUILD.bazel diff --git a/packages/kbn-crypto-browser/BUILD.bazel b/packages/kbn-crypto-browser/BUILD.bazel new file mode 100644 index 0000000000000..c959d62ffde68 --- /dev/null +++ b/packages/kbn-crypto-browser/BUILD.bazel @@ -0,0 +1,32 @@ +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") + +SRCS = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +BUNDLER_DEPS = [ + "@npm//tslib", +] + +js_library( + name = "kbn-crypto-browser", + package_name = "@kbn/crypto-browser", + srcs = ["package.json"] + SRCS, + deps = BUNDLER_DEPS, + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-ui-shared-deps-src/BUILD.bazel b/packages/kbn-ui-shared-deps-src/BUILD.bazel index 3d7dd87020047..cd723a8ed6401 100644 --- a/packages/kbn-ui-shared-deps-src/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-src/BUILD.bazel @@ -28,6 +28,7 @@ webpack_cli( "//packages/kbn-monaco", "//packages/kbn-datemath", "//packages/kbn-analytics", + "//packages/kbn-crypto-browser", "//packages/kbn-es-query", "//packages/kbn-search-errors", "//packages/kbn-std", diff --git a/packages/kbn-ui-shared-deps-src/src/definitions.js b/packages/kbn-ui-shared-deps-src/src/definitions.js index b2b38e131fb80..98c152403dcff 100644 --- a/packages/kbn-ui-shared-deps-src/src/definitions.js +++ b/packages/kbn-ui-shared-deps-src/src/definitions.js @@ -88,6 +88,7 @@ const externals = { tslib: '__kbnSharedDeps__.TsLib', uuid: '__kbnSharedDeps__.Uuid', '@kbn/analytics': '__kbnSharedDeps__.KbnAnalytics', + '@kbn/crypto-browser': '__kbnSharedDeps__.KbnCryptoBrowser', '@kbn/es-query': '__kbnSharedDeps__.KbnEsQuery', '@kbn/search-errors': '__kbnSharedDeps__.KbnSearchErrors', '@kbn/std': '__kbnSharedDeps__.KbnStd', diff --git a/packages/kbn-ui-shared-deps-src/src/entry.js b/packages/kbn-ui-shared-deps-src/src/entry.js index 1d0e88ef0efd8..a9d318721814b 100644 --- a/packages/kbn-ui-shared-deps-src/src/entry.js +++ b/packages/kbn-ui-shared-deps-src/src/entry.js @@ -60,6 +60,7 @@ export const Fflate = { unzlibSync, strFromU8 }; export const TsLib = require('tslib'); export const Uuid = require('uuid'); export const KbnAnalytics = require('@kbn/analytics'); +export const KbnCryptoBrowser = require('@kbn/crypto-browser'); export const KbnEsQuery = require('@kbn/es-query'); export const KbnSearchErrors = require('@kbn/search-errors'); export const KbnStd = require('@kbn/std'); From 7c5cf9c76e35925cba7e3bd57cc01d1fffae81a4 Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Tue, 9 Jul 2024 17:59:17 +0200 Subject: [PATCH 05/82] [Infra] Fix date picker with relative date range (#187739) fixes [187735](https://github.com/elastic/kibana/issues/187735) ## Summary This PR fixes a problem with the Anomaly Detection component's date picker when dealing with relative dates https://github.com/elastic/kibana/assets/2767137/2f007a3e-1ee0-44ca-b4ae-8cdb56fbe06c https://github.com/elastic/kibana/assets/2767137/c3b036df-e73c-48d5-a27a-6ed75ffbc76a ### How to test The easiest way is to connect to an oblt cluster and create an ML job - Navigate to `Infrastructure` - Click on `Anomaly Detection` menu at the top of the page and create a ML job for hosts - Follow the same steps from the screen recordings above. --- .../anomalies_table/anomalies_table.tsx | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx b/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx index b38af534df6e7..482d4c7294c5e 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx @@ -221,9 +221,9 @@ export const AnomaliesTable = ({ }: Props) => { const [search, setSearch] = useState(''); const trackMetric = useUiTracker({ app: 'infra_metrics' }); - const [timeRange, setTimeRange] = useState<{ start: number; end: number }>({ - start: datemathToEpochMillis(dateRange.from) || 0, - end: datemathToEpochMillis(dateRange.to, 'up') || 0, + const [timeRange, setTimeRange] = useState<{ start: string; end: string }>({ + start: dateRange.from, + end: dateRange.to, }); const { sorting, setSorting } = useSorting({ field: 'startTime', @@ -256,8 +256,8 @@ export const AnomaliesTable = ({ ({ isInvalid, start: startChange, end: endChange }: OnTimeChangeProps) => { if (!isInvalid) { setTimeRange({ - start: datemathToEpochMillis(startChange)!, - end: datemathToEpochMillis(endChange, 'up')!, + start: startChange, + end: endChange, }); } }, @@ -265,14 +265,17 @@ export const AnomaliesTable = ({ ); const getTimeRange = useCallback(() => { - if (hideDatePicker) { - return { - start: datemathToEpochMillis(dateRange.from) || 0, - end: datemathToEpochMillis(dateRange.to, 'up') || 0, - }; - } else { - return timeRange; - } + const { start, end } = hideDatePicker + ? { + start: dateRange.from, + end: dateRange.to, + } + : timeRange; + + return { + start: datemathToEpochMillis(start) || 0, + end: datemathToEpochMillis(end, 'up') || 0, + }; }, [dateRange.from, dateRange.to, hideDatePicker, timeRange]); const anomalyParams = useMemo(() => { @@ -483,8 +486,8 @@ export const AnomaliesTable = ({ {!hideDatePicker && ( Date: Tue, 9 Jul 2024 11:40:27 -0500 Subject: [PATCH 06/82] [Security solution] Entity previews flyout copy refresh (#187430) ## Summary Copy update per docs team's review [here](https://github.com/elastic/security-docs/issues/5484#issuecomment-2197358502): > Host preview > preview banner: `Preview host details` > link in the footer: `Show full host details` > > User preview > preview banner: `Preview user details` > link in the footer: `Show full user details` ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) --- .../document_details/right/components/host_entity_overview.tsx | 2 +- .../document_details/right/components/user_entity_overview.tsx | 2 +- .../public/flyout/entity_details/host_preview/footer.tsx | 2 +- .../public/flyout/entity_details/user_preview/footer.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx index e48b5f8fd4f9d..39772a9b61c36 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx @@ -67,7 +67,7 @@ export interface HostEntityOverviewProps { export const HOST_PREVIEW_BANNER = { title: i18n.translate('xpack.securitySolution.flyout.right.host.hostPreviewTitle', { - defaultMessage: 'Preview host', + defaultMessage: 'Preview host details', }), backgroundColor: 'warning', textColor: 'warning', diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx index 47938e5212e7c..300c31a7f6ba1 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx @@ -68,7 +68,7 @@ export interface UserEntityOverviewProps { export const USER_PREVIEW_BANNER = { title: i18n.translate('xpack.securitySolution.flyout.right.user.userPreviewTitle', { - defaultMessage: 'Preview user', + defaultMessage: 'Preview user details', }), backgroundColor: 'warning', textColor: 'warning', diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/host_preview/footer.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/host_preview/footer.tsx index 4632c20e517af..e550da28b532a 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/host_preview/footer.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/host_preview/footer.tsx @@ -47,7 +47,7 @@ export const HostPreviewPanelFooter = ({ {i18n.translate('xpack.securitySolution.flyout.host.preview.viewDetailsLabel', { - defaultMessage: 'Open host details flyout', + defaultMessage: 'Show full host details', })} diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/user_preview/footer.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/user_preview/footer.tsx index 5fb1b73e1683b..7f55feb7a347c 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/user_preview/footer.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/user_preview/footer.tsx @@ -47,7 +47,7 @@ export const UserPreviewPanelFooter = ({ {i18n.translate('xpack.securitySolution.flyout.user.preview.viewDetailsLabel', { - defaultMessage: 'Open user details flyout', + defaultMessage: 'Show full user details', })} From ee62412c7b886065b677d14482c8e0be63fbde5a Mon Sep 17 00:00:00 2001 From: Achyut Jhunjhunwala Date: Tue, 9 Jul 2024 18:56:38 +0200 Subject: [PATCH 07/82] [Dataset Quality] Fix flaky integration tests [WIP] (#187851) ## Summary This PR closes https://github.com/elastic/kibana/issues/187589 closes https://github.com/elastic/kibana/issues/187566 ## Results - Tested locally against MKI and the tests are now passing :heavy_check_mark: - Tested locally for Stateful :heavy_check_mark: - Tested locally for Serverless :heavy_check_mark: --- .../dataset_quality/dataset_quality_flyout.ts | 17 +++---- .../page_objects/dataset_quality.ts | 46 +++---------------- .../dataset_quality/dataset_quality_flyout.ts | 19 ++++---- 3 files changed, 25 insertions(+), 57 deletions(-) diff --git a/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts b/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts index 6b96291734bcf..52ccfad201a53 100644 --- a/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts +++ b/x-pack/test/functional/apps/dataset_quality/dataset_quality_flyout.ts @@ -50,8 +50,7 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid const degradedDatasetName = datasetNames[2]; - // Failing: See https://github.com/elastic/kibana/issues/187589 - describe.skip('Flyout', () => { + describe('Flyout', () => { before(async () => { // Install Apache Integration and ingest logs for it await PageObjects.observabilityLogsExplorer.installPackage(apachePkg); @@ -150,17 +149,19 @@ export default function ({ getService, getPageObjects }: DatasetQualityFtrProvid it('should shows the integration section for integrations', async () => { await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - const integrationNameElements = await PageObjects.datasetQuality.getFlyoutElementsByText( - '[data-test-subj=datasetQualityFlyoutFieldValue]', - apacheIntegrationId - ); - await testSubjects.existOrFail( PageObjects.datasetQuality.testSubjectSelectors .datasetQualityFlyoutFieldsListIntegrationDetails ); - expect(integrationNameElements.length).to.eql(1); + await retry.tryForTime(5000, async () => { + const integrationNameExists = await PageObjects.datasetQuality.doesTextExist( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityFlyoutFieldsListIntegrationDetails, + apacheIntegrationId + ); + expect(integrationNameExists).to.be(true); + }); await PageObjects.datasetQuality.closeFlyout(); }); diff --git a/x-pack/test/functional/page_objects/dataset_quality.ts b/x-pack/test/functional/page_objects/dataset_quality.ts index 7cb633a8113b6..7f918ce3ba76f 100644 --- a/x-pack/test/functional/page_objects/dataset_quality.ts +++ b/x-pack/test/functional/page_objects/dataset_quality.ts @@ -347,12 +347,14 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv return refreshButton.click(); }, - async getFlyoutElementsByText(selector: string, text: string) { - const flyoutContainer: WebElementWrapper = await testSubjects.find( - testSubjectSelectors.datasetQualityFlyout - ); + async doesTextExist(selector: string, text: string) { + const textValues = await testSubjects.getVisibleTextAll(selector); + if (textValues && textValues.length > 0) { + const values = textValues[0].split('\n'); + return values.includes(text); + } - return getAllByText(flyoutContainer, selector, text); + return false; }, getFlyoutLogsExplorerButton() { @@ -373,15 +375,6 @@ export function DatasetQualityPageObject({ getPageObjects, getService }: FtrProv ); }, - async doestTextExistInFlyout(text: string, elementSelector: string) { - const flyoutContainer: WebElementWrapper = await testSubjects.find( - testSubjectSelectors.datasetQualityFlyoutBody - ); - - const elements = await getAllByText(flyoutContainer, elementSelector, text); - return elements.length > 0; - }, - // `excludeKeys` needed to circumvent `_stats` not available in Serverless https://github.com/elastic/kibana/issues/178954 // TODO: Remove `excludeKeys` when `_stats` is available in Serverless async parseFlyoutKpis(excludeKeys: string[] = []): Promise { @@ -554,28 +547,3 @@ async function getDatasetTableHeaderTexts(tableWrapper: WebElementWrapper) { headerElementWrappers.map((headerElementWrapper) => headerElementWrapper.getVisibleText()) ); } - -/** - * Get all elements matching the given selector and text - * @example - * const container = await testSubjects.find('myContainer'); - * const elements = await getAllByText(container, 'button', 'Click me'); - * - * @param container { WebElementWrapper } The container to search within - * @param selector { string } The selector to search for (or filter elements by) - * @param text { string } The text to search for within the filtered elements - */ -export async function getAllByText(container: WebElementWrapper, selector: string, text: string) { - const elements = await container.findAllByCssSelector(selector); - const matchingElements: WebElementWrapper[] = []; - - for (let i = 0; i < elements.length; i++) { - const element = elements[i]; - const elementText = await element.getVisibleText(); - if (elementText === text) { - matchingElements.push(element); - } - } - - return matchingElements; -} diff --git a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts index 7de972a7b2c88..2751abf569746 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/dataset_quality/dataset_quality_flyout.ts @@ -54,10 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const degradedDatasetName = datasetNames[2]; - // Failing: See https://github.com/elastic/kibana/issues/187566 - describe.skip('Flyout', function () { - // see details: https://github.com/elastic/kibana/issues/187624 - this.tags(['failsOnMKI']); + describe('Flyout', function () { before(async () => { // Install Apache Integration and ingest logs for it await PageObjects.observabilityLogsExplorer.installPackage(apachePkg); @@ -158,17 +155,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should shows the integration section for integrations', async () => { await PageObjects.datasetQuality.openDatasetFlyout(apacheAccessDatasetHumanName); - const integrationNameElements = await PageObjects.datasetQuality.getFlyoutElementsByText( - '[data-test-subj=datasetQualityFlyoutFieldValue]', - apacheIntegrationId - ); - await testSubjects.existOrFail( PageObjects.datasetQuality.testSubjectSelectors .datasetQualityFlyoutFieldsListIntegrationDetails ); - expect(integrationNameElements.length).to.eql(1); + await retry.tryForTime(5000, async () => { + const integrationNameExists = await PageObjects.datasetQuality.doesTextExist( + PageObjects.datasetQuality.testSubjectSelectors + .datasetQualityFlyoutFieldsListIntegrationDetails, + apacheIntegrationId + ); + expect(integrationNameExists).to.be(true); + }); await PageObjects.datasetQuality.closeFlyout(); }); From 8f95f955e6263ded0abcc62cf3ca53bb018cbe4a Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Tue, 9 Jul 2024 11:00:36 -0600 Subject: [PATCH 08/82] [ML] Functional tests: unskip anomaly detection results forecast flaky test (#187795) ## Summary Unskip skipped test due to flakiness: https://github.com/elastic/kibana/issues/164381 Initial investigation appears to indicate something in the testing environment - likely the chrome version. That has been updated since so letting the CI run to confirm. Flaky test runner build: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6494 ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../apps/ml/anomaly_detection_result_views/forecasts.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts index bdd3052f54c0a..3a60e8fca97c2 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection_result_views/forecasts.ts @@ -39,8 +39,7 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); - // Failing: See https://github.com/elastic/kibana/issues/164381 - describe.skip('forecasts', function () { + describe('forecasts', function () { this.tags(['ml']); describe('with single metric job', function () { From 5bc0c7865e11b9b699d282c488286779b344f0e6 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 9 Jul 2024 19:18:50 +0200 Subject: [PATCH 09/82] [ES|QL] Update grammars: change quoting from backtick to quote for index names (#187212) Related to https://github.com/elastic/elasticsearch/pull/108395. This PR updates the ES|QL grammars (lexer and parser) to match the latest version in Elasticsearch. The PR adds support for index names wrapped by `""`, and triple quotes `"""index-name"""` to the ES|QL text editor and removes backticks. Screenshot 2024-07-09 at 09 25 22 Screenshot 2024-07-09 at 09 24 54 Screenshot 2024-07-09 at 09 25 03 --------- Co-authored-by: Quynh Nguyen Co-authored-by: Elastic Machine --- .../src/__tests__/ast_parser.from.test.ts | 30 + packages/kbn-esql-ast/src/antlr/esql_lexer.g4 | 41 +- .../kbn-esql-ast/src/antlr/esql_lexer.interp | 22 +- .../kbn-esql-ast/src/antlr/esql_lexer.tokens | 2 +- packages/kbn-esql-ast/src/antlr/esql_lexer.ts | 978 +++++----- .../kbn-esql-ast/src/antlr/esql_parser.g4 | 22 +- .../kbn-esql-ast/src/antlr/esql_parser.interp | 8 +- .../kbn-esql-ast/src/antlr/esql_parser.tokens | 2 +- .../kbn-esql-ast/src/antlr/esql_parser.ts | 1719 +++++++++-------- .../src/antlr/esql_parser_listener.ts | 32 +- packages/kbn-esql-ast/src/ast_factory.ts | 4 +- packages/kbn-esql-ast/src/ast_helpers.ts | 16 +- packages/kbn-esql-ast/src/ast_walker.ts | 21 +- .../src/utils/query_parsing_helpers.test.ts | 6 + .../test_suites/validation.command.from.ts | 13 +- .../test_suites/validation.command.metrics.ts | 11 +- .../esql_validation_meta_tests.json | 22 +- .../src/validation/validation.test.ts | 3 +- 18 files changed, 1603 insertions(+), 1349 deletions(-) diff --git a/packages/kbn-esql-ast/src/__tests__/ast_parser.from.test.ts b/packages/kbn-esql-ast/src/__tests__/ast_parser.from.test.ts index 00559da4fff9c..a88b51f63ea16 100644 --- a/packages/kbn-esql-ast/src/__tests__/ast_parser.from.test.ts +++ b/packages/kbn-esql-ast/src/__tests__/ast_parser.from.test.ts @@ -60,6 +60,36 @@ describe('FROM', () => { ]); }); + it('can parse FROM query with single quote or triple quote', () => { + const text = '\tFROM "foo%" \t\t, """bar{{00-00}}""", \n baz'; + const { ast, errors } = parse(text); + + expect(errors.length).toBe(0); + expect(ast).toMatchObject([ + { + type: 'command', + name: 'from', + args: [ + { + type: 'source', + name: 'foo%', + sourceType: 'index', + }, + { + type: 'source', + name: 'bar{{00-00}}', + sourceType: 'index', + }, + { + type: 'source', + name: 'baz', + sourceType: 'index', + }, + ], + }, + ]); + }); + it('can parse FROM query with a single metadata column', () => { const text = 'from foo METADATA bar'; const { ast, errors } = parse(text); diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 index d7a4b88e6d5c5..12a47a195dfda 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.g4 @@ -44,13 +44,15 @@ WS : [ \r\n\t]+ -> channel(HIDDEN) ; -fragment INDEX_UNQUOTED_IDENTIFIER_PART - : ~[=`|,[\]/ \t\r\n] - | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment +// in 8.14 ` were not allowed +// this has been relaxed in 8.15 since " is used for quoting +fragment UNQUOTED_SOURCE_PART + : ~[:"=|,[\]/ \t\r\n] + | '/' ~[*/] // allow single / but not followed by another / or * which would start a comment -- used in index pattern date spec ; -INDEX_UNQUOTED_IDENTIFIER - : INDEX_UNQUOTED_IDENTIFIER_PART+ +UNQUOTED_SOURCE + : UNQUOTED_SOURCE_PART+ ; // @@ -212,15 +214,13 @@ mode FROM_MODE; FROM_PIPE : PIPE -> type(PIPE), popMode; FROM_OPENING_BRACKET : OPENING_BRACKET -> type(OPENING_BRACKET); FROM_CLOSING_BRACKET : CLOSING_BRACKET -> type(CLOSING_BRACKET); +FROM_COLON : COLON -> type(COLON); FROM_COMMA : COMMA -> type(COMMA); FROM_ASSIGN : ASSIGN -> type(ASSIGN); -FROM_QUOTED_STRING : QUOTED_STRING -> type(QUOTED_STRING); - METADATA : 'metadata'; -FROM_INDEX_UNQUOTED_IDENTIFIER - : INDEX_UNQUOTED_IDENTIFIER -> type(INDEX_UNQUOTED_IDENTIFIER) - ; +FROM_UNQUOTED_SOURCE : UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE); +FROM_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING); FROM_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN) @@ -311,10 +311,6 @@ ENRICH_POLICY_NAME : (ENRICH_POLICY_NAME_BODY+ COLON)? ENRICH_POLICY_NAME_BODY+ ; -ENRICH_QUOTED_IDENTIFIER - : QUOTED_IDENTIFIER -> type(QUOTED_IDENTIFIER) - ; - ENRICH_MODE_UNQUOTED_VALUE : ENRICH_POLICY_NAME -> type(ENRICH_POLICY_NAME) ; @@ -331,7 +327,7 @@ ENRICH_WS : WS -> channel(HIDDEN) ; -// submode for Enrich to allow different lexing between policy identifier (loose) and field identifiers +// submode for Enrich to allow different lexing between policy source (loose) and field identifiers mode ENRICH_FIELD_MODE; ENRICH_FIELD_PIPE : PIPE -> type(PIPE), popMode, popMode; ENRICH_FIELD_ASSIGN : ASSIGN -> type(ASSIGN); @@ -363,13 +359,13 @@ ENRICH_FIELD_WS // LOOKUP ON key mode LOOKUP_MODE; LOOKUP_PIPE : PIPE -> type(PIPE), popMode; +LOOKUP_COLON : COLON -> type(COLON); LOOKUP_COMMA : COMMA -> type(COMMA); LOOKUP_DOT: DOT -> type(DOT); LOOKUP_ON : ON -> type(ON), pushMode(LOOKUP_FIELD_MODE); -LOOKUP_INDEX_UNQUOTED_IDENTIFIER - : INDEX_UNQUOTED_IDENTIFIER -> type(INDEX_UNQUOTED_IDENTIFIER) - ; +LOOKUP_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE); +LOOKUP_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING); LOOKUP_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN) @@ -496,9 +492,8 @@ SETTING_WS mode METRICS_MODE; METRICS_PIPE : PIPE -> type(PIPE), popMode; -METRICS_INDEX_UNQUOTED_IDENTIFIER - : INDEX_UNQUOTED_IDENTIFIER -> type(INDEX_UNQUOTED_IDENTIFIER), popMode, pushMode(CLOSING_METRICS_MODE) - ; +METRICS_UNQUOTED_SOURCE: UNQUOTED_SOURCE -> type(UNQUOTED_SOURCE), popMode, pushMode(CLOSING_METRICS_MODE); +METRICS_QUOTED_SOURCE : QUOTED_STRING -> type(QUOTED_STRING), popMode, pushMode(CLOSING_METRICS_MODE); METRICS_LINE_COMMENT : LINE_COMMENT -> channel(HIDDEN) @@ -515,6 +510,10 @@ METRICS_WS // TODO: remove this workaround mode - see https://github.com/elastic/elasticsearch/issues/108528 mode CLOSING_METRICS_MODE; +CLOSING_METRICS_COLON + : COLON -> type(COLON), popMode, pushMode(METRICS_MODE) + ; + CLOSING_METRICS_COMMA : COMMA -> type(COMMA), popMode, pushMode(METRICS_MODE) ; diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp index 911e1371fd129..f0826dc49df6e 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.interp @@ -151,7 +151,7 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS -INDEX_UNQUOTED_IDENTIFIER +UNQUOTED_SOURCE EXPLAIN_WS EXPLAIN_LINE_COMMENT EXPLAIN_MULTILINE_COMMENT @@ -277,8 +277,8 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS -INDEX_UNQUOTED_IDENTIFIER_PART -INDEX_UNQUOTED_IDENTIFIER +UNQUOTED_SOURCE_PART +UNQUOTED_SOURCE EXPLAIN_OPENING_BRACKET EXPLAIN_PIPE EXPLAIN_WS @@ -345,11 +345,12 @@ EXPR_WS FROM_PIPE FROM_OPENING_BRACKET FROM_CLOSING_BRACKET +FROM_COLON FROM_COMMA FROM_ASSIGN -FROM_QUOTED_STRING METADATA -FROM_INDEX_UNQUOTED_IDENTIFIER +FROM_UNQUOTED_SOURCE +FROM_QUOTED_SOURCE FROM_LINE_COMMENT FROM_MULTILINE_COMMENT FROM_WS @@ -377,7 +378,6 @@ ON WITH ENRICH_POLICY_NAME_BODY ENRICH_POLICY_NAME -ENRICH_QUOTED_IDENTIFIER ENRICH_MODE_UNQUOTED_VALUE ENRICH_LINE_COMMENT ENRICH_MULTILINE_COMMENT @@ -393,10 +393,12 @@ ENRICH_FIELD_LINE_COMMENT ENRICH_FIELD_MULTILINE_COMMENT ENRICH_FIELD_WS LOOKUP_PIPE +LOOKUP_COLON LOOKUP_COMMA LOOKUP_DOT LOOKUP_ON -LOOKUP_INDEX_UNQUOTED_IDENTIFIER +LOOKUP_UNQUOTED_SOURCE +LOOKUP_QUOTED_SOURCE LOOKUP_LINE_COMMENT LOOKUP_MULTILINE_COMMENT LOOKUP_WS @@ -431,10 +433,12 @@ SETTING_LINE_COMMENT SETTTING_MULTILINE_COMMENT SETTING_WS METRICS_PIPE -METRICS_INDEX_UNQUOTED_IDENTIFIER +METRICS_UNQUOTED_SOURCE +METRICS_QUOTED_SOURCE METRICS_LINE_COMMENT METRICS_MULTILINE_COMMENT METRICS_WS +CLOSING_METRICS_COLON CLOSING_METRICS_COMMA CLOSING_METRICS_LINE_COMMENT CLOSING_METRICS_MULTILINE_COMMENT @@ -467,4 +471,4 @@ METRICS_MODE CLOSING_METRICS_MODE atn: -[4, 0, 124, 1422, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 567, 8, 20, 11, 20, 12, 20, 568, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 577, 8, 21, 10, 21, 12, 21, 580, 9, 21, 1, 21, 3, 21, 583, 8, 21, 1, 21, 3, 21, 586, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 595, 8, 22, 10, 22, 12, 22, 598, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 4, 23, 606, 8, 23, 11, 23, 12, 23, 607, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 3, 24, 615, 8, 24, 1, 25, 4, 25, 618, 8, 25, 11, 25, 12, 25, 619, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 3, 36, 659, 8, 36, 1, 36, 4, 36, 662, 8, 36, 11, 36, 12, 36, 663, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 673, 8, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 680, 8, 41, 1, 42, 1, 42, 1, 42, 5, 42, 685, 8, 42, 10, 42, 12, 42, 688, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 696, 8, 42, 10, 42, 12, 42, 699, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 706, 8, 42, 1, 42, 3, 42, 709, 8, 42, 3, 42, 711, 8, 42, 1, 43, 4, 43, 714, 8, 43, 11, 43, 12, 43, 715, 1, 44, 4, 44, 719, 8, 44, 11, 44, 12, 44, 720, 1, 44, 1, 44, 5, 44, 725, 8, 44, 10, 44, 12, 44, 728, 9, 44, 1, 44, 1, 44, 4, 44, 732, 8, 44, 11, 44, 12, 44, 733, 1, 44, 4, 44, 737, 8, 44, 11, 44, 12, 44, 738, 1, 44, 1, 44, 5, 44, 743, 8, 44, 10, 44, 12, 44, 746, 9, 44, 3, 44, 748, 8, 44, 1, 44, 1, 44, 1, 44, 1, 44, 4, 44, 754, 8, 44, 11, 44, 12, 44, 755, 1, 44, 1, 44, 3, 44, 760, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 5, 80, 882, 8, 80, 10, 80, 12, 80, 885, 9, 80, 1, 80, 1, 80, 4, 80, 889, 8, 80, 11, 80, 12, 80, 890, 3, 80, 893, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 5, 83, 907, 8, 83, 10, 83, 12, 83, 910, 9, 83, 1, 83, 1, 83, 3, 83, 914, 8, 83, 1, 83, 4, 83, 917, 8, 83, 11, 83, 12, 83, 918, 3, 83, 921, 8, 83, 1, 84, 1, 84, 4, 84, 925, 8, 84, 11, 84, 12, 84, 926, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1012, 8, 103, 1, 104, 1, 104, 3, 104, 1016, 8, 104, 1, 104, 5, 104, 1019, 8, 104, 10, 104, 12, 104, 1022, 9, 104, 1, 104, 1, 104, 3, 104, 1026, 8, 104, 1, 104, 4, 104, 1029, 8, 104, 11, 104, 12, 104, 1030, 3, 104, 1033, 8, 104, 1, 105, 1, 105, 4, 105, 1037, 8, 105, 11, 105, 12, 105, 1038, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 4, 123, 1114, 8, 123, 11, 123, 12, 123, 1115, 1, 123, 1, 123, 3, 123, 1120, 8, 123, 1, 123, 4, 123, 1123, 8, 123, 11, 123, 12, 123, 1124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 4, 173, 1343, 8, 173, 11, 173, 12, 173, 1344, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 2, 596, 697, 0, 190, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 0, 66, 25, 68, 0, 70, 0, 72, 26, 74, 27, 76, 28, 78, 29, 80, 0, 82, 0, 84, 0, 86, 0, 88, 0, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 30, 102, 31, 104, 32, 106, 33, 108, 34, 110, 35, 112, 36, 114, 37, 116, 38, 118, 39, 120, 40, 122, 41, 124, 42, 126, 43, 128, 44, 130, 45, 132, 46, 134, 47, 136, 48, 138, 49, 140, 50, 142, 51, 144, 52, 146, 53, 148, 54, 150, 55, 152, 56, 154, 57, 156, 58, 158, 59, 160, 60, 162, 61, 164, 62, 166, 63, 168, 64, 170, 65, 172, 66, 174, 67, 176, 68, 178, 69, 180, 70, 182, 71, 184, 0, 186, 72, 188, 73, 190, 74, 192, 75, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 76, 208, 0, 210, 77, 212, 78, 214, 79, 216, 0, 218, 0, 220, 0, 222, 0, 224, 0, 226, 80, 228, 81, 230, 82, 232, 83, 234, 0, 236, 0, 238, 0, 240, 0, 242, 84, 244, 0, 246, 85, 248, 86, 250, 87, 252, 0, 254, 0, 256, 88, 258, 89, 260, 0, 262, 90, 264, 0, 266, 0, 268, 91, 270, 92, 272, 93, 274, 0, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 94, 290, 95, 292, 96, 294, 0, 296, 0, 298, 0, 300, 0, 302, 0, 304, 97, 306, 98, 308, 99, 310, 0, 312, 0, 314, 0, 316, 0, 318, 100, 320, 101, 322, 102, 324, 0, 326, 0, 328, 0, 330, 0, 332, 103, 334, 104, 336, 105, 338, 0, 340, 106, 342, 107, 344, 108, 346, 109, 348, 0, 350, 110, 352, 111, 354, 112, 356, 113, 358, 0, 360, 114, 362, 115, 364, 116, 366, 117, 368, 118, 370, 0, 372, 0, 374, 119, 376, 120, 378, 121, 380, 0, 382, 122, 384, 123, 386, 124, 388, 0, 390, 0, 392, 0, 394, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 85, 85, 117, 117, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 10, 0, 9, 10, 13, 13, 32, 32, 44, 44, 47, 47, 61, 61, 91, 91, 93, 93, 96, 96, 124, 124, 2, 0, 42, 42, 47, 47, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1448, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 1, 68, 1, 0, 0, 0, 1, 70, 1, 0, 0, 0, 1, 72, 1, 0, 0, 0, 1, 74, 1, 0, 0, 0, 1, 76, 1, 0, 0, 0, 2, 78, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 4, 216, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 4, 220, 1, 0, 0, 0, 4, 226, 1, 0, 0, 0, 4, 228, 1, 0, 0, 0, 4, 230, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 5, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 6, 252, 1, 0, 0, 0, 6, 254, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 262, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 266, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 7, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 8, 294, 1, 0, 0, 0, 8, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 9, 310, 1, 0, 0, 0, 9, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 9, 322, 1, 0, 0, 0, 10, 324, 1, 0, 0, 0, 10, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 10, 332, 1, 0, 0, 0, 10, 334, 1, 0, 0, 0, 10, 336, 1, 0, 0, 0, 11, 338, 1, 0, 0, 0, 11, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 11, 346, 1, 0, 0, 0, 12, 348, 1, 0, 0, 0, 12, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 13, 358, 1, 0, 0, 0, 13, 360, 1, 0, 0, 0, 13, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 14, 370, 1, 0, 0, 0, 14, 372, 1, 0, 0, 0, 14, 374, 1, 0, 0, 0, 14, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 15, 380, 1, 0, 0, 0, 15, 382, 1, 0, 0, 0, 15, 384, 1, 0, 0, 0, 15, 386, 1, 0, 0, 0, 15, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 16, 396, 1, 0, 0, 0, 18, 406, 1, 0, 0, 0, 20, 413, 1, 0, 0, 0, 22, 422, 1, 0, 0, 0, 24, 429, 1, 0, 0, 0, 26, 439, 1, 0, 0, 0, 28, 446, 1, 0, 0, 0, 30, 453, 1, 0, 0, 0, 32, 467, 1, 0, 0, 0, 34, 474, 1, 0, 0, 0, 36, 482, 1, 0, 0, 0, 38, 491, 1, 0, 0, 0, 40, 498, 1, 0, 0, 0, 42, 508, 1, 0, 0, 0, 44, 520, 1, 0, 0, 0, 46, 529, 1, 0, 0, 0, 48, 535, 1, 0, 0, 0, 50, 542, 1, 0, 0, 0, 52, 549, 1, 0, 0, 0, 54, 557, 1, 0, 0, 0, 56, 566, 1, 0, 0, 0, 58, 572, 1, 0, 0, 0, 60, 589, 1, 0, 0, 0, 62, 605, 1, 0, 0, 0, 64, 614, 1, 0, 0, 0, 66, 617, 1, 0, 0, 0, 68, 621, 1, 0, 0, 0, 70, 626, 1, 0, 0, 0, 72, 631, 1, 0, 0, 0, 74, 635, 1, 0, 0, 0, 76, 639, 1, 0, 0, 0, 78, 643, 1, 0, 0, 0, 80, 647, 1, 0, 0, 0, 82, 649, 1, 0, 0, 0, 84, 651, 1, 0, 0, 0, 86, 654, 1, 0, 0, 0, 88, 656, 1, 0, 0, 0, 90, 665, 1, 0, 0, 0, 92, 667, 1, 0, 0, 0, 94, 672, 1, 0, 0, 0, 96, 674, 1, 0, 0, 0, 98, 679, 1, 0, 0, 0, 100, 710, 1, 0, 0, 0, 102, 713, 1, 0, 0, 0, 104, 759, 1, 0, 0, 0, 106, 761, 1, 0, 0, 0, 108, 764, 1, 0, 0, 0, 110, 768, 1, 0, 0, 0, 112, 772, 1, 0, 0, 0, 114, 774, 1, 0, 0, 0, 116, 777, 1, 0, 0, 0, 118, 779, 1, 0, 0, 0, 120, 784, 1, 0, 0, 0, 122, 786, 1, 0, 0, 0, 124, 792, 1, 0, 0, 0, 126, 798, 1, 0, 0, 0, 128, 803, 1, 0, 0, 0, 130, 805, 1, 0, 0, 0, 132, 808, 1, 0, 0, 0, 134, 811, 1, 0, 0, 0, 136, 816, 1, 0, 0, 0, 138, 820, 1, 0, 0, 0, 140, 825, 1, 0, 0, 0, 142, 831, 1, 0, 0, 0, 144, 834, 1, 0, 0, 0, 146, 836, 1, 0, 0, 0, 148, 842, 1, 0, 0, 0, 150, 844, 1, 0, 0, 0, 152, 849, 1, 0, 0, 0, 154, 852, 1, 0, 0, 0, 156, 855, 1, 0, 0, 0, 158, 858, 1, 0, 0, 0, 160, 860, 1, 0, 0, 0, 162, 863, 1, 0, 0, 0, 164, 865, 1, 0, 0, 0, 166, 868, 1, 0, 0, 0, 168, 870, 1, 0, 0, 0, 170, 872, 1, 0, 0, 0, 172, 874, 1, 0, 0, 0, 174, 876, 1, 0, 0, 0, 176, 892, 1, 0, 0, 0, 178, 894, 1, 0, 0, 0, 180, 899, 1, 0, 0, 0, 182, 920, 1, 0, 0, 0, 184, 922, 1, 0, 0, 0, 186, 930, 1, 0, 0, 0, 188, 932, 1, 0, 0, 0, 190, 936, 1, 0, 0, 0, 192, 940, 1, 0, 0, 0, 194, 944, 1, 0, 0, 0, 196, 949, 1, 0, 0, 0, 198, 953, 1, 0, 0, 0, 200, 957, 1, 0, 0, 0, 202, 961, 1, 0, 0, 0, 204, 965, 1, 0, 0, 0, 206, 969, 1, 0, 0, 0, 208, 978, 1, 0, 0, 0, 210, 982, 1, 0, 0, 0, 212, 986, 1, 0, 0, 0, 214, 990, 1, 0, 0, 0, 216, 994, 1, 0, 0, 0, 218, 999, 1, 0, 0, 0, 220, 1003, 1, 0, 0, 0, 222, 1011, 1, 0, 0, 0, 224, 1032, 1, 0, 0, 0, 226, 1036, 1, 0, 0, 0, 228, 1040, 1, 0, 0, 0, 230, 1044, 1, 0, 0, 0, 232, 1048, 1, 0, 0, 0, 234, 1052, 1, 0, 0, 0, 236, 1057, 1, 0, 0, 0, 238, 1061, 1, 0, 0, 0, 240, 1065, 1, 0, 0, 0, 242, 1069, 1, 0, 0, 0, 244, 1072, 1, 0, 0, 0, 246, 1076, 1, 0, 0, 0, 248, 1080, 1, 0, 0, 0, 250, 1084, 1, 0, 0, 0, 252, 1088, 1, 0, 0, 0, 254, 1093, 1, 0, 0, 0, 256, 1098, 1, 0, 0, 0, 258, 1103, 1, 0, 0, 0, 260, 1110, 1, 0, 0, 0, 262, 1119, 1, 0, 0, 0, 264, 1126, 1, 0, 0, 0, 266, 1130, 1, 0, 0, 0, 268, 1134, 1, 0, 0, 0, 270, 1138, 1, 0, 0, 0, 272, 1142, 1, 0, 0, 0, 274, 1146, 1, 0, 0, 0, 276, 1152, 1, 0, 0, 0, 278, 1156, 1, 0, 0, 0, 280, 1160, 1, 0, 0, 0, 282, 1164, 1, 0, 0, 0, 284, 1168, 1, 0, 0, 0, 286, 1172, 1, 0, 0, 0, 288, 1176, 1, 0, 0, 0, 290, 1180, 1, 0, 0, 0, 292, 1184, 1, 0, 0, 0, 294, 1188, 1, 0, 0, 0, 296, 1193, 1, 0, 0, 0, 298, 1197, 1, 0, 0, 0, 300, 1201, 1, 0, 0, 0, 302, 1206, 1, 0, 0, 0, 304, 1210, 1, 0, 0, 0, 306, 1214, 1, 0, 0, 0, 308, 1218, 1, 0, 0, 0, 310, 1222, 1, 0, 0, 0, 312, 1228, 1, 0, 0, 0, 314, 1232, 1, 0, 0, 0, 316, 1236, 1, 0, 0, 0, 318, 1240, 1, 0, 0, 0, 320, 1244, 1, 0, 0, 0, 322, 1248, 1, 0, 0, 0, 324, 1252, 1, 0, 0, 0, 326, 1257, 1, 0, 0, 0, 328, 1261, 1, 0, 0, 0, 330, 1265, 1, 0, 0, 0, 332, 1269, 1, 0, 0, 0, 334, 1273, 1, 0, 0, 0, 336, 1277, 1, 0, 0, 0, 338, 1281, 1, 0, 0, 0, 340, 1286, 1, 0, 0, 0, 342, 1291, 1, 0, 0, 0, 344, 1295, 1, 0, 0, 0, 346, 1299, 1, 0, 0, 0, 348, 1303, 1, 0, 0, 0, 350, 1308, 1, 0, 0, 0, 352, 1318, 1, 0, 0, 0, 354, 1322, 1, 0, 0, 0, 356, 1326, 1, 0, 0, 0, 358, 1330, 1, 0, 0, 0, 360, 1335, 1, 0, 0, 0, 362, 1342, 1, 0, 0, 0, 364, 1346, 1, 0, 0, 0, 366, 1350, 1, 0, 0, 0, 368, 1354, 1, 0, 0, 0, 370, 1358, 1, 0, 0, 0, 372, 1363, 1, 0, 0, 0, 374, 1369, 1, 0, 0, 0, 376, 1373, 1, 0, 0, 0, 378, 1377, 1, 0, 0, 0, 380, 1381, 1, 0, 0, 0, 382, 1387, 1, 0, 0, 0, 384, 1391, 1, 0, 0, 0, 386, 1395, 1, 0, 0, 0, 388, 1399, 1, 0, 0, 0, 390, 1405, 1, 0, 0, 0, 392, 1411, 1, 0, 0, 0, 394, 1417, 1, 0, 0, 0, 396, 397, 7, 0, 0, 0, 397, 398, 7, 1, 0, 0, 398, 399, 7, 2, 0, 0, 399, 400, 7, 2, 0, 0, 400, 401, 7, 3, 0, 0, 401, 402, 7, 4, 0, 0, 402, 403, 7, 5, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 6, 0, 0, 0, 405, 17, 1, 0, 0, 0, 406, 407, 7, 0, 0, 0, 407, 408, 7, 6, 0, 0, 408, 409, 7, 7, 0, 0, 409, 410, 7, 8, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 6, 1, 1, 0, 412, 19, 1, 0, 0, 0, 413, 414, 7, 3, 0, 0, 414, 415, 7, 9, 0, 0, 415, 416, 7, 6, 0, 0, 416, 417, 7, 1, 0, 0, 417, 418, 7, 4, 0, 0, 418, 419, 7, 10, 0, 0, 419, 420, 1, 0, 0, 0, 420, 421, 6, 2, 2, 0, 421, 21, 1, 0, 0, 0, 422, 423, 7, 3, 0, 0, 423, 424, 7, 11, 0, 0, 424, 425, 7, 12, 0, 0, 425, 426, 7, 13, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 6, 3, 0, 0, 428, 23, 1, 0, 0, 0, 429, 430, 7, 3, 0, 0, 430, 431, 7, 14, 0, 0, 431, 432, 7, 8, 0, 0, 432, 433, 7, 13, 0, 0, 433, 434, 7, 12, 0, 0, 434, 435, 7, 1, 0, 0, 435, 436, 7, 9, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 6, 4, 3, 0, 438, 25, 1, 0, 0, 0, 439, 440, 7, 15, 0, 0, 440, 441, 7, 6, 0, 0, 441, 442, 7, 7, 0, 0, 442, 443, 7, 16, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 6, 5, 4, 0, 445, 27, 1, 0, 0, 0, 446, 447, 7, 17, 0, 0, 447, 448, 7, 6, 0, 0, 448, 449, 7, 7, 0, 0, 449, 450, 7, 18, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 6, 6, 0, 0, 452, 29, 1, 0, 0, 0, 453, 454, 7, 1, 0, 0, 454, 455, 7, 9, 0, 0, 455, 456, 7, 13, 0, 0, 456, 457, 7, 1, 0, 0, 457, 458, 7, 9, 0, 0, 458, 459, 7, 3, 0, 0, 459, 460, 7, 2, 0, 0, 460, 461, 7, 5, 0, 0, 461, 462, 7, 12, 0, 0, 462, 463, 7, 5, 0, 0, 463, 464, 7, 2, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 6, 7, 0, 0, 466, 31, 1, 0, 0, 0, 467, 468, 7, 18, 0, 0, 468, 469, 7, 3, 0, 0, 469, 470, 7, 3, 0, 0, 470, 471, 7, 8, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 6, 8, 1, 0, 473, 33, 1, 0, 0, 0, 474, 475, 7, 13, 0, 0, 475, 476, 7, 1, 0, 0, 476, 477, 7, 16, 0, 0, 477, 478, 7, 1, 0, 0, 478, 479, 7, 5, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 6, 9, 0, 0, 481, 35, 1, 0, 0, 0, 482, 483, 7, 13, 0, 0, 483, 484, 7, 7, 0, 0, 484, 485, 7, 7, 0, 0, 485, 486, 7, 18, 0, 0, 486, 487, 7, 19, 0, 0, 487, 488, 7, 8, 0, 0, 488, 489, 1, 0, 0, 0, 489, 490, 6, 10, 5, 0, 490, 37, 1, 0, 0, 0, 491, 492, 7, 16, 0, 0, 492, 493, 7, 3, 0, 0, 493, 494, 7, 5, 0, 0, 494, 495, 7, 12, 0, 0, 495, 496, 1, 0, 0, 0, 496, 497, 6, 11, 6, 0, 497, 39, 1, 0, 0, 0, 498, 499, 7, 16, 0, 0, 499, 500, 7, 3, 0, 0, 500, 501, 7, 5, 0, 0, 501, 502, 7, 6, 0, 0, 502, 503, 7, 1, 0, 0, 503, 504, 7, 4, 0, 0, 504, 505, 7, 2, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 6, 12, 7, 0, 507, 41, 1, 0, 0, 0, 508, 509, 7, 16, 0, 0, 509, 510, 7, 11, 0, 0, 510, 511, 5, 95, 0, 0, 511, 512, 7, 3, 0, 0, 512, 513, 7, 14, 0, 0, 513, 514, 7, 8, 0, 0, 514, 515, 7, 12, 0, 0, 515, 516, 7, 9, 0, 0, 516, 517, 7, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 6, 13, 8, 0, 519, 43, 1, 0, 0, 0, 520, 521, 7, 6, 0, 0, 521, 522, 7, 3, 0, 0, 522, 523, 7, 9, 0, 0, 523, 524, 7, 12, 0, 0, 524, 525, 7, 16, 0, 0, 525, 526, 7, 3, 0, 0, 526, 527, 1, 0, 0, 0, 527, 528, 6, 14, 9, 0, 528, 45, 1, 0, 0, 0, 529, 530, 7, 6, 0, 0, 530, 531, 7, 7, 0, 0, 531, 532, 7, 20, 0, 0, 532, 533, 1, 0, 0, 0, 533, 534, 6, 15, 0, 0, 534, 47, 1, 0, 0, 0, 535, 536, 7, 2, 0, 0, 536, 537, 7, 10, 0, 0, 537, 538, 7, 7, 0, 0, 538, 539, 7, 20, 0, 0, 539, 540, 1, 0, 0, 0, 540, 541, 6, 16, 10, 0, 541, 49, 1, 0, 0, 0, 542, 543, 7, 2, 0, 0, 543, 544, 7, 7, 0, 0, 544, 545, 7, 6, 0, 0, 545, 546, 7, 5, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 6, 17, 0, 0, 548, 51, 1, 0, 0, 0, 549, 550, 7, 2, 0, 0, 550, 551, 7, 5, 0, 0, 551, 552, 7, 12, 0, 0, 552, 553, 7, 5, 0, 0, 553, 554, 7, 2, 0, 0, 554, 555, 1, 0, 0, 0, 555, 556, 6, 18, 0, 0, 556, 53, 1, 0, 0, 0, 557, 558, 7, 20, 0, 0, 558, 559, 7, 10, 0, 0, 559, 560, 7, 3, 0, 0, 560, 561, 7, 6, 0, 0, 561, 562, 7, 3, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 6, 19, 0, 0, 564, 55, 1, 0, 0, 0, 565, 567, 8, 21, 0, 0, 566, 565, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 6, 20, 0, 0, 571, 57, 1, 0, 0, 0, 572, 573, 5, 47, 0, 0, 573, 574, 5, 47, 0, 0, 574, 578, 1, 0, 0, 0, 575, 577, 8, 22, 0, 0, 576, 575, 1, 0, 0, 0, 577, 580, 1, 0, 0, 0, 578, 576, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 582, 1, 0, 0, 0, 580, 578, 1, 0, 0, 0, 581, 583, 5, 13, 0, 0, 582, 581, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 585, 1, 0, 0, 0, 584, 586, 5, 10, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 6, 21, 11, 0, 588, 59, 1, 0, 0, 0, 589, 590, 5, 47, 0, 0, 590, 591, 5, 42, 0, 0, 591, 596, 1, 0, 0, 0, 592, 595, 3, 60, 22, 0, 593, 595, 9, 0, 0, 0, 594, 592, 1, 0, 0, 0, 594, 593, 1, 0, 0, 0, 595, 598, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 596, 594, 1, 0, 0, 0, 597, 599, 1, 0, 0, 0, 598, 596, 1, 0, 0, 0, 599, 600, 5, 42, 0, 0, 600, 601, 5, 47, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 6, 22, 11, 0, 603, 61, 1, 0, 0, 0, 604, 606, 7, 23, 0, 0, 605, 604, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 610, 6, 23, 11, 0, 610, 63, 1, 0, 0, 0, 611, 615, 8, 24, 0, 0, 612, 613, 5, 47, 0, 0, 613, 615, 8, 25, 0, 0, 614, 611, 1, 0, 0, 0, 614, 612, 1, 0, 0, 0, 615, 65, 1, 0, 0, 0, 616, 618, 3, 64, 24, 0, 617, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 67, 1, 0, 0, 0, 621, 622, 3, 178, 81, 0, 622, 623, 1, 0, 0, 0, 623, 624, 6, 26, 12, 0, 624, 625, 6, 26, 13, 0, 625, 69, 1, 0, 0, 0, 626, 627, 3, 78, 31, 0, 627, 628, 1, 0, 0, 0, 628, 629, 6, 27, 14, 0, 629, 630, 6, 27, 15, 0, 630, 71, 1, 0, 0, 0, 631, 632, 3, 62, 23, 0, 632, 633, 1, 0, 0, 0, 633, 634, 6, 28, 11, 0, 634, 73, 1, 0, 0, 0, 635, 636, 3, 58, 21, 0, 636, 637, 1, 0, 0, 0, 637, 638, 6, 29, 11, 0, 638, 75, 1, 0, 0, 0, 639, 640, 3, 60, 22, 0, 640, 641, 1, 0, 0, 0, 641, 642, 6, 30, 11, 0, 642, 77, 1, 0, 0, 0, 643, 644, 5, 124, 0, 0, 644, 645, 1, 0, 0, 0, 645, 646, 6, 31, 15, 0, 646, 79, 1, 0, 0, 0, 647, 648, 7, 26, 0, 0, 648, 81, 1, 0, 0, 0, 649, 650, 7, 27, 0, 0, 650, 83, 1, 0, 0, 0, 651, 652, 5, 92, 0, 0, 652, 653, 7, 28, 0, 0, 653, 85, 1, 0, 0, 0, 654, 655, 8, 29, 0, 0, 655, 87, 1, 0, 0, 0, 656, 658, 7, 3, 0, 0, 657, 659, 7, 30, 0, 0, 658, 657, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 661, 1, 0, 0, 0, 660, 662, 3, 80, 32, 0, 661, 660, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 89, 1, 0, 0, 0, 665, 666, 5, 64, 0, 0, 666, 91, 1, 0, 0, 0, 667, 668, 5, 96, 0, 0, 668, 93, 1, 0, 0, 0, 669, 673, 8, 31, 0, 0, 670, 671, 5, 96, 0, 0, 671, 673, 5, 96, 0, 0, 672, 669, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 673, 95, 1, 0, 0, 0, 674, 675, 5, 95, 0, 0, 675, 97, 1, 0, 0, 0, 676, 680, 3, 82, 33, 0, 677, 680, 3, 80, 32, 0, 678, 680, 3, 96, 40, 0, 679, 676, 1, 0, 0, 0, 679, 677, 1, 0, 0, 0, 679, 678, 1, 0, 0, 0, 680, 99, 1, 0, 0, 0, 681, 686, 5, 34, 0, 0, 682, 685, 3, 84, 34, 0, 683, 685, 3, 86, 35, 0, 684, 682, 1, 0, 0, 0, 684, 683, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 689, 711, 5, 34, 0, 0, 690, 691, 5, 34, 0, 0, 691, 692, 5, 34, 0, 0, 692, 693, 5, 34, 0, 0, 693, 697, 1, 0, 0, 0, 694, 696, 8, 22, 0, 0, 695, 694, 1, 0, 0, 0, 696, 699, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 697, 695, 1, 0, 0, 0, 698, 700, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 700, 701, 5, 34, 0, 0, 701, 702, 5, 34, 0, 0, 702, 703, 5, 34, 0, 0, 703, 705, 1, 0, 0, 0, 704, 706, 5, 34, 0, 0, 705, 704, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 708, 1, 0, 0, 0, 707, 709, 5, 34, 0, 0, 708, 707, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 711, 1, 0, 0, 0, 710, 681, 1, 0, 0, 0, 710, 690, 1, 0, 0, 0, 711, 101, 1, 0, 0, 0, 712, 714, 3, 80, 32, 0, 713, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 713, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 103, 1, 0, 0, 0, 717, 719, 3, 80, 32, 0, 718, 717, 1, 0, 0, 0, 719, 720, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 726, 3, 120, 52, 0, 723, 725, 3, 80, 32, 0, 724, 723, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 760, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 729, 731, 3, 120, 52, 0, 730, 732, 3, 80, 32, 0, 731, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 731, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 760, 1, 0, 0, 0, 735, 737, 3, 80, 32, 0, 736, 735, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 736, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 747, 1, 0, 0, 0, 740, 744, 3, 120, 52, 0, 741, 743, 3, 80, 32, 0, 742, 741, 1, 0, 0, 0, 743, 746, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 748, 1, 0, 0, 0, 746, 744, 1, 0, 0, 0, 747, 740, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 3, 88, 36, 0, 750, 760, 1, 0, 0, 0, 751, 753, 3, 120, 52, 0, 752, 754, 3, 80, 32, 0, 753, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 753, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 757, 758, 3, 88, 36, 0, 758, 760, 1, 0, 0, 0, 759, 718, 1, 0, 0, 0, 759, 729, 1, 0, 0, 0, 759, 736, 1, 0, 0, 0, 759, 751, 1, 0, 0, 0, 760, 105, 1, 0, 0, 0, 761, 762, 7, 32, 0, 0, 762, 763, 7, 33, 0, 0, 763, 107, 1, 0, 0, 0, 764, 765, 7, 12, 0, 0, 765, 766, 7, 9, 0, 0, 766, 767, 7, 0, 0, 0, 767, 109, 1, 0, 0, 0, 768, 769, 7, 12, 0, 0, 769, 770, 7, 2, 0, 0, 770, 771, 7, 4, 0, 0, 771, 111, 1, 0, 0, 0, 772, 773, 5, 61, 0, 0, 773, 113, 1, 0, 0, 0, 774, 775, 5, 58, 0, 0, 775, 776, 5, 58, 0, 0, 776, 115, 1, 0, 0, 0, 777, 778, 5, 44, 0, 0, 778, 117, 1, 0, 0, 0, 779, 780, 7, 0, 0, 0, 780, 781, 7, 3, 0, 0, 781, 782, 7, 2, 0, 0, 782, 783, 7, 4, 0, 0, 783, 119, 1, 0, 0, 0, 784, 785, 5, 46, 0, 0, 785, 121, 1, 0, 0, 0, 786, 787, 7, 15, 0, 0, 787, 788, 7, 12, 0, 0, 788, 789, 7, 13, 0, 0, 789, 790, 7, 2, 0, 0, 790, 791, 7, 3, 0, 0, 791, 123, 1, 0, 0, 0, 792, 793, 7, 15, 0, 0, 793, 794, 7, 1, 0, 0, 794, 795, 7, 6, 0, 0, 795, 796, 7, 2, 0, 0, 796, 797, 7, 5, 0, 0, 797, 125, 1, 0, 0, 0, 798, 799, 7, 13, 0, 0, 799, 800, 7, 12, 0, 0, 800, 801, 7, 2, 0, 0, 801, 802, 7, 5, 0, 0, 802, 127, 1, 0, 0, 0, 803, 804, 5, 40, 0, 0, 804, 129, 1, 0, 0, 0, 805, 806, 7, 1, 0, 0, 806, 807, 7, 9, 0, 0, 807, 131, 1, 0, 0, 0, 808, 809, 7, 1, 0, 0, 809, 810, 7, 2, 0, 0, 810, 133, 1, 0, 0, 0, 811, 812, 7, 13, 0, 0, 812, 813, 7, 1, 0, 0, 813, 814, 7, 18, 0, 0, 814, 815, 7, 3, 0, 0, 815, 135, 1, 0, 0, 0, 816, 817, 7, 9, 0, 0, 817, 818, 7, 7, 0, 0, 818, 819, 7, 5, 0, 0, 819, 137, 1, 0, 0, 0, 820, 821, 7, 9, 0, 0, 821, 822, 7, 19, 0, 0, 822, 823, 7, 13, 0, 0, 823, 824, 7, 13, 0, 0, 824, 139, 1, 0, 0, 0, 825, 826, 7, 9, 0, 0, 826, 827, 7, 19, 0, 0, 827, 828, 7, 13, 0, 0, 828, 829, 7, 13, 0, 0, 829, 830, 7, 2, 0, 0, 830, 141, 1, 0, 0, 0, 831, 832, 7, 7, 0, 0, 832, 833, 7, 6, 0, 0, 833, 143, 1, 0, 0, 0, 834, 835, 5, 63, 0, 0, 835, 145, 1, 0, 0, 0, 836, 837, 7, 6, 0, 0, 837, 838, 7, 13, 0, 0, 838, 839, 7, 1, 0, 0, 839, 840, 7, 18, 0, 0, 840, 841, 7, 3, 0, 0, 841, 147, 1, 0, 0, 0, 842, 843, 5, 41, 0, 0, 843, 149, 1, 0, 0, 0, 844, 845, 7, 5, 0, 0, 845, 846, 7, 6, 0, 0, 846, 847, 7, 19, 0, 0, 847, 848, 7, 3, 0, 0, 848, 151, 1, 0, 0, 0, 849, 850, 5, 61, 0, 0, 850, 851, 5, 61, 0, 0, 851, 153, 1, 0, 0, 0, 852, 853, 5, 61, 0, 0, 853, 854, 5, 126, 0, 0, 854, 155, 1, 0, 0, 0, 855, 856, 5, 33, 0, 0, 856, 857, 5, 61, 0, 0, 857, 157, 1, 0, 0, 0, 858, 859, 5, 60, 0, 0, 859, 159, 1, 0, 0, 0, 860, 861, 5, 60, 0, 0, 861, 862, 5, 61, 0, 0, 862, 161, 1, 0, 0, 0, 863, 864, 5, 62, 0, 0, 864, 163, 1, 0, 0, 0, 865, 866, 5, 62, 0, 0, 866, 867, 5, 61, 0, 0, 867, 165, 1, 0, 0, 0, 868, 869, 5, 43, 0, 0, 869, 167, 1, 0, 0, 0, 870, 871, 5, 45, 0, 0, 871, 169, 1, 0, 0, 0, 872, 873, 5, 42, 0, 0, 873, 171, 1, 0, 0, 0, 874, 875, 5, 47, 0, 0, 875, 173, 1, 0, 0, 0, 876, 877, 5, 37, 0, 0, 877, 175, 1, 0, 0, 0, 878, 879, 3, 144, 64, 0, 879, 883, 3, 82, 33, 0, 880, 882, 3, 98, 41, 0, 881, 880, 1, 0, 0, 0, 882, 885, 1, 0, 0, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 893, 1, 0, 0, 0, 885, 883, 1, 0, 0, 0, 886, 888, 3, 144, 64, 0, 887, 889, 3, 80, 32, 0, 888, 887, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 1, 0, 0, 0, 892, 878, 1, 0, 0, 0, 892, 886, 1, 0, 0, 0, 893, 177, 1, 0, 0, 0, 894, 895, 5, 91, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 6, 81, 0, 0, 897, 898, 6, 81, 0, 0, 898, 179, 1, 0, 0, 0, 899, 900, 5, 93, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 6, 82, 15, 0, 902, 903, 6, 82, 15, 0, 903, 181, 1, 0, 0, 0, 904, 908, 3, 82, 33, 0, 905, 907, 3, 98, 41, 0, 906, 905, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 921, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 911, 914, 3, 96, 40, 0, 912, 914, 3, 90, 37, 0, 913, 911, 1, 0, 0, 0, 913, 912, 1, 0, 0, 0, 914, 916, 1, 0, 0, 0, 915, 917, 3, 98, 41, 0, 916, 915, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 921, 1, 0, 0, 0, 920, 904, 1, 0, 0, 0, 920, 913, 1, 0, 0, 0, 921, 183, 1, 0, 0, 0, 922, 924, 3, 92, 38, 0, 923, 925, 3, 94, 39, 0, 924, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 3, 92, 38, 0, 929, 185, 1, 0, 0, 0, 930, 931, 3, 184, 84, 0, 931, 187, 1, 0, 0, 0, 932, 933, 3, 58, 21, 0, 933, 934, 1, 0, 0, 0, 934, 935, 6, 86, 11, 0, 935, 189, 1, 0, 0, 0, 936, 937, 3, 60, 22, 0, 937, 938, 1, 0, 0, 0, 938, 939, 6, 87, 11, 0, 939, 191, 1, 0, 0, 0, 940, 941, 3, 62, 23, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 88, 11, 0, 943, 193, 1, 0, 0, 0, 944, 945, 3, 78, 31, 0, 945, 946, 1, 0, 0, 0, 946, 947, 6, 89, 14, 0, 947, 948, 6, 89, 15, 0, 948, 195, 1, 0, 0, 0, 949, 950, 3, 178, 81, 0, 950, 951, 1, 0, 0, 0, 951, 952, 6, 90, 12, 0, 952, 197, 1, 0, 0, 0, 953, 954, 3, 180, 82, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 91, 16, 0, 956, 199, 1, 0, 0, 0, 957, 958, 3, 116, 50, 0, 958, 959, 1, 0, 0, 0, 959, 960, 6, 92, 17, 0, 960, 201, 1, 0, 0, 0, 961, 962, 3, 112, 48, 0, 962, 963, 1, 0, 0, 0, 963, 964, 6, 93, 18, 0, 964, 203, 1, 0, 0, 0, 965, 966, 3, 100, 42, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 94, 19, 0, 968, 205, 1, 0, 0, 0, 969, 970, 7, 16, 0, 0, 970, 971, 7, 3, 0, 0, 971, 972, 7, 5, 0, 0, 972, 973, 7, 12, 0, 0, 973, 974, 7, 0, 0, 0, 974, 975, 7, 12, 0, 0, 975, 976, 7, 5, 0, 0, 976, 977, 7, 12, 0, 0, 977, 207, 1, 0, 0, 0, 978, 979, 3, 66, 25, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 96, 20, 0, 981, 209, 1, 0, 0, 0, 982, 983, 3, 58, 21, 0, 983, 984, 1, 0, 0, 0, 984, 985, 6, 97, 11, 0, 985, 211, 1, 0, 0, 0, 986, 987, 3, 60, 22, 0, 987, 988, 1, 0, 0, 0, 988, 989, 6, 98, 11, 0, 989, 213, 1, 0, 0, 0, 990, 991, 3, 62, 23, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 99, 11, 0, 993, 215, 1, 0, 0, 0, 994, 995, 3, 78, 31, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 100, 14, 0, 997, 998, 6, 100, 15, 0, 998, 217, 1, 0, 0, 0, 999, 1000, 3, 120, 52, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 6, 101, 21, 0, 1002, 219, 1, 0, 0, 0, 1003, 1004, 3, 116, 50, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 6, 102, 17, 0, 1006, 221, 1, 0, 0, 0, 1007, 1012, 3, 82, 33, 0, 1008, 1012, 3, 80, 32, 0, 1009, 1012, 3, 96, 40, 0, 1010, 1012, 3, 170, 77, 0, 1011, 1007, 1, 0, 0, 0, 1011, 1008, 1, 0, 0, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1010, 1, 0, 0, 0, 1012, 223, 1, 0, 0, 0, 1013, 1016, 3, 82, 33, 0, 1014, 1016, 3, 170, 77, 0, 1015, 1013, 1, 0, 0, 0, 1015, 1014, 1, 0, 0, 0, 1016, 1020, 1, 0, 0, 0, 1017, 1019, 3, 222, 103, 0, 1018, 1017, 1, 0, 0, 0, 1019, 1022, 1, 0, 0, 0, 1020, 1018, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1033, 1, 0, 0, 0, 1022, 1020, 1, 0, 0, 0, 1023, 1026, 3, 96, 40, 0, 1024, 1026, 3, 90, 37, 0, 1025, 1023, 1, 0, 0, 0, 1025, 1024, 1, 0, 0, 0, 1026, 1028, 1, 0, 0, 0, 1027, 1029, 3, 222, 103, 0, 1028, 1027, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1028, 1, 0, 0, 0, 1030, 1031, 1, 0, 0, 0, 1031, 1033, 1, 0, 0, 0, 1032, 1015, 1, 0, 0, 0, 1032, 1025, 1, 0, 0, 0, 1033, 225, 1, 0, 0, 0, 1034, 1037, 3, 224, 104, 0, 1035, 1037, 3, 184, 84, 0, 1036, 1034, 1, 0, 0, 0, 1036, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1036, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 227, 1, 0, 0, 0, 1040, 1041, 3, 58, 21, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 6, 106, 11, 0, 1043, 229, 1, 0, 0, 0, 1044, 1045, 3, 60, 22, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1047, 6, 107, 11, 0, 1047, 231, 1, 0, 0, 0, 1048, 1049, 3, 62, 23, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1051, 6, 108, 11, 0, 1051, 233, 1, 0, 0, 0, 1052, 1053, 3, 78, 31, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 6, 109, 14, 0, 1055, 1056, 6, 109, 15, 0, 1056, 235, 1, 0, 0, 0, 1057, 1058, 3, 112, 48, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 6, 110, 18, 0, 1060, 237, 1, 0, 0, 0, 1061, 1062, 3, 116, 50, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1064, 6, 111, 17, 0, 1064, 239, 1, 0, 0, 0, 1065, 1066, 3, 120, 52, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 6, 112, 21, 0, 1068, 241, 1, 0, 0, 0, 1069, 1070, 7, 12, 0, 0, 1070, 1071, 7, 2, 0, 0, 1071, 243, 1, 0, 0, 0, 1072, 1073, 3, 226, 105, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 6, 114, 22, 0, 1075, 245, 1, 0, 0, 0, 1076, 1077, 3, 58, 21, 0, 1077, 1078, 1, 0, 0, 0, 1078, 1079, 6, 115, 11, 0, 1079, 247, 1, 0, 0, 0, 1080, 1081, 3, 60, 22, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1083, 6, 116, 11, 0, 1083, 249, 1, 0, 0, 0, 1084, 1085, 3, 62, 23, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 117, 11, 0, 1087, 251, 1, 0, 0, 0, 1088, 1089, 3, 78, 31, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 118, 14, 0, 1091, 1092, 6, 118, 15, 0, 1092, 253, 1, 0, 0, 0, 1093, 1094, 3, 178, 81, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1096, 6, 119, 12, 0, 1096, 1097, 6, 119, 23, 0, 1097, 255, 1, 0, 0, 0, 1098, 1099, 7, 7, 0, 0, 1099, 1100, 7, 9, 0, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 6, 120, 24, 0, 1102, 257, 1, 0, 0, 0, 1103, 1104, 7, 20, 0, 0, 1104, 1105, 7, 1, 0, 0, 1105, 1106, 7, 5, 0, 0, 1106, 1107, 7, 10, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 6, 121, 24, 0, 1109, 259, 1, 0, 0, 0, 1110, 1111, 8, 34, 0, 0, 1111, 261, 1, 0, 0, 0, 1112, 1114, 3, 260, 122, 0, 1113, 1112, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1113, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 3, 360, 172, 0, 1118, 1120, 1, 0, 0, 0, 1119, 1113, 1, 0, 0, 0, 1119, 1120, 1, 0, 0, 0, 1120, 1122, 1, 0, 0, 0, 1121, 1123, 3, 260, 122, 0, 1122, 1121, 1, 0, 0, 0, 1123, 1124, 1, 0, 0, 0, 1124, 1122, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 263, 1, 0, 0, 0, 1126, 1127, 3, 186, 85, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 6, 124, 25, 0, 1129, 265, 1, 0, 0, 0, 1130, 1131, 3, 262, 123, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 6, 125, 26, 0, 1133, 267, 1, 0, 0, 0, 1134, 1135, 3, 58, 21, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, 6, 126, 11, 0, 1137, 269, 1, 0, 0, 0, 1138, 1139, 3, 60, 22, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1141, 6, 127, 11, 0, 1141, 271, 1, 0, 0, 0, 1142, 1143, 3, 62, 23, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 128, 11, 0, 1145, 273, 1, 0, 0, 0, 1146, 1147, 3, 78, 31, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1149, 6, 129, 14, 0, 1149, 1150, 6, 129, 15, 0, 1150, 1151, 6, 129, 15, 0, 1151, 275, 1, 0, 0, 0, 1152, 1153, 3, 112, 48, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 6, 130, 18, 0, 1155, 277, 1, 0, 0, 0, 1156, 1157, 3, 116, 50, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 6, 131, 17, 0, 1159, 279, 1, 0, 0, 0, 1160, 1161, 3, 120, 52, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1163, 6, 132, 21, 0, 1163, 281, 1, 0, 0, 0, 1164, 1165, 3, 258, 121, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 6, 133, 27, 0, 1167, 283, 1, 0, 0, 0, 1168, 1169, 3, 226, 105, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 6, 134, 22, 0, 1171, 285, 1, 0, 0, 0, 1172, 1173, 3, 186, 85, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 6, 135, 25, 0, 1175, 287, 1, 0, 0, 0, 1176, 1177, 3, 58, 21, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 6, 136, 11, 0, 1179, 289, 1, 0, 0, 0, 1180, 1181, 3, 60, 22, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1183, 6, 137, 11, 0, 1183, 291, 1, 0, 0, 0, 1184, 1185, 3, 62, 23, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 138, 11, 0, 1187, 293, 1, 0, 0, 0, 1188, 1189, 3, 78, 31, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 139, 14, 0, 1191, 1192, 6, 139, 15, 0, 1192, 295, 1, 0, 0, 0, 1193, 1194, 3, 116, 50, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 6, 140, 17, 0, 1196, 297, 1, 0, 0, 0, 1197, 1198, 3, 120, 52, 0, 1198, 1199, 1, 0, 0, 0, 1199, 1200, 6, 141, 21, 0, 1200, 299, 1, 0, 0, 0, 1201, 1202, 3, 256, 120, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 6, 142, 28, 0, 1204, 1205, 6, 142, 29, 0, 1205, 301, 1, 0, 0, 0, 1206, 1207, 3, 66, 25, 0, 1207, 1208, 1, 0, 0, 0, 1208, 1209, 6, 143, 20, 0, 1209, 303, 1, 0, 0, 0, 1210, 1211, 3, 58, 21, 0, 1211, 1212, 1, 0, 0, 0, 1212, 1213, 6, 144, 11, 0, 1213, 305, 1, 0, 0, 0, 1214, 1215, 3, 60, 22, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1217, 6, 145, 11, 0, 1217, 307, 1, 0, 0, 0, 1218, 1219, 3, 62, 23, 0, 1219, 1220, 1, 0, 0, 0, 1220, 1221, 6, 146, 11, 0, 1221, 309, 1, 0, 0, 0, 1222, 1223, 3, 78, 31, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1225, 6, 147, 14, 0, 1225, 1226, 6, 147, 15, 0, 1226, 1227, 6, 147, 15, 0, 1227, 311, 1, 0, 0, 0, 1228, 1229, 3, 116, 50, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 6, 148, 17, 0, 1231, 313, 1, 0, 0, 0, 1232, 1233, 3, 120, 52, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 6, 149, 21, 0, 1235, 315, 1, 0, 0, 0, 1236, 1237, 3, 226, 105, 0, 1237, 1238, 1, 0, 0, 0, 1238, 1239, 6, 150, 22, 0, 1239, 317, 1, 0, 0, 0, 1240, 1241, 3, 58, 21, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 6, 151, 11, 0, 1243, 319, 1, 0, 0, 0, 1244, 1245, 3, 60, 22, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 152, 11, 0, 1247, 321, 1, 0, 0, 0, 1248, 1249, 3, 62, 23, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 153, 11, 0, 1251, 323, 1, 0, 0, 0, 1252, 1253, 3, 78, 31, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 154, 14, 0, 1255, 1256, 6, 154, 15, 0, 1256, 325, 1, 0, 0, 0, 1257, 1258, 3, 120, 52, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 6, 155, 21, 0, 1260, 327, 1, 0, 0, 0, 1261, 1262, 3, 186, 85, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 6, 156, 25, 0, 1264, 329, 1, 0, 0, 0, 1265, 1266, 3, 182, 83, 0, 1266, 1267, 1, 0, 0, 0, 1267, 1268, 6, 157, 30, 0, 1268, 331, 1, 0, 0, 0, 1269, 1270, 3, 58, 21, 0, 1270, 1271, 1, 0, 0, 0, 1271, 1272, 6, 158, 11, 0, 1272, 333, 1, 0, 0, 0, 1273, 1274, 3, 60, 22, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 6, 159, 11, 0, 1276, 335, 1, 0, 0, 0, 1277, 1278, 3, 62, 23, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 160, 11, 0, 1280, 337, 1, 0, 0, 0, 1281, 1282, 3, 78, 31, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 161, 14, 0, 1284, 1285, 6, 161, 15, 0, 1285, 339, 1, 0, 0, 0, 1286, 1287, 7, 1, 0, 0, 1287, 1288, 7, 9, 0, 0, 1288, 1289, 7, 15, 0, 0, 1289, 1290, 7, 7, 0, 0, 1290, 341, 1, 0, 0, 0, 1291, 1292, 3, 58, 21, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 6, 163, 11, 0, 1294, 343, 1, 0, 0, 0, 1295, 1296, 3, 60, 22, 0, 1296, 1297, 1, 0, 0, 0, 1297, 1298, 6, 164, 11, 0, 1298, 345, 1, 0, 0, 0, 1299, 1300, 3, 62, 23, 0, 1300, 1301, 1, 0, 0, 0, 1301, 1302, 6, 165, 11, 0, 1302, 347, 1, 0, 0, 0, 1303, 1304, 3, 78, 31, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 6, 166, 14, 0, 1306, 1307, 6, 166, 15, 0, 1307, 349, 1, 0, 0, 0, 1308, 1309, 7, 15, 0, 0, 1309, 1310, 7, 19, 0, 0, 1310, 1311, 7, 9, 0, 0, 1311, 1312, 7, 4, 0, 0, 1312, 1313, 7, 5, 0, 0, 1313, 1314, 7, 1, 0, 0, 1314, 1315, 7, 7, 0, 0, 1315, 1316, 7, 9, 0, 0, 1316, 1317, 7, 2, 0, 0, 1317, 351, 1, 0, 0, 0, 1318, 1319, 3, 58, 21, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 6, 168, 11, 0, 1321, 353, 1, 0, 0, 0, 1322, 1323, 3, 60, 22, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1325, 6, 169, 11, 0, 1325, 355, 1, 0, 0, 0, 1326, 1327, 3, 62, 23, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1329, 6, 170, 11, 0, 1329, 357, 1, 0, 0, 0, 1330, 1331, 3, 180, 82, 0, 1331, 1332, 1, 0, 0, 0, 1332, 1333, 6, 171, 16, 0, 1333, 1334, 6, 171, 15, 0, 1334, 359, 1, 0, 0, 0, 1335, 1336, 5, 58, 0, 0, 1336, 361, 1, 0, 0, 0, 1337, 1343, 3, 90, 37, 0, 1338, 1343, 3, 80, 32, 0, 1339, 1343, 3, 120, 52, 0, 1340, 1343, 3, 82, 33, 0, 1341, 1343, 3, 96, 40, 0, 1342, 1337, 1, 0, 0, 0, 1342, 1338, 1, 0, 0, 0, 1342, 1339, 1, 0, 0, 0, 1342, 1340, 1, 0, 0, 0, 1342, 1341, 1, 0, 0, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1342, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 363, 1, 0, 0, 0, 1346, 1347, 3, 58, 21, 0, 1347, 1348, 1, 0, 0, 0, 1348, 1349, 6, 174, 11, 0, 1349, 365, 1, 0, 0, 0, 1350, 1351, 3, 60, 22, 0, 1351, 1352, 1, 0, 0, 0, 1352, 1353, 6, 175, 11, 0, 1353, 367, 1, 0, 0, 0, 1354, 1355, 3, 62, 23, 0, 1355, 1356, 1, 0, 0, 0, 1356, 1357, 6, 176, 11, 0, 1357, 369, 1, 0, 0, 0, 1358, 1359, 3, 78, 31, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1361, 6, 177, 14, 0, 1361, 1362, 6, 177, 15, 0, 1362, 371, 1, 0, 0, 0, 1363, 1364, 3, 66, 25, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 6, 178, 20, 0, 1366, 1367, 6, 178, 15, 0, 1367, 1368, 6, 178, 31, 0, 1368, 373, 1, 0, 0, 0, 1369, 1370, 3, 58, 21, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 179, 11, 0, 1372, 375, 1, 0, 0, 0, 1373, 1374, 3, 60, 22, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1376, 6, 180, 11, 0, 1376, 377, 1, 0, 0, 0, 1377, 1378, 3, 62, 23, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 6, 181, 11, 0, 1380, 379, 1, 0, 0, 0, 1381, 1382, 3, 116, 50, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 6, 182, 17, 0, 1384, 1385, 6, 182, 15, 0, 1385, 1386, 6, 182, 7, 0, 1386, 381, 1, 0, 0, 0, 1387, 1388, 3, 58, 21, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 6, 183, 11, 0, 1390, 383, 1, 0, 0, 0, 1391, 1392, 3, 60, 22, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 6, 184, 11, 0, 1394, 385, 1, 0, 0, 0, 1395, 1396, 3, 62, 23, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 185, 11, 0, 1398, 387, 1, 0, 0, 0, 1399, 1400, 3, 186, 85, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 6, 186, 15, 0, 1402, 1403, 6, 186, 0, 0, 1403, 1404, 6, 186, 25, 0, 1404, 389, 1, 0, 0, 0, 1405, 1406, 3, 182, 83, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1408, 6, 187, 15, 0, 1408, 1409, 6, 187, 0, 0, 1409, 1410, 6, 187, 30, 0, 1410, 391, 1, 0, 0, 0, 1411, 1412, 3, 106, 45, 0, 1412, 1413, 1, 0, 0, 0, 1413, 1414, 6, 188, 15, 0, 1414, 1415, 6, 188, 0, 0, 1415, 1416, 6, 188, 32, 0, 1416, 393, 1, 0, 0, 0, 1417, 1418, 3, 78, 31, 0, 1418, 1419, 1, 0, 0, 0, 1419, 1420, 6, 189, 14, 0, 1420, 1421, 6, 189, 15, 0, 1421, 395, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 568, 578, 582, 585, 594, 596, 607, 614, 619, 658, 663, 672, 679, 684, 686, 697, 705, 708, 710, 715, 720, 726, 733, 738, 744, 747, 755, 759, 883, 890, 892, 908, 913, 918, 920, 926, 1011, 1015, 1020, 1025, 1030, 1032, 1036, 1038, 1115, 1119, 1124, 1342, 1344, 33, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 12, 0, 5, 14, 0, 5, 10, 0, 5, 5, 0, 5, 11, 0, 0, 1, 0, 7, 69, 0, 5, 0, 0, 7, 29, 0, 4, 0, 0, 7, 70, 0, 7, 38, 0, 7, 36, 0, 7, 30, 0, 7, 25, 0, 7, 40, 0, 7, 80, 0, 5, 13, 0, 5, 7, 0, 7, 72, 0, 7, 90, 0, 7, 89, 0, 7, 88, 0, 5, 9, 0, 7, 71, 0, 5, 15, 0, 7, 33, 0] \ No newline at end of file +[4, 0, 124, 1450, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 2, 193, 7, 193, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 4, 20, 575, 8, 20, 11, 20, 12, 20, 576, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 585, 8, 21, 10, 21, 12, 21, 588, 9, 21, 1, 21, 3, 21, 591, 8, 21, 1, 21, 3, 21, 594, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 603, 8, 22, 10, 22, 12, 22, 606, 9, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 4, 23, 614, 8, 23, 11, 23, 12, 23, 615, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 3, 24, 623, 8, 24, 1, 25, 4, 25, 626, 8, 25, 11, 25, 12, 25, 627, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 36, 1, 36, 3, 36, 667, 8, 36, 1, 36, 4, 36, 670, 8, 36, 11, 36, 12, 36, 671, 1, 37, 1, 37, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 681, 8, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 3, 41, 688, 8, 41, 1, 42, 1, 42, 1, 42, 5, 42, 693, 8, 42, 10, 42, 12, 42, 696, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 704, 8, 42, 10, 42, 12, 42, 707, 9, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 714, 8, 42, 1, 42, 3, 42, 717, 8, 42, 3, 42, 719, 8, 42, 1, 43, 4, 43, 722, 8, 43, 11, 43, 12, 43, 723, 1, 44, 4, 44, 727, 8, 44, 11, 44, 12, 44, 728, 1, 44, 1, 44, 5, 44, 733, 8, 44, 10, 44, 12, 44, 736, 9, 44, 1, 44, 1, 44, 4, 44, 740, 8, 44, 11, 44, 12, 44, 741, 1, 44, 4, 44, 745, 8, 44, 11, 44, 12, 44, 746, 1, 44, 1, 44, 5, 44, 751, 8, 44, 10, 44, 12, 44, 754, 9, 44, 3, 44, 756, 8, 44, 1, 44, 1, 44, 1, 44, 1, 44, 4, 44, 762, 8, 44, 11, 44, 12, 44, 763, 1, 44, 1, 44, 3, 44, 768, 8, 44, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 5, 80, 890, 8, 80, 10, 80, 12, 80, 893, 9, 80, 1, 80, 1, 80, 4, 80, 897, 8, 80, 11, 80, 12, 80, 898, 3, 80, 901, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 5, 83, 915, 8, 83, 10, 83, 12, 83, 918, 9, 83, 1, 83, 1, 83, 3, 83, 922, 8, 83, 1, 83, 4, 83, 925, 8, 83, 11, 83, 12, 83, 926, 3, 83, 929, 8, 83, 1, 84, 1, 84, 4, 84, 933, 8, 84, 11, 84, 12, 84, 934, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1024, 8, 104, 1, 105, 1, 105, 3, 105, 1028, 8, 105, 1, 105, 5, 105, 1031, 8, 105, 10, 105, 12, 105, 1034, 9, 105, 1, 105, 1, 105, 3, 105, 1038, 8, 105, 1, 105, 4, 105, 1041, 8, 105, 11, 105, 12, 105, 1042, 3, 105, 1045, 8, 105, 1, 106, 1, 106, 4, 106, 1049, 8, 106, 11, 106, 12, 106, 1050, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 4, 124, 1126, 8, 124, 11, 124, 12, 124, 1127, 1, 124, 1, 124, 3, 124, 1132, 8, 124, 1, 124, 4, 124, 1135, 8, 124, 11, 124, 12, 124, 1136, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 1, 137, 1, 137, 1, 137, 1, 138, 1, 138, 1, 138, 1, 138, 1, 139, 1, 139, 1, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 170, 1, 170, 1, 171, 1, 171, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 4, 175, 1359, 8, 175, 11, 175, 12, 175, 1360, 1, 176, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 180, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 181, 1, 182, 1, 182, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 192, 1, 193, 1, 193, 1, 193, 1, 193, 1, 193, 2, 604, 705, 0, 194, 16, 1, 18, 2, 20, 3, 22, 4, 24, 5, 26, 6, 28, 7, 30, 8, 32, 9, 34, 10, 36, 11, 38, 12, 40, 13, 42, 14, 44, 15, 46, 16, 48, 17, 50, 18, 52, 19, 54, 20, 56, 21, 58, 22, 60, 23, 62, 24, 64, 0, 66, 25, 68, 0, 70, 0, 72, 26, 74, 27, 76, 28, 78, 29, 80, 0, 82, 0, 84, 0, 86, 0, 88, 0, 90, 0, 92, 0, 94, 0, 96, 0, 98, 0, 100, 30, 102, 31, 104, 32, 106, 33, 108, 34, 110, 35, 112, 36, 114, 37, 116, 38, 118, 39, 120, 40, 122, 41, 124, 42, 126, 43, 128, 44, 130, 45, 132, 46, 134, 47, 136, 48, 138, 49, 140, 50, 142, 51, 144, 52, 146, 53, 148, 54, 150, 55, 152, 56, 154, 57, 156, 58, 158, 59, 160, 60, 162, 61, 164, 62, 166, 63, 168, 64, 170, 65, 172, 66, 174, 67, 176, 68, 178, 69, 180, 70, 182, 71, 184, 0, 186, 72, 188, 73, 190, 74, 192, 75, 194, 0, 196, 0, 198, 0, 200, 0, 202, 0, 204, 0, 206, 76, 208, 0, 210, 0, 212, 77, 214, 78, 216, 79, 218, 0, 220, 0, 222, 0, 224, 0, 226, 0, 228, 80, 230, 81, 232, 82, 234, 83, 236, 0, 238, 0, 240, 0, 242, 0, 244, 84, 246, 0, 248, 85, 250, 86, 252, 87, 254, 0, 256, 0, 258, 88, 260, 89, 262, 0, 264, 90, 266, 0, 268, 91, 270, 92, 272, 93, 274, 0, 276, 0, 278, 0, 280, 0, 282, 0, 284, 0, 286, 0, 288, 94, 290, 95, 292, 96, 294, 0, 296, 0, 298, 0, 300, 0, 302, 0, 304, 0, 306, 0, 308, 97, 310, 98, 312, 99, 314, 0, 316, 0, 318, 0, 320, 0, 322, 100, 324, 101, 326, 102, 328, 0, 330, 0, 332, 0, 334, 0, 336, 103, 338, 104, 340, 105, 342, 0, 344, 106, 346, 107, 348, 108, 350, 109, 352, 0, 354, 110, 356, 111, 358, 112, 360, 113, 362, 0, 364, 114, 366, 115, 368, 116, 370, 117, 372, 118, 374, 0, 376, 0, 378, 0, 380, 119, 382, 120, 384, 121, 386, 0, 388, 0, 390, 122, 392, 123, 394, 124, 396, 0, 398, 0, 400, 0, 402, 0, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 35, 2, 0, 68, 68, 100, 100, 2, 0, 73, 73, 105, 105, 2, 0, 83, 83, 115, 115, 2, 0, 69, 69, 101, 101, 2, 0, 67, 67, 99, 99, 2, 0, 84, 84, 116, 116, 2, 0, 82, 82, 114, 114, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 78, 78, 110, 110, 2, 0, 72, 72, 104, 104, 2, 0, 86, 86, 118, 118, 2, 0, 65, 65, 97, 97, 2, 0, 76, 76, 108, 108, 2, 0, 88, 88, 120, 120, 2, 0, 70, 70, 102, 102, 2, 0, 77, 77, 109, 109, 2, 0, 71, 71, 103, 103, 2, 0, 75, 75, 107, 107, 2, 0, 85, 85, 117, 117, 2, 0, 87, 87, 119, 119, 6, 0, 9, 10, 13, 13, 32, 32, 47, 47, 91, 91, 93, 93, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 11, 0, 9, 10, 13, 13, 32, 32, 34, 34, 44, 44, 47, 47, 58, 58, 61, 61, 91, 91, 93, 93, 124, 124, 2, 0, 42, 42, 47, 47, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 8, 0, 34, 34, 78, 78, 82, 82, 84, 84, 92, 92, 110, 110, 114, 114, 116, 116, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 2, 0, 43, 43, 45, 45, 1, 0, 96, 96, 2, 0, 66, 66, 98, 98, 2, 0, 89, 89, 121, 121, 11, 0, 9, 10, 13, 13, 32, 32, 34, 35, 44, 44, 47, 47, 58, 58, 60, 60, 62, 63, 92, 92, 124, 124, 1476, 0, 16, 1, 0, 0, 0, 0, 18, 1, 0, 0, 0, 0, 20, 1, 0, 0, 0, 0, 22, 1, 0, 0, 0, 0, 24, 1, 0, 0, 0, 0, 26, 1, 0, 0, 0, 0, 28, 1, 0, 0, 0, 0, 30, 1, 0, 0, 0, 0, 32, 1, 0, 0, 0, 0, 34, 1, 0, 0, 0, 0, 36, 1, 0, 0, 0, 0, 38, 1, 0, 0, 0, 0, 40, 1, 0, 0, 0, 0, 42, 1, 0, 0, 0, 0, 44, 1, 0, 0, 0, 0, 46, 1, 0, 0, 0, 0, 48, 1, 0, 0, 0, 0, 50, 1, 0, 0, 0, 0, 52, 1, 0, 0, 0, 0, 54, 1, 0, 0, 0, 0, 56, 1, 0, 0, 0, 0, 58, 1, 0, 0, 0, 0, 60, 1, 0, 0, 0, 0, 62, 1, 0, 0, 0, 0, 66, 1, 0, 0, 0, 1, 68, 1, 0, 0, 0, 1, 70, 1, 0, 0, 0, 1, 72, 1, 0, 0, 0, 1, 74, 1, 0, 0, 0, 1, 76, 1, 0, 0, 0, 2, 78, 1, 0, 0, 0, 2, 100, 1, 0, 0, 0, 2, 102, 1, 0, 0, 0, 2, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 2, 108, 1, 0, 0, 0, 2, 110, 1, 0, 0, 0, 2, 112, 1, 0, 0, 0, 2, 114, 1, 0, 0, 0, 2, 116, 1, 0, 0, 0, 2, 118, 1, 0, 0, 0, 2, 120, 1, 0, 0, 0, 2, 122, 1, 0, 0, 0, 2, 124, 1, 0, 0, 0, 2, 126, 1, 0, 0, 0, 2, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 2, 132, 1, 0, 0, 0, 2, 134, 1, 0, 0, 0, 2, 136, 1, 0, 0, 0, 2, 138, 1, 0, 0, 0, 2, 140, 1, 0, 0, 0, 2, 142, 1, 0, 0, 0, 2, 144, 1, 0, 0, 0, 2, 146, 1, 0, 0, 0, 2, 148, 1, 0, 0, 0, 2, 150, 1, 0, 0, 0, 2, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 2, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 2, 160, 1, 0, 0, 0, 2, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 2, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 2, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 2, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 2, 188, 1, 0, 0, 0, 2, 190, 1, 0, 0, 0, 2, 192, 1, 0, 0, 0, 3, 194, 1, 0, 0, 0, 3, 196, 1, 0, 0, 0, 3, 198, 1, 0, 0, 0, 3, 200, 1, 0, 0, 0, 3, 202, 1, 0, 0, 0, 3, 204, 1, 0, 0, 0, 3, 206, 1, 0, 0, 0, 3, 208, 1, 0, 0, 0, 3, 210, 1, 0, 0, 0, 3, 212, 1, 0, 0, 0, 3, 214, 1, 0, 0, 0, 3, 216, 1, 0, 0, 0, 4, 218, 1, 0, 0, 0, 4, 220, 1, 0, 0, 0, 4, 222, 1, 0, 0, 0, 4, 228, 1, 0, 0, 0, 4, 230, 1, 0, 0, 0, 4, 232, 1, 0, 0, 0, 4, 234, 1, 0, 0, 0, 5, 236, 1, 0, 0, 0, 5, 238, 1, 0, 0, 0, 5, 240, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 5, 244, 1, 0, 0, 0, 5, 246, 1, 0, 0, 0, 5, 248, 1, 0, 0, 0, 5, 250, 1, 0, 0, 0, 5, 252, 1, 0, 0, 0, 6, 254, 1, 0, 0, 0, 6, 256, 1, 0, 0, 0, 6, 258, 1, 0, 0, 0, 6, 260, 1, 0, 0, 0, 6, 264, 1, 0, 0, 0, 6, 266, 1, 0, 0, 0, 6, 268, 1, 0, 0, 0, 6, 270, 1, 0, 0, 0, 6, 272, 1, 0, 0, 0, 7, 274, 1, 0, 0, 0, 7, 276, 1, 0, 0, 0, 7, 278, 1, 0, 0, 0, 7, 280, 1, 0, 0, 0, 7, 282, 1, 0, 0, 0, 7, 284, 1, 0, 0, 0, 7, 286, 1, 0, 0, 0, 7, 288, 1, 0, 0, 0, 7, 290, 1, 0, 0, 0, 7, 292, 1, 0, 0, 0, 8, 294, 1, 0, 0, 0, 8, 296, 1, 0, 0, 0, 8, 298, 1, 0, 0, 0, 8, 300, 1, 0, 0, 0, 8, 302, 1, 0, 0, 0, 8, 304, 1, 0, 0, 0, 8, 306, 1, 0, 0, 0, 8, 308, 1, 0, 0, 0, 8, 310, 1, 0, 0, 0, 8, 312, 1, 0, 0, 0, 9, 314, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 9, 320, 1, 0, 0, 0, 9, 322, 1, 0, 0, 0, 9, 324, 1, 0, 0, 0, 9, 326, 1, 0, 0, 0, 10, 328, 1, 0, 0, 0, 10, 330, 1, 0, 0, 0, 10, 332, 1, 0, 0, 0, 10, 334, 1, 0, 0, 0, 10, 336, 1, 0, 0, 0, 10, 338, 1, 0, 0, 0, 10, 340, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 11, 346, 1, 0, 0, 0, 11, 348, 1, 0, 0, 0, 11, 350, 1, 0, 0, 0, 12, 352, 1, 0, 0, 0, 12, 354, 1, 0, 0, 0, 12, 356, 1, 0, 0, 0, 12, 358, 1, 0, 0, 0, 12, 360, 1, 0, 0, 0, 13, 362, 1, 0, 0, 0, 13, 364, 1, 0, 0, 0, 13, 366, 1, 0, 0, 0, 13, 368, 1, 0, 0, 0, 13, 370, 1, 0, 0, 0, 13, 372, 1, 0, 0, 0, 14, 374, 1, 0, 0, 0, 14, 376, 1, 0, 0, 0, 14, 378, 1, 0, 0, 0, 14, 380, 1, 0, 0, 0, 14, 382, 1, 0, 0, 0, 14, 384, 1, 0, 0, 0, 15, 386, 1, 0, 0, 0, 15, 388, 1, 0, 0, 0, 15, 390, 1, 0, 0, 0, 15, 392, 1, 0, 0, 0, 15, 394, 1, 0, 0, 0, 15, 396, 1, 0, 0, 0, 15, 398, 1, 0, 0, 0, 15, 400, 1, 0, 0, 0, 15, 402, 1, 0, 0, 0, 16, 404, 1, 0, 0, 0, 18, 414, 1, 0, 0, 0, 20, 421, 1, 0, 0, 0, 22, 430, 1, 0, 0, 0, 24, 437, 1, 0, 0, 0, 26, 447, 1, 0, 0, 0, 28, 454, 1, 0, 0, 0, 30, 461, 1, 0, 0, 0, 32, 475, 1, 0, 0, 0, 34, 482, 1, 0, 0, 0, 36, 490, 1, 0, 0, 0, 38, 499, 1, 0, 0, 0, 40, 506, 1, 0, 0, 0, 42, 516, 1, 0, 0, 0, 44, 528, 1, 0, 0, 0, 46, 537, 1, 0, 0, 0, 48, 543, 1, 0, 0, 0, 50, 550, 1, 0, 0, 0, 52, 557, 1, 0, 0, 0, 54, 565, 1, 0, 0, 0, 56, 574, 1, 0, 0, 0, 58, 580, 1, 0, 0, 0, 60, 597, 1, 0, 0, 0, 62, 613, 1, 0, 0, 0, 64, 622, 1, 0, 0, 0, 66, 625, 1, 0, 0, 0, 68, 629, 1, 0, 0, 0, 70, 634, 1, 0, 0, 0, 72, 639, 1, 0, 0, 0, 74, 643, 1, 0, 0, 0, 76, 647, 1, 0, 0, 0, 78, 651, 1, 0, 0, 0, 80, 655, 1, 0, 0, 0, 82, 657, 1, 0, 0, 0, 84, 659, 1, 0, 0, 0, 86, 662, 1, 0, 0, 0, 88, 664, 1, 0, 0, 0, 90, 673, 1, 0, 0, 0, 92, 675, 1, 0, 0, 0, 94, 680, 1, 0, 0, 0, 96, 682, 1, 0, 0, 0, 98, 687, 1, 0, 0, 0, 100, 718, 1, 0, 0, 0, 102, 721, 1, 0, 0, 0, 104, 767, 1, 0, 0, 0, 106, 769, 1, 0, 0, 0, 108, 772, 1, 0, 0, 0, 110, 776, 1, 0, 0, 0, 112, 780, 1, 0, 0, 0, 114, 782, 1, 0, 0, 0, 116, 785, 1, 0, 0, 0, 118, 787, 1, 0, 0, 0, 120, 792, 1, 0, 0, 0, 122, 794, 1, 0, 0, 0, 124, 800, 1, 0, 0, 0, 126, 806, 1, 0, 0, 0, 128, 811, 1, 0, 0, 0, 130, 813, 1, 0, 0, 0, 132, 816, 1, 0, 0, 0, 134, 819, 1, 0, 0, 0, 136, 824, 1, 0, 0, 0, 138, 828, 1, 0, 0, 0, 140, 833, 1, 0, 0, 0, 142, 839, 1, 0, 0, 0, 144, 842, 1, 0, 0, 0, 146, 844, 1, 0, 0, 0, 148, 850, 1, 0, 0, 0, 150, 852, 1, 0, 0, 0, 152, 857, 1, 0, 0, 0, 154, 860, 1, 0, 0, 0, 156, 863, 1, 0, 0, 0, 158, 866, 1, 0, 0, 0, 160, 868, 1, 0, 0, 0, 162, 871, 1, 0, 0, 0, 164, 873, 1, 0, 0, 0, 166, 876, 1, 0, 0, 0, 168, 878, 1, 0, 0, 0, 170, 880, 1, 0, 0, 0, 172, 882, 1, 0, 0, 0, 174, 884, 1, 0, 0, 0, 176, 900, 1, 0, 0, 0, 178, 902, 1, 0, 0, 0, 180, 907, 1, 0, 0, 0, 182, 928, 1, 0, 0, 0, 184, 930, 1, 0, 0, 0, 186, 938, 1, 0, 0, 0, 188, 940, 1, 0, 0, 0, 190, 944, 1, 0, 0, 0, 192, 948, 1, 0, 0, 0, 194, 952, 1, 0, 0, 0, 196, 957, 1, 0, 0, 0, 198, 961, 1, 0, 0, 0, 200, 965, 1, 0, 0, 0, 202, 969, 1, 0, 0, 0, 204, 973, 1, 0, 0, 0, 206, 977, 1, 0, 0, 0, 208, 986, 1, 0, 0, 0, 210, 990, 1, 0, 0, 0, 212, 994, 1, 0, 0, 0, 214, 998, 1, 0, 0, 0, 216, 1002, 1, 0, 0, 0, 218, 1006, 1, 0, 0, 0, 220, 1011, 1, 0, 0, 0, 222, 1015, 1, 0, 0, 0, 224, 1023, 1, 0, 0, 0, 226, 1044, 1, 0, 0, 0, 228, 1048, 1, 0, 0, 0, 230, 1052, 1, 0, 0, 0, 232, 1056, 1, 0, 0, 0, 234, 1060, 1, 0, 0, 0, 236, 1064, 1, 0, 0, 0, 238, 1069, 1, 0, 0, 0, 240, 1073, 1, 0, 0, 0, 242, 1077, 1, 0, 0, 0, 244, 1081, 1, 0, 0, 0, 246, 1084, 1, 0, 0, 0, 248, 1088, 1, 0, 0, 0, 250, 1092, 1, 0, 0, 0, 252, 1096, 1, 0, 0, 0, 254, 1100, 1, 0, 0, 0, 256, 1105, 1, 0, 0, 0, 258, 1110, 1, 0, 0, 0, 260, 1115, 1, 0, 0, 0, 262, 1122, 1, 0, 0, 0, 264, 1131, 1, 0, 0, 0, 266, 1138, 1, 0, 0, 0, 268, 1142, 1, 0, 0, 0, 270, 1146, 1, 0, 0, 0, 272, 1150, 1, 0, 0, 0, 274, 1154, 1, 0, 0, 0, 276, 1160, 1, 0, 0, 0, 278, 1164, 1, 0, 0, 0, 280, 1168, 1, 0, 0, 0, 282, 1172, 1, 0, 0, 0, 284, 1176, 1, 0, 0, 0, 286, 1180, 1, 0, 0, 0, 288, 1184, 1, 0, 0, 0, 290, 1188, 1, 0, 0, 0, 292, 1192, 1, 0, 0, 0, 294, 1196, 1, 0, 0, 0, 296, 1201, 1, 0, 0, 0, 298, 1205, 1, 0, 0, 0, 300, 1209, 1, 0, 0, 0, 302, 1213, 1, 0, 0, 0, 304, 1218, 1, 0, 0, 0, 306, 1222, 1, 0, 0, 0, 308, 1226, 1, 0, 0, 0, 310, 1230, 1, 0, 0, 0, 312, 1234, 1, 0, 0, 0, 314, 1238, 1, 0, 0, 0, 316, 1244, 1, 0, 0, 0, 318, 1248, 1, 0, 0, 0, 320, 1252, 1, 0, 0, 0, 322, 1256, 1, 0, 0, 0, 324, 1260, 1, 0, 0, 0, 326, 1264, 1, 0, 0, 0, 328, 1268, 1, 0, 0, 0, 330, 1273, 1, 0, 0, 0, 332, 1277, 1, 0, 0, 0, 334, 1281, 1, 0, 0, 0, 336, 1285, 1, 0, 0, 0, 338, 1289, 1, 0, 0, 0, 340, 1293, 1, 0, 0, 0, 342, 1297, 1, 0, 0, 0, 344, 1302, 1, 0, 0, 0, 346, 1307, 1, 0, 0, 0, 348, 1311, 1, 0, 0, 0, 350, 1315, 1, 0, 0, 0, 352, 1319, 1, 0, 0, 0, 354, 1324, 1, 0, 0, 0, 356, 1334, 1, 0, 0, 0, 358, 1338, 1, 0, 0, 0, 360, 1342, 1, 0, 0, 0, 362, 1346, 1, 0, 0, 0, 364, 1351, 1, 0, 0, 0, 366, 1358, 1, 0, 0, 0, 368, 1362, 1, 0, 0, 0, 370, 1366, 1, 0, 0, 0, 372, 1370, 1, 0, 0, 0, 374, 1374, 1, 0, 0, 0, 376, 1379, 1, 0, 0, 0, 378, 1385, 1, 0, 0, 0, 380, 1391, 1, 0, 0, 0, 382, 1395, 1, 0, 0, 0, 384, 1399, 1, 0, 0, 0, 386, 1403, 1, 0, 0, 0, 388, 1409, 1, 0, 0, 0, 390, 1415, 1, 0, 0, 0, 392, 1419, 1, 0, 0, 0, 394, 1423, 1, 0, 0, 0, 396, 1427, 1, 0, 0, 0, 398, 1433, 1, 0, 0, 0, 400, 1439, 1, 0, 0, 0, 402, 1445, 1, 0, 0, 0, 404, 405, 7, 0, 0, 0, 405, 406, 7, 1, 0, 0, 406, 407, 7, 2, 0, 0, 407, 408, 7, 2, 0, 0, 408, 409, 7, 3, 0, 0, 409, 410, 7, 4, 0, 0, 410, 411, 7, 5, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 6, 0, 0, 0, 413, 17, 1, 0, 0, 0, 414, 415, 7, 0, 0, 0, 415, 416, 7, 6, 0, 0, 416, 417, 7, 7, 0, 0, 417, 418, 7, 8, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 6, 1, 1, 0, 420, 19, 1, 0, 0, 0, 421, 422, 7, 3, 0, 0, 422, 423, 7, 9, 0, 0, 423, 424, 7, 6, 0, 0, 424, 425, 7, 1, 0, 0, 425, 426, 7, 4, 0, 0, 426, 427, 7, 10, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 6, 2, 2, 0, 429, 21, 1, 0, 0, 0, 430, 431, 7, 3, 0, 0, 431, 432, 7, 11, 0, 0, 432, 433, 7, 12, 0, 0, 433, 434, 7, 13, 0, 0, 434, 435, 1, 0, 0, 0, 435, 436, 6, 3, 0, 0, 436, 23, 1, 0, 0, 0, 437, 438, 7, 3, 0, 0, 438, 439, 7, 14, 0, 0, 439, 440, 7, 8, 0, 0, 440, 441, 7, 13, 0, 0, 441, 442, 7, 12, 0, 0, 442, 443, 7, 1, 0, 0, 443, 444, 7, 9, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 6, 4, 3, 0, 446, 25, 1, 0, 0, 0, 447, 448, 7, 15, 0, 0, 448, 449, 7, 6, 0, 0, 449, 450, 7, 7, 0, 0, 450, 451, 7, 16, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 6, 5, 4, 0, 453, 27, 1, 0, 0, 0, 454, 455, 7, 17, 0, 0, 455, 456, 7, 6, 0, 0, 456, 457, 7, 7, 0, 0, 457, 458, 7, 18, 0, 0, 458, 459, 1, 0, 0, 0, 459, 460, 6, 6, 0, 0, 460, 29, 1, 0, 0, 0, 461, 462, 7, 1, 0, 0, 462, 463, 7, 9, 0, 0, 463, 464, 7, 13, 0, 0, 464, 465, 7, 1, 0, 0, 465, 466, 7, 9, 0, 0, 466, 467, 7, 3, 0, 0, 467, 468, 7, 2, 0, 0, 468, 469, 7, 5, 0, 0, 469, 470, 7, 12, 0, 0, 470, 471, 7, 5, 0, 0, 471, 472, 7, 2, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 6, 7, 0, 0, 474, 31, 1, 0, 0, 0, 475, 476, 7, 18, 0, 0, 476, 477, 7, 3, 0, 0, 477, 478, 7, 3, 0, 0, 478, 479, 7, 8, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 6, 8, 1, 0, 481, 33, 1, 0, 0, 0, 482, 483, 7, 13, 0, 0, 483, 484, 7, 1, 0, 0, 484, 485, 7, 16, 0, 0, 485, 486, 7, 1, 0, 0, 486, 487, 7, 5, 0, 0, 487, 488, 1, 0, 0, 0, 488, 489, 6, 9, 0, 0, 489, 35, 1, 0, 0, 0, 490, 491, 7, 13, 0, 0, 491, 492, 7, 7, 0, 0, 492, 493, 7, 7, 0, 0, 493, 494, 7, 18, 0, 0, 494, 495, 7, 19, 0, 0, 495, 496, 7, 8, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 6, 10, 5, 0, 498, 37, 1, 0, 0, 0, 499, 500, 7, 16, 0, 0, 500, 501, 7, 3, 0, 0, 501, 502, 7, 5, 0, 0, 502, 503, 7, 12, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 6, 11, 6, 0, 505, 39, 1, 0, 0, 0, 506, 507, 7, 16, 0, 0, 507, 508, 7, 3, 0, 0, 508, 509, 7, 5, 0, 0, 509, 510, 7, 6, 0, 0, 510, 511, 7, 1, 0, 0, 511, 512, 7, 4, 0, 0, 512, 513, 7, 2, 0, 0, 513, 514, 1, 0, 0, 0, 514, 515, 6, 12, 7, 0, 515, 41, 1, 0, 0, 0, 516, 517, 7, 16, 0, 0, 517, 518, 7, 11, 0, 0, 518, 519, 5, 95, 0, 0, 519, 520, 7, 3, 0, 0, 520, 521, 7, 14, 0, 0, 521, 522, 7, 8, 0, 0, 522, 523, 7, 12, 0, 0, 523, 524, 7, 9, 0, 0, 524, 525, 7, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 527, 6, 13, 8, 0, 527, 43, 1, 0, 0, 0, 528, 529, 7, 6, 0, 0, 529, 530, 7, 3, 0, 0, 530, 531, 7, 9, 0, 0, 531, 532, 7, 12, 0, 0, 532, 533, 7, 16, 0, 0, 533, 534, 7, 3, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 6, 14, 9, 0, 536, 45, 1, 0, 0, 0, 537, 538, 7, 6, 0, 0, 538, 539, 7, 7, 0, 0, 539, 540, 7, 20, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 6, 15, 0, 0, 542, 47, 1, 0, 0, 0, 543, 544, 7, 2, 0, 0, 544, 545, 7, 10, 0, 0, 545, 546, 7, 7, 0, 0, 546, 547, 7, 20, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 6, 16, 10, 0, 549, 49, 1, 0, 0, 0, 550, 551, 7, 2, 0, 0, 551, 552, 7, 7, 0, 0, 552, 553, 7, 6, 0, 0, 553, 554, 7, 5, 0, 0, 554, 555, 1, 0, 0, 0, 555, 556, 6, 17, 0, 0, 556, 51, 1, 0, 0, 0, 557, 558, 7, 2, 0, 0, 558, 559, 7, 5, 0, 0, 559, 560, 7, 12, 0, 0, 560, 561, 7, 5, 0, 0, 561, 562, 7, 2, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 6, 18, 0, 0, 564, 53, 1, 0, 0, 0, 565, 566, 7, 20, 0, 0, 566, 567, 7, 10, 0, 0, 567, 568, 7, 3, 0, 0, 568, 569, 7, 6, 0, 0, 569, 570, 7, 3, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 6, 19, 0, 0, 572, 55, 1, 0, 0, 0, 573, 575, 8, 21, 0, 0, 574, 573, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 574, 1, 0, 0, 0, 576, 577, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 579, 6, 20, 0, 0, 579, 57, 1, 0, 0, 0, 580, 581, 5, 47, 0, 0, 581, 582, 5, 47, 0, 0, 582, 586, 1, 0, 0, 0, 583, 585, 8, 22, 0, 0, 584, 583, 1, 0, 0, 0, 585, 588, 1, 0, 0, 0, 586, 584, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 590, 1, 0, 0, 0, 588, 586, 1, 0, 0, 0, 589, 591, 5, 13, 0, 0, 590, 589, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 593, 1, 0, 0, 0, 592, 594, 5, 10, 0, 0, 593, 592, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 1, 0, 0, 0, 595, 596, 6, 21, 11, 0, 596, 59, 1, 0, 0, 0, 597, 598, 5, 47, 0, 0, 598, 599, 5, 42, 0, 0, 599, 604, 1, 0, 0, 0, 600, 603, 3, 60, 22, 0, 601, 603, 9, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 601, 1, 0, 0, 0, 603, 606, 1, 0, 0, 0, 604, 605, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 607, 1, 0, 0, 0, 606, 604, 1, 0, 0, 0, 607, 608, 5, 42, 0, 0, 608, 609, 5, 47, 0, 0, 609, 610, 1, 0, 0, 0, 610, 611, 6, 22, 11, 0, 611, 61, 1, 0, 0, 0, 612, 614, 7, 23, 0, 0, 613, 612, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 6, 23, 11, 0, 618, 63, 1, 0, 0, 0, 619, 623, 8, 24, 0, 0, 620, 621, 5, 47, 0, 0, 621, 623, 8, 25, 0, 0, 622, 619, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 623, 65, 1, 0, 0, 0, 624, 626, 3, 64, 24, 0, 625, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 625, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 67, 1, 0, 0, 0, 629, 630, 3, 178, 81, 0, 630, 631, 1, 0, 0, 0, 631, 632, 6, 26, 12, 0, 632, 633, 6, 26, 13, 0, 633, 69, 1, 0, 0, 0, 634, 635, 3, 78, 31, 0, 635, 636, 1, 0, 0, 0, 636, 637, 6, 27, 14, 0, 637, 638, 6, 27, 15, 0, 638, 71, 1, 0, 0, 0, 639, 640, 3, 62, 23, 0, 640, 641, 1, 0, 0, 0, 641, 642, 6, 28, 11, 0, 642, 73, 1, 0, 0, 0, 643, 644, 3, 58, 21, 0, 644, 645, 1, 0, 0, 0, 645, 646, 6, 29, 11, 0, 646, 75, 1, 0, 0, 0, 647, 648, 3, 60, 22, 0, 648, 649, 1, 0, 0, 0, 649, 650, 6, 30, 11, 0, 650, 77, 1, 0, 0, 0, 651, 652, 5, 124, 0, 0, 652, 653, 1, 0, 0, 0, 653, 654, 6, 31, 15, 0, 654, 79, 1, 0, 0, 0, 655, 656, 7, 26, 0, 0, 656, 81, 1, 0, 0, 0, 657, 658, 7, 27, 0, 0, 658, 83, 1, 0, 0, 0, 659, 660, 5, 92, 0, 0, 660, 661, 7, 28, 0, 0, 661, 85, 1, 0, 0, 0, 662, 663, 8, 29, 0, 0, 663, 87, 1, 0, 0, 0, 664, 666, 7, 3, 0, 0, 665, 667, 7, 30, 0, 0, 666, 665, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 670, 3, 80, 32, 0, 669, 668, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 89, 1, 0, 0, 0, 673, 674, 5, 64, 0, 0, 674, 91, 1, 0, 0, 0, 675, 676, 5, 96, 0, 0, 676, 93, 1, 0, 0, 0, 677, 681, 8, 31, 0, 0, 678, 679, 5, 96, 0, 0, 679, 681, 5, 96, 0, 0, 680, 677, 1, 0, 0, 0, 680, 678, 1, 0, 0, 0, 681, 95, 1, 0, 0, 0, 682, 683, 5, 95, 0, 0, 683, 97, 1, 0, 0, 0, 684, 688, 3, 82, 33, 0, 685, 688, 3, 80, 32, 0, 686, 688, 3, 96, 40, 0, 687, 684, 1, 0, 0, 0, 687, 685, 1, 0, 0, 0, 687, 686, 1, 0, 0, 0, 688, 99, 1, 0, 0, 0, 689, 694, 5, 34, 0, 0, 690, 693, 3, 84, 34, 0, 691, 693, 3, 86, 35, 0, 692, 690, 1, 0, 0, 0, 692, 691, 1, 0, 0, 0, 693, 696, 1, 0, 0, 0, 694, 692, 1, 0, 0, 0, 694, 695, 1, 0, 0, 0, 695, 697, 1, 0, 0, 0, 696, 694, 1, 0, 0, 0, 697, 719, 5, 34, 0, 0, 698, 699, 5, 34, 0, 0, 699, 700, 5, 34, 0, 0, 700, 701, 5, 34, 0, 0, 701, 705, 1, 0, 0, 0, 702, 704, 8, 22, 0, 0, 703, 702, 1, 0, 0, 0, 704, 707, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 705, 703, 1, 0, 0, 0, 706, 708, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 708, 709, 5, 34, 0, 0, 709, 710, 5, 34, 0, 0, 710, 711, 5, 34, 0, 0, 711, 713, 1, 0, 0, 0, 712, 714, 5, 34, 0, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 716, 1, 0, 0, 0, 715, 717, 5, 34, 0, 0, 716, 715, 1, 0, 0, 0, 716, 717, 1, 0, 0, 0, 717, 719, 1, 0, 0, 0, 718, 689, 1, 0, 0, 0, 718, 698, 1, 0, 0, 0, 719, 101, 1, 0, 0, 0, 720, 722, 3, 80, 32, 0, 721, 720, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 103, 1, 0, 0, 0, 725, 727, 3, 80, 32, 0, 726, 725, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 734, 3, 120, 52, 0, 731, 733, 3, 80, 32, 0, 732, 731, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 768, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 739, 3, 120, 52, 0, 738, 740, 3, 80, 32, 0, 739, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 768, 1, 0, 0, 0, 743, 745, 3, 80, 32, 0, 744, 743, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 744, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 755, 1, 0, 0, 0, 748, 752, 3, 120, 52, 0, 749, 751, 3, 80, 32, 0, 750, 749, 1, 0, 0, 0, 751, 754, 1, 0, 0, 0, 752, 750, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 755, 748, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 757, 758, 3, 88, 36, 0, 758, 768, 1, 0, 0, 0, 759, 761, 3, 120, 52, 0, 760, 762, 3, 80, 32, 0, 761, 760, 1, 0, 0, 0, 762, 763, 1, 0, 0, 0, 763, 761, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 3, 88, 36, 0, 766, 768, 1, 0, 0, 0, 767, 726, 1, 0, 0, 0, 767, 737, 1, 0, 0, 0, 767, 744, 1, 0, 0, 0, 767, 759, 1, 0, 0, 0, 768, 105, 1, 0, 0, 0, 769, 770, 7, 32, 0, 0, 770, 771, 7, 33, 0, 0, 771, 107, 1, 0, 0, 0, 772, 773, 7, 12, 0, 0, 773, 774, 7, 9, 0, 0, 774, 775, 7, 0, 0, 0, 775, 109, 1, 0, 0, 0, 776, 777, 7, 12, 0, 0, 777, 778, 7, 2, 0, 0, 778, 779, 7, 4, 0, 0, 779, 111, 1, 0, 0, 0, 780, 781, 5, 61, 0, 0, 781, 113, 1, 0, 0, 0, 782, 783, 5, 58, 0, 0, 783, 784, 5, 58, 0, 0, 784, 115, 1, 0, 0, 0, 785, 786, 5, 44, 0, 0, 786, 117, 1, 0, 0, 0, 787, 788, 7, 0, 0, 0, 788, 789, 7, 3, 0, 0, 789, 790, 7, 2, 0, 0, 790, 791, 7, 4, 0, 0, 791, 119, 1, 0, 0, 0, 792, 793, 5, 46, 0, 0, 793, 121, 1, 0, 0, 0, 794, 795, 7, 15, 0, 0, 795, 796, 7, 12, 0, 0, 796, 797, 7, 13, 0, 0, 797, 798, 7, 2, 0, 0, 798, 799, 7, 3, 0, 0, 799, 123, 1, 0, 0, 0, 800, 801, 7, 15, 0, 0, 801, 802, 7, 1, 0, 0, 802, 803, 7, 6, 0, 0, 803, 804, 7, 2, 0, 0, 804, 805, 7, 5, 0, 0, 805, 125, 1, 0, 0, 0, 806, 807, 7, 13, 0, 0, 807, 808, 7, 12, 0, 0, 808, 809, 7, 2, 0, 0, 809, 810, 7, 5, 0, 0, 810, 127, 1, 0, 0, 0, 811, 812, 5, 40, 0, 0, 812, 129, 1, 0, 0, 0, 813, 814, 7, 1, 0, 0, 814, 815, 7, 9, 0, 0, 815, 131, 1, 0, 0, 0, 816, 817, 7, 1, 0, 0, 817, 818, 7, 2, 0, 0, 818, 133, 1, 0, 0, 0, 819, 820, 7, 13, 0, 0, 820, 821, 7, 1, 0, 0, 821, 822, 7, 18, 0, 0, 822, 823, 7, 3, 0, 0, 823, 135, 1, 0, 0, 0, 824, 825, 7, 9, 0, 0, 825, 826, 7, 7, 0, 0, 826, 827, 7, 5, 0, 0, 827, 137, 1, 0, 0, 0, 828, 829, 7, 9, 0, 0, 829, 830, 7, 19, 0, 0, 830, 831, 7, 13, 0, 0, 831, 832, 7, 13, 0, 0, 832, 139, 1, 0, 0, 0, 833, 834, 7, 9, 0, 0, 834, 835, 7, 19, 0, 0, 835, 836, 7, 13, 0, 0, 836, 837, 7, 13, 0, 0, 837, 838, 7, 2, 0, 0, 838, 141, 1, 0, 0, 0, 839, 840, 7, 7, 0, 0, 840, 841, 7, 6, 0, 0, 841, 143, 1, 0, 0, 0, 842, 843, 5, 63, 0, 0, 843, 145, 1, 0, 0, 0, 844, 845, 7, 6, 0, 0, 845, 846, 7, 13, 0, 0, 846, 847, 7, 1, 0, 0, 847, 848, 7, 18, 0, 0, 848, 849, 7, 3, 0, 0, 849, 147, 1, 0, 0, 0, 850, 851, 5, 41, 0, 0, 851, 149, 1, 0, 0, 0, 852, 853, 7, 5, 0, 0, 853, 854, 7, 6, 0, 0, 854, 855, 7, 19, 0, 0, 855, 856, 7, 3, 0, 0, 856, 151, 1, 0, 0, 0, 857, 858, 5, 61, 0, 0, 858, 859, 5, 61, 0, 0, 859, 153, 1, 0, 0, 0, 860, 861, 5, 61, 0, 0, 861, 862, 5, 126, 0, 0, 862, 155, 1, 0, 0, 0, 863, 864, 5, 33, 0, 0, 864, 865, 5, 61, 0, 0, 865, 157, 1, 0, 0, 0, 866, 867, 5, 60, 0, 0, 867, 159, 1, 0, 0, 0, 868, 869, 5, 60, 0, 0, 869, 870, 5, 61, 0, 0, 870, 161, 1, 0, 0, 0, 871, 872, 5, 62, 0, 0, 872, 163, 1, 0, 0, 0, 873, 874, 5, 62, 0, 0, 874, 875, 5, 61, 0, 0, 875, 165, 1, 0, 0, 0, 876, 877, 5, 43, 0, 0, 877, 167, 1, 0, 0, 0, 878, 879, 5, 45, 0, 0, 879, 169, 1, 0, 0, 0, 880, 881, 5, 42, 0, 0, 881, 171, 1, 0, 0, 0, 882, 883, 5, 47, 0, 0, 883, 173, 1, 0, 0, 0, 884, 885, 5, 37, 0, 0, 885, 175, 1, 0, 0, 0, 886, 887, 3, 144, 64, 0, 887, 891, 3, 82, 33, 0, 888, 890, 3, 98, 41, 0, 889, 888, 1, 0, 0, 0, 890, 893, 1, 0, 0, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 901, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 894, 896, 3, 144, 64, 0, 895, 897, 3, 80, 32, 0, 896, 895, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 886, 1, 0, 0, 0, 900, 894, 1, 0, 0, 0, 901, 177, 1, 0, 0, 0, 902, 903, 5, 91, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 6, 81, 0, 0, 905, 906, 6, 81, 0, 0, 906, 179, 1, 0, 0, 0, 907, 908, 5, 93, 0, 0, 908, 909, 1, 0, 0, 0, 909, 910, 6, 82, 15, 0, 910, 911, 6, 82, 15, 0, 911, 181, 1, 0, 0, 0, 912, 916, 3, 82, 33, 0, 913, 915, 3, 98, 41, 0, 914, 913, 1, 0, 0, 0, 915, 918, 1, 0, 0, 0, 916, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 929, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 919, 922, 3, 96, 40, 0, 920, 922, 3, 90, 37, 0, 921, 919, 1, 0, 0, 0, 921, 920, 1, 0, 0, 0, 922, 924, 1, 0, 0, 0, 923, 925, 3, 98, 41, 0, 924, 923, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 912, 1, 0, 0, 0, 928, 921, 1, 0, 0, 0, 929, 183, 1, 0, 0, 0, 930, 932, 3, 92, 38, 0, 931, 933, 3, 94, 39, 0, 932, 931, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 932, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 936, 1, 0, 0, 0, 936, 937, 3, 92, 38, 0, 937, 185, 1, 0, 0, 0, 938, 939, 3, 184, 84, 0, 939, 187, 1, 0, 0, 0, 940, 941, 3, 58, 21, 0, 941, 942, 1, 0, 0, 0, 942, 943, 6, 86, 11, 0, 943, 189, 1, 0, 0, 0, 944, 945, 3, 60, 22, 0, 945, 946, 1, 0, 0, 0, 946, 947, 6, 87, 11, 0, 947, 191, 1, 0, 0, 0, 948, 949, 3, 62, 23, 0, 949, 950, 1, 0, 0, 0, 950, 951, 6, 88, 11, 0, 951, 193, 1, 0, 0, 0, 952, 953, 3, 78, 31, 0, 953, 954, 1, 0, 0, 0, 954, 955, 6, 89, 14, 0, 955, 956, 6, 89, 15, 0, 956, 195, 1, 0, 0, 0, 957, 958, 3, 178, 81, 0, 958, 959, 1, 0, 0, 0, 959, 960, 6, 90, 12, 0, 960, 197, 1, 0, 0, 0, 961, 962, 3, 180, 82, 0, 962, 963, 1, 0, 0, 0, 963, 964, 6, 91, 16, 0, 964, 199, 1, 0, 0, 0, 965, 966, 3, 364, 174, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 92, 17, 0, 968, 201, 1, 0, 0, 0, 969, 970, 3, 116, 50, 0, 970, 971, 1, 0, 0, 0, 971, 972, 6, 93, 18, 0, 972, 203, 1, 0, 0, 0, 973, 974, 3, 112, 48, 0, 974, 975, 1, 0, 0, 0, 975, 976, 6, 94, 19, 0, 976, 205, 1, 0, 0, 0, 977, 978, 7, 16, 0, 0, 978, 979, 7, 3, 0, 0, 979, 980, 7, 5, 0, 0, 980, 981, 7, 12, 0, 0, 981, 982, 7, 0, 0, 0, 982, 983, 7, 12, 0, 0, 983, 984, 7, 5, 0, 0, 984, 985, 7, 12, 0, 0, 985, 207, 1, 0, 0, 0, 986, 987, 3, 66, 25, 0, 987, 988, 1, 0, 0, 0, 988, 989, 6, 96, 20, 0, 989, 209, 1, 0, 0, 0, 990, 991, 3, 100, 42, 0, 991, 992, 1, 0, 0, 0, 992, 993, 6, 97, 21, 0, 993, 211, 1, 0, 0, 0, 994, 995, 3, 58, 21, 0, 995, 996, 1, 0, 0, 0, 996, 997, 6, 98, 11, 0, 997, 213, 1, 0, 0, 0, 998, 999, 3, 60, 22, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 6, 99, 11, 0, 1001, 215, 1, 0, 0, 0, 1002, 1003, 3, 62, 23, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 6, 100, 11, 0, 1005, 217, 1, 0, 0, 0, 1006, 1007, 3, 78, 31, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 6, 101, 14, 0, 1009, 1010, 6, 101, 15, 0, 1010, 219, 1, 0, 0, 0, 1011, 1012, 3, 120, 52, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1014, 6, 102, 22, 0, 1014, 221, 1, 0, 0, 0, 1015, 1016, 3, 116, 50, 0, 1016, 1017, 1, 0, 0, 0, 1017, 1018, 6, 103, 18, 0, 1018, 223, 1, 0, 0, 0, 1019, 1024, 3, 82, 33, 0, 1020, 1024, 3, 80, 32, 0, 1021, 1024, 3, 96, 40, 0, 1022, 1024, 3, 170, 77, 0, 1023, 1019, 1, 0, 0, 0, 1023, 1020, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 225, 1, 0, 0, 0, 1025, 1028, 3, 82, 33, 0, 1026, 1028, 3, 170, 77, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1026, 1, 0, 0, 0, 1028, 1032, 1, 0, 0, 0, 1029, 1031, 3, 224, 104, 0, 1030, 1029, 1, 0, 0, 0, 1031, 1034, 1, 0, 0, 0, 1032, 1030, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1045, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1035, 1038, 3, 96, 40, 0, 1036, 1038, 3, 90, 37, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 1040, 1, 0, 0, 0, 1039, 1041, 3, 224, 104, 0, 1040, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1045, 1, 0, 0, 0, 1044, 1027, 1, 0, 0, 0, 1044, 1037, 1, 0, 0, 0, 1045, 227, 1, 0, 0, 0, 1046, 1049, 3, 226, 105, 0, 1047, 1049, 3, 184, 84, 0, 1048, 1046, 1, 0, 0, 0, 1048, 1047, 1, 0, 0, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 229, 1, 0, 0, 0, 1052, 1053, 3, 58, 21, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 6, 107, 11, 0, 1055, 231, 1, 0, 0, 0, 1056, 1057, 3, 60, 22, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 6, 108, 11, 0, 1059, 233, 1, 0, 0, 0, 1060, 1061, 3, 62, 23, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1063, 6, 109, 11, 0, 1063, 235, 1, 0, 0, 0, 1064, 1065, 3, 78, 31, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 6, 110, 14, 0, 1067, 1068, 6, 110, 15, 0, 1068, 237, 1, 0, 0, 0, 1069, 1070, 3, 112, 48, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1072, 6, 111, 19, 0, 1072, 239, 1, 0, 0, 0, 1073, 1074, 3, 116, 50, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1076, 6, 112, 18, 0, 1076, 241, 1, 0, 0, 0, 1077, 1078, 3, 120, 52, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 6, 113, 22, 0, 1080, 243, 1, 0, 0, 0, 1081, 1082, 7, 12, 0, 0, 1082, 1083, 7, 2, 0, 0, 1083, 245, 1, 0, 0, 0, 1084, 1085, 3, 228, 106, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1087, 6, 115, 23, 0, 1087, 247, 1, 0, 0, 0, 1088, 1089, 3, 58, 21, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 6, 116, 11, 0, 1091, 249, 1, 0, 0, 0, 1092, 1093, 3, 60, 22, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 6, 117, 11, 0, 1095, 251, 1, 0, 0, 0, 1096, 1097, 3, 62, 23, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 6, 118, 11, 0, 1099, 253, 1, 0, 0, 0, 1100, 1101, 3, 78, 31, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1103, 6, 119, 14, 0, 1103, 1104, 6, 119, 15, 0, 1104, 255, 1, 0, 0, 0, 1105, 1106, 3, 178, 81, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 6, 120, 12, 0, 1108, 1109, 6, 120, 24, 0, 1109, 257, 1, 0, 0, 0, 1110, 1111, 7, 7, 0, 0, 1111, 1112, 7, 9, 0, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 6, 121, 25, 0, 1114, 259, 1, 0, 0, 0, 1115, 1116, 7, 20, 0, 0, 1116, 1117, 7, 1, 0, 0, 1117, 1118, 7, 5, 0, 0, 1118, 1119, 7, 10, 0, 0, 1119, 1120, 1, 0, 0, 0, 1120, 1121, 6, 122, 25, 0, 1121, 261, 1, 0, 0, 0, 1122, 1123, 8, 34, 0, 0, 1123, 263, 1, 0, 0, 0, 1124, 1126, 3, 262, 123, 0, 1125, 1124, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 3, 364, 174, 0, 1130, 1132, 1, 0, 0, 0, 1131, 1125, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1134, 1, 0, 0, 0, 1133, 1135, 3, 262, 123, 0, 1134, 1133, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1134, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 265, 1, 0, 0, 0, 1138, 1139, 3, 264, 124, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1141, 6, 125, 26, 0, 1141, 267, 1, 0, 0, 0, 1142, 1143, 3, 58, 21, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 6, 126, 11, 0, 1145, 269, 1, 0, 0, 0, 1146, 1147, 3, 60, 22, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1149, 6, 127, 11, 0, 1149, 271, 1, 0, 0, 0, 1150, 1151, 3, 62, 23, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 6, 128, 11, 0, 1153, 273, 1, 0, 0, 0, 1154, 1155, 3, 78, 31, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 6, 129, 14, 0, 1157, 1158, 6, 129, 15, 0, 1158, 1159, 6, 129, 15, 0, 1159, 275, 1, 0, 0, 0, 1160, 1161, 3, 112, 48, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1163, 6, 130, 19, 0, 1163, 277, 1, 0, 0, 0, 1164, 1165, 3, 116, 50, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 6, 131, 18, 0, 1167, 279, 1, 0, 0, 0, 1168, 1169, 3, 120, 52, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 6, 132, 22, 0, 1171, 281, 1, 0, 0, 0, 1172, 1173, 3, 260, 122, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 6, 133, 27, 0, 1175, 283, 1, 0, 0, 0, 1176, 1177, 3, 228, 106, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 6, 134, 23, 0, 1179, 285, 1, 0, 0, 0, 1180, 1181, 3, 186, 85, 0, 1181, 1182, 1, 0, 0, 0, 1182, 1183, 6, 135, 28, 0, 1183, 287, 1, 0, 0, 0, 1184, 1185, 3, 58, 21, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 6, 136, 11, 0, 1187, 289, 1, 0, 0, 0, 1188, 1189, 3, 60, 22, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 6, 137, 11, 0, 1191, 291, 1, 0, 0, 0, 1192, 1193, 3, 62, 23, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 6, 138, 11, 0, 1195, 293, 1, 0, 0, 0, 1196, 1197, 3, 78, 31, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 6, 139, 14, 0, 1199, 1200, 6, 139, 15, 0, 1200, 295, 1, 0, 0, 0, 1201, 1202, 3, 364, 174, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 6, 140, 17, 0, 1204, 297, 1, 0, 0, 0, 1205, 1206, 3, 116, 50, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 6, 141, 18, 0, 1208, 299, 1, 0, 0, 0, 1209, 1210, 3, 120, 52, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 6, 142, 22, 0, 1212, 301, 1, 0, 0, 0, 1213, 1214, 3, 258, 121, 0, 1214, 1215, 1, 0, 0, 0, 1215, 1216, 6, 143, 29, 0, 1216, 1217, 6, 143, 30, 0, 1217, 303, 1, 0, 0, 0, 1218, 1219, 3, 66, 25, 0, 1219, 1220, 1, 0, 0, 0, 1220, 1221, 6, 144, 20, 0, 1221, 305, 1, 0, 0, 0, 1222, 1223, 3, 100, 42, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1225, 6, 145, 21, 0, 1225, 307, 1, 0, 0, 0, 1226, 1227, 3, 58, 21, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1229, 6, 146, 11, 0, 1229, 309, 1, 0, 0, 0, 1230, 1231, 3, 60, 22, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1233, 6, 147, 11, 0, 1233, 311, 1, 0, 0, 0, 1234, 1235, 3, 62, 23, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 6, 148, 11, 0, 1237, 313, 1, 0, 0, 0, 1238, 1239, 3, 78, 31, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 6, 149, 14, 0, 1241, 1242, 6, 149, 15, 0, 1242, 1243, 6, 149, 15, 0, 1243, 315, 1, 0, 0, 0, 1244, 1245, 3, 116, 50, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 6, 150, 18, 0, 1247, 317, 1, 0, 0, 0, 1248, 1249, 3, 120, 52, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 6, 151, 22, 0, 1251, 319, 1, 0, 0, 0, 1252, 1253, 3, 228, 106, 0, 1253, 1254, 1, 0, 0, 0, 1254, 1255, 6, 152, 23, 0, 1255, 321, 1, 0, 0, 0, 1256, 1257, 3, 58, 21, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1259, 6, 153, 11, 0, 1259, 323, 1, 0, 0, 0, 1260, 1261, 3, 60, 22, 0, 1261, 1262, 1, 0, 0, 0, 1262, 1263, 6, 154, 11, 0, 1263, 325, 1, 0, 0, 0, 1264, 1265, 3, 62, 23, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 6, 155, 11, 0, 1267, 327, 1, 0, 0, 0, 1268, 1269, 3, 78, 31, 0, 1269, 1270, 1, 0, 0, 0, 1270, 1271, 6, 156, 14, 0, 1271, 1272, 6, 156, 15, 0, 1272, 329, 1, 0, 0, 0, 1273, 1274, 3, 120, 52, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 6, 157, 22, 0, 1276, 331, 1, 0, 0, 0, 1277, 1278, 3, 186, 85, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1280, 6, 158, 28, 0, 1280, 333, 1, 0, 0, 0, 1281, 1282, 3, 182, 83, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 159, 31, 0, 1284, 335, 1, 0, 0, 0, 1285, 1286, 3, 58, 21, 0, 1286, 1287, 1, 0, 0, 0, 1287, 1288, 6, 160, 11, 0, 1288, 337, 1, 0, 0, 0, 1289, 1290, 3, 60, 22, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1292, 6, 161, 11, 0, 1292, 339, 1, 0, 0, 0, 1293, 1294, 3, 62, 23, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1296, 6, 162, 11, 0, 1296, 341, 1, 0, 0, 0, 1297, 1298, 3, 78, 31, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1300, 6, 163, 14, 0, 1300, 1301, 6, 163, 15, 0, 1301, 343, 1, 0, 0, 0, 1302, 1303, 7, 1, 0, 0, 1303, 1304, 7, 9, 0, 0, 1304, 1305, 7, 15, 0, 0, 1305, 1306, 7, 7, 0, 0, 1306, 345, 1, 0, 0, 0, 1307, 1308, 3, 58, 21, 0, 1308, 1309, 1, 0, 0, 0, 1309, 1310, 6, 165, 11, 0, 1310, 347, 1, 0, 0, 0, 1311, 1312, 3, 60, 22, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1314, 6, 166, 11, 0, 1314, 349, 1, 0, 0, 0, 1315, 1316, 3, 62, 23, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1318, 6, 167, 11, 0, 1318, 351, 1, 0, 0, 0, 1319, 1320, 3, 78, 31, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 6, 168, 14, 0, 1322, 1323, 6, 168, 15, 0, 1323, 353, 1, 0, 0, 0, 1324, 1325, 7, 15, 0, 0, 1325, 1326, 7, 19, 0, 0, 1326, 1327, 7, 9, 0, 0, 1327, 1328, 7, 4, 0, 0, 1328, 1329, 7, 5, 0, 0, 1329, 1330, 7, 1, 0, 0, 1330, 1331, 7, 7, 0, 0, 1331, 1332, 7, 9, 0, 0, 1332, 1333, 7, 2, 0, 0, 1333, 355, 1, 0, 0, 0, 1334, 1335, 3, 58, 21, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 6, 170, 11, 0, 1337, 357, 1, 0, 0, 0, 1338, 1339, 3, 60, 22, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 6, 171, 11, 0, 1341, 359, 1, 0, 0, 0, 1342, 1343, 3, 62, 23, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1345, 6, 172, 11, 0, 1345, 361, 1, 0, 0, 0, 1346, 1347, 3, 180, 82, 0, 1347, 1348, 1, 0, 0, 0, 1348, 1349, 6, 173, 16, 0, 1349, 1350, 6, 173, 15, 0, 1350, 363, 1, 0, 0, 0, 1351, 1352, 5, 58, 0, 0, 1352, 365, 1, 0, 0, 0, 1353, 1359, 3, 90, 37, 0, 1354, 1359, 3, 80, 32, 0, 1355, 1359, 3, 120, 52, 0, 1356, 1359, 3, 82, 33, 0, 1357, 1359, 3, 96, 40, 0, 1358, 1353, 1, 0, 0, 0, 1358, 1354, 1, 0, 0, 0, 1358, 1355, 1, 0, 0, 0, 1358, 1356, 1, 0, 0, 0, 1358, 1357, 1, 0, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1358, 1, 0, 0, 0, 1360, 1361, 1, 0, 0, 0, 1361, 367, 1, 0, 0, 0, 1362, 1363, 3, 58, 21, 0, 1363, 1364, 1, 0, 0, 0, 1364, 1365, 6, 176, 11, 0, 1365, 369, 1, 0, 0, 0, 1366, 1367, 3, 60, 22, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1369, 6, 177, 11, 0, 1369, 371, 1, 0, 0, 0, 1370, 1371, 3, 62, 23, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 6, 178, 11, 0, 1373, 373, 1, 0, 0, 0, 1374, 1375, 3, 78, 31, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 179, 14, 0, 1377, 1378, 6, 179, 15, 0, 1378, 375, 1, 0, 0, 0, 1379, 1380, 3, 66, 25, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 180, 20, 0, 1382, 1383, 6, 180, 15, 0, 1383, 1384, 6, 180, 32, 0, 1384, 377, 1, 0, 0, 0, 1385, 1386, 3, 100, 42, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1388, 6, 181, 21, 0, 1388, 1389, 6, 181, 15, 0, 1389, 1390, 6, 181, 32, 0, 1390, 379, 1, 0, 0, 0, 1391, 1392, 3, 58, 21, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1394, 6, 182, 11, 0, 1394, 381, 1, 0, 0, 0, 1395, 1396, 3, 60, 22, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 183, 11, 0, 1398, 383, 1, 0, 0, 0, 1399, 1400, 3, 62, 23, 0, 1400, 1401, 1, 0, 0, 0, 1401, 1402, 6, 184, 11, 0, 1402, 385, 1, 0, 0, 0, 1403, 1404, 3, 364, 174, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1406, 6, 185, 17, 0, 1406, 1407, 6, 185, 15, 0, 1407, 1408, 6, 185, 7, 0, 1408, 387, 1, 0, 0, 0, 1409, 1410, 3, 116, 50, 0, 1410, 1411, 1, 0, 0, 0, 1411, 1412, 6, 186, 18, 0, 1412, 1413, 6, 186, 15, 0, 1413, 1414, 6, 186, 7, 0, 1414, 389, 1, 0, 0, 0, 1415, 1416, 3, 58, 21, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 6, 187, 11, 0, 1418, 391, 1, 0, 0, 0, 1419, 1420, 3, 60, 22, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1422, 6, 188, 11, 0, 1422, 393, 1, 0, 0, 0, 1423, 1424, 3, 62, 23, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1426, 6, 189, 11, 0, 1426, 395, 1, 0, 0, 0, 1427, 1428, 3, 186, 85, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1430, 6, 190, 15, 0, 1430, 1431, 6, 190, 0, 0, 1431, 1432, 6, 190, 28, 0, 1432, 397, 1, 0, 0, 0, 1433, 1434, 3, 182, 83, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 191, 15, 0, 1436, 1437, 6, 191, 0, 0, 1437, 1438, 6, 191, 31, 0, 1438, 399, 1, 0, 0, 0, 1439, 1440, 3, 106, 45, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1442, 6, 192, 15, 0, 1442, 1443, 6, 192, 0, 0, 1443, 1444, 6, 192, 33, 0, 1444, 401, 1, 0, 0, 0, 1445, 1446, 3, 78, 31, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1448, 6, 193, 14, 0, 1448, 1449, 6, 193, 15, 0, 1449, 403, 1, 0, 0, 0, 65, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 576, 586, 590, 593, 602, 604, 615, 622, 627, 666, 671, 680, 687, 692, 694, 705, 713, 716, 718, 723, 728, 734, 741, 746, 752, 755, 763, 767, 891, 898, 900, 916, 921, 926, 928, 934, 1023, 1027, 1032, 1037, 1042, 1044, 1048, 1050, 1127, 1131, 1136, 1358, 1360, 34, 5, 2, 0, 5, 4, 0, 5, 6, 0, 5, 1, 0, 5, 3, 0, 5, 8, 0, 5, 12, 0, 5, 14, 0, 5, 10, 0, 5, 5, 0, 5, 11, 0, 0, 1, 0, 7, 69, 0, 5, 0, 0, 7, 29, 0, 4, 0, 0, 7, 70, 0, 7, 114, 0, 7, 38, 0, 7, 36, 0, 7, 25, 0, 7, 30, 0, 7, 40, 0, 7, 80, 0, 5, 13, 0, 5, 7, 0, 7, 90, 0, 7, 89, 0, 7, 72, 0, 7, 88, 0, 5, 9, 0, 7, 71, 0, 5, 15, 0, 7, 33, 0] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens index 04798fc3dca8a..63eb3a86419a3 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.tokens @@ -22,7 +22,7 @@ UNKNOWN_CMD=21 LINE_COMMENT=22 MULTILINE_COMMENT=23 WS=24 -INDEX_UNQUOTED_IDENTIFIER=25 +UNQUOTED_SOURCE=25 EXPLAIN_WS=26 EXPLAIN_LINE_COMMENT=27 EXPLAIN_MULTILINE_COMMENT=28 diff --git a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts index ff985e02ccf1d..ab1f2d1a3b4d5 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_lexer.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_lexer.ts @@ -37,7 +37,7 @@ export default class esql_lexer extends Lexer { public static readonly LINE_COMMENT = 22; public static readonly MULTILINE_COMMENT = 23; public static readonly WS = 24; - public static readonly INDEX_UNQUOTED_IDENTIFIER = 25; + public static readonly UNQUOTED_SOURCE = 25; public static readonly EXPLAIN_WS = 26; public static readonly EXPLAIN_LINE_COMMENT = 27; public static readonly EXPLAIN_MULTILINE_COMMENT = 28; @@ -230,7 +230,7 @@ export default class esql_lexer extends Lexer { "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", - "WS", "INDEX_UNQUOTED_IDENTIFIER", + "WS", "UNQUOTED_SOURCE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", @@ -321,7 +321,7 @@ export default class esql_lexer extends Lexer { "DISSECT", "DROP", "ENRICH", "EVAL", "EXPLAIN", "FROM", "GROK", "INLINESTATS", "KEEP", "LIMIT", "LOOKUP", "META", "METRICS", "MV_EXPAND", "RENAME", "ROW", "SHOW", "SORT", "STATS", "WHERE", "UNKNOWN_CMD", "LINE_COMMENT", "MULTILINE_COMMENT", - "WS", "INDEX_UNQUOTED_IDENTIFIER_PART", "INDEX_UNQUOTED_IDENTIFIER", "EXPLAIN_OPENING_BRACKET", + "WS", "UNQUOTED_SOURCE_PART", "UNQUOTED_SOURCE", "EXPLAIN_OPENING_BRACKET", "EXPLAIN_PIPE", "EXPLAIN_WS", "EXPLAIN_LINE_COMMENT", "EXPLAIN_MULTILINE_COMMENT", "PIPE", "DIGIT", "LETTER", "ESCAPE_SEQUENCE", "UNESCAPED_CHARS", "EXPONENT", "ASPERAND", "BACKQUOTE", "BACKQUOTE_BLOCK", "UNDERSCORE", "UNQUOTED_ID_BODY", @@ -332,32 +332,33 @@ export default class esql_lexer extends Lexer { "ASTERISK", "SLASH", "PERCENT", "NAMED_OR_POSITIONAL_PARAM", "OPENING_BRACKET", "CLOSING_BRACKET", "UNQUOTED_IDENTIFIER", "QUOTED_ID", "QUOTED_IDENTIFIER", "EXPR_LINE_COMMENT", "EXPR_MULTILINE_COMMENT", "EXPR_WS", "FROM_PIPE", - "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COMMA", "FROM_ASSIGN", - "FROM_QUOTED_STRING", "METADATA", "FROM_INDEX_UNQUOTED_IDENTIFIER", "FROM_LINE_COMMENT", - "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", "PROJECT_DOT", "PROJECT_COMMA", - "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", "ID_PATTERN", - "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", "RENAME_PIPE", - "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_ID_PATTERN", + "FROM_OPENING_BRACKET", "FROM_CLOSING_BRACKET", "FROM_COLON", "FROM_COMMA", + "FROM_ASSIGN", "METADATA", "FROM_UNQUOTED_SOURCE", "FROM_QUOTED_SOURCE", + "FROM_LINE_COMMENT", "FROM_MULTILINE_COMMENT", "FROM_WS", "PROJECT_PIPE", + "PROJECT_DOT", "PROJECT_COMMA", "UNQUOTED_ID_BODY_WITH_PATTERN", "UNQUOTED_ID_PATTERN", + "ID_PATTERN", "PROJECT_LINE_COMMENT", "PROJECT_MULTILINE_COMMENT", "PROJECT_WS", + "RENAME_PIPE", "RENAME_ASSIGN", "RENAME_COMMA", "RENAME_DOT", "AS", "RENAME_ID_PATTERN", "RENAME_LINE_COMMENT", "RENAME_MULTILINE_COMMENT", "RENAME_WS", "ENRICH_PIPE", "ENRICH_OPENING_BRACKET", "ON", "WITH", "ENRICH_POLICY_NAME_BODY", "ENRICH_POLICY_NAME", - "ENRICH_QUOTED_IDENTIFIER", "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", - "ENRICH_FIELD_COMMA", "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", - "ENRICH_FIELD_QUOTED_IDENTIFIER", "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", "LOOKUP_PIPE", "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", - "LOOKUP_INDEX_UNQUOTED_IDENTIFIER", "LOOKUP_LINE_COMMENT", "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", "LOOKUP_FIELD_DOT", - "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", "MVEXPAND_PIPE", "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", - "MVEXPAND_UNQUOTED_IDENTIFIER", "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", - "SHOW_WS", "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", + "ENRICH_MODE_UNQUOTED_VALUE", "ENRICH_LINE_COMMENT", "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", "ENRICH_FIELD_PIPE", "ENRICH_FIELD_ASSIGN", "ENRICH_FIELD_COMMA", + "ENRICH_FIELD_DOT", "ENRICH_FIELD_WITH", "ENRICH_FIELD_ID_PATTERN", "ENRICH_FIELD_QUOTED_IDENTIFIER", + "ENRICH_FIELD_LINE_COMMENT", "ENRICH_FIELD_MULTILINE_COMMENT", "ENRICH_FIELD_WS", + "LOOKUP_PIPE", "LOOKUP_COLON", "LOOKUP_COMMA", "LOOKUP_DOT", "LOOKUP_ON", + "LOOKUP_UNQUOTED_SOURCE", "LOOKUP_QUOTED_SOURCE", "LOOKUP_LINE_COMMENT", + "LOOKUP_MULTILINE_COMMENT", "LOOKUP_WS", "LOOKUP_FIELD_PIPE", "LOOKUP_FIELD_COMMA", + "LOOKUP_FIELD_DOT", "LOOKUP_FIELD_ID_PATTERN", "LOOKUP_FIELD_LINE_COMMENT", + "LOOKUP_FIELD_MULTILINE_COMMENT", "LOOKUP_FIELD_WS", "MVEXPAND_PIPE", + "MVEXPAND_DOT", "MVEXPAND_QUOTED_IDENTIFIER", "MVEXPAND_UNQUOTED_IDENTIFIER", + "MVEXPAND_LINE_COMMENT", "MVEXPAND_MULTILINE_COMMENT", "MVEXPAND_WS", + "SHOW_PIPE", "INFO", "SHOW_LINE_COMMENT", "SHOW_MULTILINE_COMMENT", "SHOW_WS", + "META_PIPE", "FUNCTIONS", "META_LINE_COMMENT", "META_MULTILINE_COMMENT", "META_WS", "SETTING_CLOSING_BRACKET", "COLON", "SETTING", "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "METRICS_PIPE", "METRICS_INDEX_UNQUOTED_IDENTIFIER", - "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", "METRICS_WS", "CLOSING_METRICS_COMMA", - "CLOSING_METRICS_LINE_COMMENT", "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS", - "CLOSING_METRICS_QUOTED_IDENTIFIER", "CLOSING_METRICS_UNQUOTED_IDENTIFIER", - "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE", + "SETTTING_MULTILINE_COMMENT", "SETTING_WS", "METRICS_PIPE", "METRICS_UNQUOTED_SOURCE", + "METRICS_QUOTED_SOURCE", "METRICS_LINE_COMMENT", "METRICS_MULTILINE_COMMENT", + "METRICS_WS", "CLOSING_METRICS_COLON", "CLOSING_METRICS_COMMA", "CLOSING_METRICS_LINE_COMMENT", + "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS", "CLOSING_METRICS_QUOTED_IDENTIFIER", + "CLOSING_METRICS_UNQUOTED_IDENTIFIER", "CLOSING_METRICS_BY", "CLOSING_METRICS_PIPE", ]; @@ -378,7 +379,7 @@ export default class esql_lexer extends Lexer { public get modeNames(): string[] { return esql_lexer.modeNames; } - public static readonly _serializedATN: number[] = [4,0,124,1422,6,-1,6, + public static readonly _serializedATN: number[] = [4,0,124,1450,6,-1,6, -1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1,6,-1, 2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8, 2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16, @@ -408,463 +409,474 @@ export default class esql_lexer extends Lexer { 2,169,7,169,2,170,7,170,2,171,7,171,2,172,7,172,2,173,7,173,2,174,7,174, 2,175,7,175,2,176,7,176,2,177,7,177,2,178,7,178,2,179,7,179,2,180,7,180, 2,181,7,181,2,182,7,182,2,183,7,183,2,184,7,184,2,185,7,185,2,186,7,186, - 2,187,7,187,2,188,7,188,2,189,7,189,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5, - 1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7, - 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9, - 1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1, - 11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1, - 14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1, - 18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19, - 1,20,4,20,567,8,20,11,20,12,20,568,1,20,1,20,1,21,1,21,1,21,1,21,5,21,577, - 8,21,10,21,12,21,580,9,21,1,21,3,21,583,8,21,1,21,3,21,586,8,21,1,21,1, - 21,1,22,1,22,1,22,1,22,1,22,5,22,595,8,22,10,22,12,22,598,9,22,1,22,1,22, - 1,22,1,22,1,22,1,23,4,23,606,8,23,11,23,12,23,607,1,23,1,23,1,24,1,24,1, - 24,3,24,615,8,24,1,25,4,25,618,8,25,11,25,12,25,619,1,26,1,26,1,26,1,26, - 1,26,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1, - 30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,32,1,32,1,33,1,33,1,34,1,34,1,34, - 1,35,1,35,1,36,1,36,3,36,659,8,36,1,36,4,36,662,8,36,11,36,12,36,663,1, - 37,1,37,1,38,1,38,1,39,1,39,1,39,3,39,673,8,39,1,40,1,40,1,41,1,41,1,41, - 3,41,680,8,41,1,42,1,42,1,42,5,42,685,8,42,10,42,12,42,688,9,42,1,42,1, - 42,1,42,1,42,1,42,1,42,5,42,696,8,42,10,42,12,42,699,9,42,1,42,1,42,1,42, - 1,42,1,42,3,42,706,8,42,1,42,3,42,709,8,42,3,42,711,8,42,1,43,4,43,714, - 8,43,11,43,12,43,715,1,44,4,44,719,8,44,11,44,12,44,720,1,44,1,44,5,44, - 725,8,44,10,44,12,44,728,9,44,1,44,1,44,4,44,732,8,44,11,44,12,44,733,1, - 44,4,44,737,8,44,11,44,12,44,738,1,44,1,44,5,44,743,8,44,10,44,12,44,746, - 9,44,3,44,748,8,44,1,44,1,44,1,44,1,44,4,44,754,8,44,11,44,12,44,755,1, - 44,1,44,3,44,760,8,44,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,47,1,47,1,47, - 1,47,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1, - 52,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55, - 1,55,1,55,1,55,1,56,1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,59,1,59,1,59,1, - 59,1,59,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62, - 1,62,1,62,1,63,1,63,1,63,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1, - 66,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,70, - 1,71,1,71,1,72,1,72,1,72,1,73,1,73,1,74,1,74,1,74,1,75,1,75,1,76,1,76,1, - 77,1,77,1,78,1,78,1,79,1,79,1,80,1,80,1,80,5,80,882,8,80,10,80,12,80,885, - 9,80,1,80,1,80,4,80,889,8,80,11,80,12,80,890,3,80,893,8,80,1,81,1,81,1, - 81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,83,1,83,5,83,907,8,83,10,83,12, - 83,910,9,83,1,83,1,83,3,83,914,8,83,1,83,4,83,917,8,83,11,83,12,83,918, - 3,83,921,8,83,1,84,1,84,4,84,925,8,84,11,84,12,84,926,1,84,1,84,1,85,1, - 85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,89,1,89, - 1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1, - 92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95, - 1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1, - 98,1,99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101, - 1,101,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,3,103,1012,8,103, - 1,104,1,104,3,104,1016,8,104,1,104,5,104,1019,8,104,10,104,12,104,1022, - 9,104,1,104,1,104,3,104,1026,8,104,1,104,4,104,1029,8,104,11,104,12,104, - 1030,3,104,1033,8,104,1,105,1,105,4,105,1037,8,105,11,105,12,105,1038,1, - 106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108,1, - 109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1, - 111,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1, - 115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1, - 118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1, - 120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1, - 123,4,123,1114,8,123,11,123,12,123,1115,1,123,1,123,3,123,1120,8,123,1, - 123,4,123,1123,8,123,11,123,12,123,1124,1,124,1,124,1,124,1,124,1,125,1, - 125,1,125,1,125,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,128,1, - 128,1,128,1,128,1,129,1,129,1,129,1,129,1,129,1,129,1,130,1,130,1,130,1, - 130,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,133,1,133,1,133,1, - 133,1,134,1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,136,1,136,1,136,1, - 136,1,137,1,137,1,137,1,137,1,138,1,138,1,138,1,138,1,139,1,139,1,139,1, - 139,1,139,1,140,1,140,1,140,1,140,1,141,1,141,1,141,1,141,1,142,1,142,1, - 142,1,142,1,142,1,143,1,143,1,143,1,143,1,144,1,144,1,144,1,144,1,145,1, - 145,1,145,1,145,1,146,1,146,1,146,1,146,1,147,1,147,1,147,1,147,1,147,1, - 147,1,148,1,148,1,148,1,148,1,149,1,149,1,149,1,149,1,150,1,150,1,150,1, - 150,1,151,1,151,1,151,1,151,1,152,1,152,1,152,1,152,1,153,1,153,1,153,1, - 153,1,154,1,154,1,154,1,154,1,154,1,155,1,155,1,155,1,155,1,156,1,156,1, - 156,1,156,1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158,1,159,1,159,1, - 159,1,159,1,160,1,160,1,160,1,160,1,161,1,161,1,161,1,161,1,161,1,162,1, - 162,1,162,1,162,1,162,1,163,1,163,1,163,1,163,1,164,1,164,1,164,1,164,1, - 165,1,165,1,165,1,165,1,166,1,166,1,166,1,166,1,166,1,167,1,167,1,167,1, - 167,1,167,1,167,1,167,1,167,1,167,1,167,1,168,1,168,1,168,1,168,1,169,1, - 169,1,169,1,169,1,170,1,170,1,170,1,170,1,171,1,171,1,171,1,171,1,171,1, - 172,1,172,1,173,1,173,1,173,1,173,1,173,4,173,1343,8,173,11,173,12,173, - 1344,1,174,1,174,1,174,1,174,1,175,1,175,1,175,1,175,1,176,1,176,1,176, - 1,176,1,177,1,177,1,177,1,177,1,177,1,178,1,178,1,178,1,178,1,178,1,178, - 1,179,1,179,1,179,1,179,1,180,1,180,1,180,1,180,1,181,1,181,1,181,1,181, - 1,182,1,182,1,182,1,182,1,182,1,182,1,183,1,183,1,183,1,183,1,184,1,184, - 1,184,1,184,1,185,1,185,1,185,1,185,1,186,1,186,1,186,1,186,1,186,1,186, - 1,187,1,187,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,188,1,188, - 1,189,1,189,1,189,1,189,1,189,2,596,697,0,190,16,1,18,2,20,3,22,4,24,5, - 26,6,28,7,30,8,32,9,34,10,36,11,38,12,40,13,42,14,44,15,46,16,48,17,50, - 18,52,19,54,20,56,21,58,22,60,23,62,24,64,0,66,25,68,0,70,0,72,26,74,27, - 76,28,78,29,80,0,82,0,84,0,86,0,88,0,90,0,92,0,94,0,96,0,98,0,100,30,102, - 31,104,32,106,33,108,34,110,35,112,36,114,37,116,38,118,39,120,40,122,41, - 124,42,126,43,128,44,130,45,132,46,134,47,136,48,138,49,140,50,142,51,144, - 52,146,53,148,54,150,55,152,56,154,57,156,58,158,59,160,60,162,61,164,62, - 166,63,168,64,170,65,172,66,174,67,176,68,178,69,180,70,182,71,184,0,186, - 72,188,73,190,74,192,75,194,0,196,0,198,0,200,0,202,0,204,0,206,76,208, - 0,210,77,212,78,214,79,216,0,218,0,220,0,222,0,224,0,226,80,228,81,230, - 82,232,83,234,0,236,0,238,0,240,0,242,84,244,0,246,85,248,86,250,87,252, - 0,254,0,256,88,258,89,260,0,262,90,264,0,266,0,268,91,270,92,272,93,274, - 0,276,0,278,0,280,0,282,0,284,0,286,0,288,94,290,95,292,96,294,0,296,0, - 298,0,300,0,302,0,304,97,306,98,308,99,310,0,312,0,314,0,316,0,318,100, - 320,101,322,102,324,0,326,0,328,0,330,0,332,103,334,104,336,105,338,0,340, - 106,342,107,344,108,346,109,348,0,350,110,352,111,354,112,356,113,358,0, - 360,114,362,115,364,116,366,117,368,118,370,0,372,0,374,119,376,120,378, - 121,380,0,382,122,384,123,386,124,388,0,390,0,392,0,394,0,16,0,1,2,3,4, - 5,6,7,8,9,10,11,12,13,14,15,35,2,0,68,68,100,100,2,0,73,73,105,105,2,0, - 83,83,115,115,2,0,69,69,101,101,2,0,67,67,99,99,2,0,84,84,116,116,2,0,82, - 82,114,114,2,0,79,79,111,111,2,0,80,80,112,112,2,0,78,78,110,110,2,0,72, - 72,104,104,2,0,86,86,118,118,2,0,65,65,97,97,2,0,76,76,108,108,2,0,88,88, - 120,120,2,0,70,70,102,102,2,0,77,77,109,109,2,0,71,71,103,103,2,0,75,75, - 107,107,2,0,85,85,117,117,2,0,87,87,119,119,6,0,9,10,13,13,32,32,47,47, - 91,91,93,93,2,0,10,10,13,13,3,0,9,10,13,13,32,32,10,0,9,10,13,13,32,32, - 44,44,47,47,61,61,91,91,93,93,96,96,124,124,2,0,42,42,47,47,1,0,48,57,2, - 0,65,90,97,122,8,0,34,34,78,78,82,82,84,84,92,92,110,110,114,114,116,116, - 4,0,10,10,13,13,34,34,92,92,2,0,43,43,45,45,1,0,96,96,2,0,66,66,98,98,2, - 0,89,89,121,121,11,0,9,10,13,13,32,32,34,35,44,44,47,47,58,58,60,60,62, - 63,92,92,124,124,1448,0,16,1,0,0,0,0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0, - 0,0,24,1,0,0,0,0,26,1,0,0,0,0,28,1,0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34, - 1,0,0,0,0,36,1,0,0,0,0,38,1,0,0,0,0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0, - 0,0,46,1,0,0,0,0,48,1,0,0,0,0,50,1,0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56, - 1,0,0,0,0,58,1,0,0,0,0,60,1,0,0,0,0,62,1,0,0,0,0,66,1,0,0,0,1,68,1,0,0, - 0,1,70,1,0,0,0,1,72,1,0,0,0,1,74,1,0,0,0,1,76,1,0,0,0,2,78,1,0,0,0,2,100, - 1,0,0,0,2,102,1,0,0,0,2,104,1,0,0,0,2,106,1,0,0,0,2,108,1,0,0,0,2,110,1, - 0,0,0,2,112,1,0,0,0,2,114,1,0,0,0,2,116,1,0,0,0,2,118,1,0,0,0,2,120,1,0, - 0,0,2,122,1,0,0,0,2,124,1,0,0,0,2,126,1,0,0,0,2,128,1,0,0,0,2,130,1,0,0, - 0,2,132,1,0,0,0,2,134,1,0,0,0,2,136,1,0,0,0,2,138,1,0,0,0,2,140,1,0,0,0, - 2,142,1,0,0,0,2,144,1,0,0,0,2,146,1,0,0,0,2,148,1,0,0,0,2,150,1,0,0,0,2, - 152,1,0,0,0,2,154,1,0,0,0,2,156,1,0,0,0,2,158,1,0,0,0,2,160,1,0,0,0,2,162, - 1,0,0,0,2,164,1,0,0,0,2,166,1,0,0,0,2,168,1,0,0,0,2,170,1,0,0,0,2,172,1, - 0,0,0,2,174,1,0,0,0,2,176,1,0,0,0,2,178,1,0,0,0,2,180,1,0,0,0,2,182,1,0, - 0,0,2,186,1,0,0,0,2,188,1,0,0,0,2,190,1,0,0,0,2,192,1,0,0,0,3,194,1,0,0, - 0,3,196,1,0,0,0,3,198,1,0,0,0,3,200,1,0,0,0,3,202,1,0,0,0,3,204,1,0,0,0, - 3,206,1,0,0,0,3,208,1,0,0,0,3,210,1,0,0,0,3,212,1,0,0,0,3,214,1,0,0,0,4, - 216,1,0,0,0,4,218,1,0,0,0,4,220,1,0,0,0,4,226,1,0,0,0,4,228,1,0,0,0,4,230, - 1,0,0,0,4,232,1,0,0,0,5,234,1,0,0,0,5,236,1,0,0,0,5,238,1,0,0,0,5,240,1, - 0,0,0,5,242,1,0,0,0,5,244,1,0,0,0,5,246,1,0,0,0,5,248,1,0,0,0,5,250,1,0, - 0,0,6,252,1,0,0,0,6,254,1,0,0,0,6,256,1,0,0,0,6,258,1,0,0,0,6,262,1,0,0, - 0,6,264,1,0,0,0,6,266,1,0,0,0,6,268,1,0,0,0,6,270,1,0,0,0,6,272,1,0,0,0, - 7,274,1,0,0,0,7,276,1,0,0,0,7,278,1,0,0,0,7,280,1,0,0,0,7,282,1,0,0,0,7, - 284,1,0,0,0,7,286,1,0,0,0,7,288,1,0,0,0,7,290,1,0,0,0,7,292,1,0,0,0,8,294, - 1,0,0,0,8,296,1,0,0,0,8,298,1,0,0,0,8,300,1,0,0,0,8,302,1,0,0,0,8,304,1, - 0,0,0,8,306,1,0,0,0,8,308,1,0,0,0,9,310,1,0,0,0,9,312,1,0,0,0,9,314,1,0, - 0,0,9,316,1,0,0,0,9,318,1,0,0,0,9,320,1,0,0,0,9,322,1,0,0,0,10,324,1,0, - 0,0,10,326,1,0,0,0,10,328,1,0,0,0,10,330,1,0,0,0,10,332,1,0,0,0,10,334, - 1,0,0,0,10,336,1,0,0,0,11,338,1,0,0,0,11,340,1,0,0,0,11,342,1,0,0,0,11, - 344,1,0,0,0,11,346,1,0,0,0,12,348,1,0,0,0,12,350,1,0,0,0,12,352,1,0,0,0, - 12,354,1,0,0,0,12,356,1,0,0,0,13,358,1,0,0,0,13,360,1,0,0,0,13,362,1,0, - 0,0,13,364,1,0,0,0,13,366,1,0,0,0,13,368,1,0,0,0,14,370,1,0,0,0,14,372, - 1,0,0,0,14,374,1,0,0,0,14,376,1,0,0,0,14,378,1,0,0,0,15,380,1,0,0,0,15, - 382,1,0,0,0,15,384,1,0,0,0,15,386,1,0,0,0,15,388,1,0,0,0,15,390,1,0,0,0, - 15,392,1,0,0,0,15,394,1,0,0,0,16,396,1,0,0,0,18,406,1,0,0,0,20,413,1,0, - 0,0,22,422,1,0,0,0,24,429,1,0,0,0,26,439,1,0,0,0,28,446,1,0,0,0,30,453, - 1,0,0,0,32,467,1,0,0,0,34,474,1,0,0,0,36,482,1,0,0,0,38,491,1,0,0,0,40, - 498,1,0,0,0,42,508,1,0,0,0,44,520,1,0,0,0,46,529,1,0,0,0,48,535,1,0,0,0, - 50,542,1,0,0,0,52,549,1,0,0,0,54,557,1,0,0,0,56,566,1,0,0,0,58,572,1,0, - 0,0,60,589,1,0,0,0,62,605,1,0,0,0,64,614,1,0,0,0,66,617,1,0,0,0,68,621, - 1,0,0,0,70,626,1,0,0,0,72,631,1,0,0,0,74,635,1,0,0,0,76,639,1,0,0,0,78, - 643,1,0,0,0,80,647,1,0,0,0,82,649,1,0,0,0,84,651,1,0,0,0,86,654,1,0,0,0, - 88,656,1,0,0,0,90,665,1,0,0,0,92,667,1,0,0,0,94,672,1,0,0,0,96,674,1,0, - 0,0,98,679,1,0,0,0,100,710,1,0,0,0,102,713,1,0,0,0,104,759,1,0,0,0,106, - 761,1,0,0,0,108,764,1,0,0,0,110,768,1,0,0,0,112,772,1,0,0,0,114,774,1,0, - 0,0,116,777,1,0,0,0,118,779,1,0,0,0,120,784,1,0,0,0,122,786,1,0,0,0,124, - 792,1,0,0,0,126,798,1,0,0,0,128,803,1,0,0,0,130,805,1,0,0,0,132,808,1,0, - 0,0,134,811,1,0,0,0,136,816,1,0,0,0,138,820,1,0,0,0,140,825,1,0,0,0,142, - 831,1,0,0,0,144,834,1,0,0,0,146,836,1,0,0,0,148,842,1,0,0,0,150,844,1,0, - 0,0,152,849,1,0,0,0,154,852,1,0,0,0,156,855,1,0,0,0,158,858,1,0,0,0,160, - 860,1,0,0,0,162,863,1,0,0,0,164,865,1,0,0,0,166,868,1,0,0,0,168,870,1,0, - 0,0,170,872,1,0,0,0,172,874,1,0,0,0,174,876,1,0,0,0,176,892,1,0,0,0,178, - 894,1,0,0,0,180,899,1,0,0,0,182,920,1,0,0,0,184,922,1,0,0,0,186,930,1,0, - 0,0,188,932,1,0,0,0,190,936,1,0,0,0,192,940,1,0,0,0,194,944,1,0,0,0,196, - 949,1,0,0,0,198,953,1,0,0,0,200,957,1,0,0,0,202,961,1,0,0,0,204,965,1,0, - 0,0,206,969,1,0,0,0,208,978,1,0,0,0,210,982,1,0,0,0,212,986,1,0,0,0,214, - 990,1,0,0,0,216,994,1,0,0,0,218,999,1,0,0,0,220,1003,1,0,0,0,222,1011,1, - 0,0,0,224,1032,1,0,0,0,226,1036,1,0,0,0,228,1040,1,0,0,0,230,1044,1,0,0, - 0,232,1048,1,0,0,0,234,1052,1,0,0,0,236,1057,1,0,0,0,238,1061,1,0,0,0,240, - 1065,1,0,0,0,242,1069,1,0,0,0,244,1072,1,0,0,0,246,1076,1,0,0,0,248,1080, - 1,0,0,0,250,1084,1,0,0,0,252,1088,1,0,0,0,254,1093,1,0,0,0,256,1098,1,0, - 0,0,258,1103,1,0,0,0,260,1110,1,0,0,0,262,1119,1,0,0,0,264,1126,1,0,0,0, - 266,1130,1,0,0,0,268,1134,1,0,0,0,270,1138,1,0,0,0,272,1142,1,0,0,0,274, - 1146,1,0,0,0,276,1152,1,0,0,0,278,1156,1,0,0,0,280,1160,1,0,0,0,282,1164, - 1,0,0,0,284,1168,1,0,0,0,286,1172,1,0,0,0,288,1176,1,0,0,0,290,1180,1,0, - 0,0,292,1184,1,0,0,0,294,1188,1,0,0,0,296,1193,1,0,0,0,298,1197,1,0,0,0, - 300,1201,1,0,0,0,302,1206,1,0,0,0,304,1210,1,0,0,0,306,1214,1,0,0,0,308, - 1218,1,0,0,0,310,1222,1,0,0,0,312,1228,1,0,0,0,314,1232,1,0,0,0,316,1236, - 1,0,0,0,318,1240,1,0,0,0,320,1244,1,0,0,0,322,1248,1,0,0,0,324,1252,1,0, - 0,0,326,1257,1,0,0,0,328,1261,1,0,0,0,330,1265,1,0,0,0,332,1269,1,0,0,0, - 334,1273,1,0,0,0,336,1277,1,0,0,0,338,1281,1,0,0,0,340,1286,1,0,0,0,342, - 1291,1,0,0,0,344,1295,1,0,0,0,346,1299,1,0,0,0,348,1303,1,0,0,0,350,1308, - 1,0,0,0,352,1318,1,0,0,0,354,1322,1,0,0,0,356,1326,1,0,0,0,358,1330,1,0, - 0,0,360,1335,1,0,0,0,362,1342,1,0,0,0,364,1346,1,0,0,0,366,1350,1,0,0,0, - 368,1354,1,0,0,0,370,1358,1,0,0,0,372,1363,1,0,0,0,374,1369,1,0,0,0,376, - 1373,1,0,0,0,378,1377,1,0,0,0,380,1381,1,0,0,0,382,1387,1,0,0,0,384,1391, - 1,0,0,0,386,1395,1,0,0,0,388,1399,1,0,0,0,390,1405,1,0,0,0,392,1411,1,0, - 0,0,394,1417,1,0,0,0,396,397,7,0,0,0,397,398,7,1,0,0,398,399,7,2,0,0,399, - 400,7,2,0,0,400,401,7,3,0,0,401,402,7,4,0,0,402,403,7,5,0,0,403,404,1,0, - 0,0,404,405,6,0,0,0,405,17,1,0,0,0,406,407,7,0,0,0,407,408,7,6,0,0,408, - 409,7,7,0,0,409,410,7,8,0,0,410,411,1,0,0,0,411,412,6,1,1,0,412,19,1,0, - 0,0,413,414,7,3,0,0,414,415,7,9,0,0,415,416,7,6,0,0,416,417,7,1,0,0,417, - 418,7,4,0,0,418,419,7,10,0,0,419,420,1,0,0,0,420,421,6,2,2,0,421,21,1,0, - 0,0,422,423,7,3,0,0,423,424,7,11,0,0,424,425,7,12,0,0,425,426,7,13,0,0, - 426,427,1,0,0,0,427,428,6,3,0,0,428,23,1,0,0,0,429,430,7,3,0,0,430,431, - 7,14,0,0,431,432,7,8,0,0,432,433,7,13,0,0,433,434,7,12,0,0,434,435,7,1, - 0,0,435,436,7,9,0,0,436,437,1,0,0,0,437,438,6,4,3,0,438,25,1,0,0,0,439, - 440,7,15,0,0,440,441,7,6,0,0,441,442,7,7,0,0,442,443,7,16,0,0,443,444,1, - 0,0,0,444,445,6,5,4,0,445,27,1,0,0,0,446,447,7,17,0,0,447,448,7,6,0,0,448, - 449,7,7,0,0,449,450,7,18,0,0,450,451,1,0,0,0,451,452,6,6,0,0,452,29,1,0, - 0,0,453,454,7,1,0,0,454,455,7,9,0,0,455,456,7,13,0,0,456,457,7,1,0,0,457, - 458,7,9,0,0,458,459,7,3,0,0,459,460,7,2,0,0,460,461,7,5,0,0,461,462,7,12, - 0,0,462,463,7,5,0,0,463,464,7,2,0,0,464,465,1,0,0,0,465,466,6,7,0,0,466, - 31,1,0,0,0,467,468,7,18,0,0,468,469,7,3,0,0,469,470,7,3,0,0,470,471,7,8, - 0,0,471,472,1,0,0,0,472,473,6,8,1,0,473,33,1,0,0,0,474,475,7,13,0,0,475, - 476,7,1,0,0,476,477,7,16,0,0,477,478,7,1,0,0,478,479,7,5,0,0,479,480,1, - 0,0,0,480,481,6,9,0,0,481,35,1,0,0,0,482,483,7,13,0,0,483,484,7,7,0,0,484, - 485,7,7,0,0,485,486,7,18,0,0,486,487,7,19,0,0,487,488,7,8,0,0,488,489,1, - 0,0,0,489,490,6,10,5,0,490,37,1,0,0,0,491,492,7,16,0,0,492,493,7,3,0,0, - 493,494,7,5,0,0,494,495,7,12,0,0,495,496,1,0,0,0,496,497,6,11,6,0,497,39, - 1,0,0,0,498,499,7,16,0,0,499,500,7,3,0,0,500,501,7,5,0,0,501,502,7,6,0, - 0,502,503,7,1,0,0,503,504,7,4,0,0,504,505,7,2,0,0,505,506,1,0,0,0,506,507, - 6,12,7,0,507,41,1,0,0,0,508,509,7,16,0,0,509,510,7,11,0,0,510,511,5,95, - 0,0,511,512,7,3,0,0,512,513,7,14,0,0,513,514,7,8,0,0,514,515,7,12,0,0,515, - 516,7,9,0,0,516,517,7,0,0,0,517,518,1,0,0,0,518,519,6,13,8,0,519,43,1,0, - 0,0,520,521,7,6,0,0,521,522,7,3,0,0,522,523,7,9,0,0,523,524,7,12,0,0,524, - 525,7,16,0,0,525,526,7,3,0,0,526,527,1,0,0,0,527,528,6,14,9,0,528,45,1, - 0,0,0,529,530,7,6,0,0,530,531,7,7,0,0,531,532,7,20,0,0,532,533,1,0,0,0, - 533,534,6,15,0,0,534,47,1,0,0,0,535,536,7,2,0,0,536,537,7,10,0,0,537,538, - 7,7,0,0,538,539,7,20,0,0,539,540,1,0,0,0,540,541,6,16,10,0,541,49,1,0,0, - 0,542,543,7,2,0,0,543,544,7,7,0,0,544,545,7,6,0,0,545,546,7,5,0,0,546,547, - 1,0,0,0,547,548,6,17,0,0,548,51,1,0,0,0,549,550,7,2,0,0,550,551,7,5,0,0, - 551,552,7,12,0,0,552,553,7,5,0,0,553,554,7,2,0,0,554,555,1,0,0,0,555,556, - 6,18,0,0,556,53,1,0,0,0,557,558,7,20,0,0,558,559,7,10,0,0,559,560,7,3,0, - 0,560,561,7,6,0,0,561,562,7,3,0,0,562,563,1,0,0,0,563,564,6,19,0,0,564, - 55,1,0,0,0,565,567,8,21,0,0,566,565,1,0,0,0,567,568,1,0,0,0,568,566,1,0, - 0,0,568,569,1,0,0,0,569,570,1,0,0,0,570,571,6,20,0,0,571,57,1,0,0,0,572, - 573,5,47,0,0,573,574,5,47,0,0,574,578,1,0,0,0,575,577,8,22,0,0,576,575, - 1,0,0,0,577,580,1,0,0,0,578,576,1,0,0,0,578,579,1,0,0,0,579,582,1,0,0,0, - 580,578,1,0,0,0,581,583,5,13,0,0,582,581,1,0,0,0,582,583,1,0,0,0,583,585, - 1,0,0,0,584,586,5,10,0,0,585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0, - 0,587,588,6,21,11,0,588,59,1,0,0,0,589,590,5,47,0,0,590,591,5,42,0,0,591, - 596,1,0,0,0,592,595,3,60,22,0,593,595,9,0,0,0,594,592,1,0,0,0,594,593,1, - 0,0,0,595,598,1,0,0,0,596,597,1,0,0,0,596,594,1,0,0,0,597,599,1,0,0,0,598, - 596,1,0,0,0,599,600,5,42,0,0,600,601,5,47,0,0,601,602,1,0,0,0,602,603,6, - 22,11,0,603,61,1,0,0,0,604,606,7,23,0,0,605,604,1,0,0,0,606,607,1,0,0,0, - 607,605,1,0,0,0,607,608,1,0,0,0,608,609,1,0,0,0,609,610,6,23,11,0,610,63, - 1,0,0,0,611,615,8,24,0,0,612,613,5,47,0,0,613,615,8,25,0,0,614,611,1,0, - 0,0,614,612,1,0,0,0,615,65,1,0,0,0,616,618,3,64,24,0,617,616,1,0,0,0,618, - 619,1,0,0,0,619,617,1,0,0,0,619,620,1,0,0,0,620,67,1,0,0,0,621,622,3,178, - 81,0,622,623,1,0,0,0,623,624,6,26,12,0,624,625,6,26,13,0,625,69,1,0,0,0, - 626,627,3,78,31,0,627,628,1,0,0,0,628,629,6,27,14,0,629,630,6,27,15,0,630, - 71,1,0,0,0,631,632,3,62,23,0,632,633,1,0,0,0,633,634,6,28,11,0,634,73,1, - 0,0,0,635,636,3,58,21,0,636,637,1,0,0,0,637,638,6,29,11,0,638,75,1,0,0, - 0,639,640,3,60,22,0,640,641,1,0,0,0,641,642,6,30,11,0,642,77,1,0,0,0,643, - 644,5,124,0,0,644,645,1,0,0,0,645,646,6,31,15,0,646,79,1,0,0,0,647,648, - 7,26,0,0,648,81,1,0,0,0,649,650,7,27,0,0,650,83,1,0,0,0,651,652,5,92,0, - 0,652,653,7,28,0,0,653,85,1,0,0,0,654,655,8,29,0,0,655,87,1,0,0,0,656,658, - 7,3,0,0,657,659,7,30,0,0,658,657,1,0,0,0,658,659,1,0,0,0,659,661,1,0,0, - 0,660,662,3,80,32,0,661,660,1,0,0,0,662,663,1,0,0,0,663,661,1,0,0,0,663, - 664,1,0,0,0,664,89,1,0,0,0,665,666,5,64,0,0,666,91,1,0,0,0,667,668,5,96, - 0,0,668,93,1,0,0,0,669,673,8,31,0,0,670,671,5,96,0,0,671,673,5,96,0,0,672, - 669,1,0,0,0,672,670,1,0,0,0,673,95,1,0,0,0,674,675,5,95,0,0,675,97,1,0, - 0,0,676,680,3,82,33,0,677,680,3,80,32,0,678,680,3,96,40,0,679,676,1,0,0, - 0,679,677,1,0,0,0,679,678,1,0,0,0,680,99,1,0,0,0,681,686,5,34,0,0,682,685, - 3,84,34,0,683,685,3,86,35,0,684,682,1,0,0,0,684,683,1,0,0,0,685,688,1,0, - 0,0,686,684,1,0,0,0,686,687,1,0,0,0,687,689,1,0,0,0,688,686,1,0,0,0,689, - 711,5,34,0,0,690,691,5,34,0,0,691,692,5,34,0,0,692,693,5,34,0,0,693,697, - 1,0,0,0,694,696,8,22,0,0,695,694,1,0,0,0,696,699,1,0,0,0,697,698,1,0,0, - 0,697,695,1,0,0,0,698,700,1,0,0,0,699,697,1,0,0,0,700,701,5,34,0,0,701, - 702,5,34,0,0,702,703,5,34,0,0,703,705,1,0,0,0,704,706,5,34,0,0,705,704, - 1,0,0,0,705,706,1,0,0,0,706,708,1,0,0,0,707,709,5,34,0,0,708,707,1,0,0, - 0,708,709,1,0,0,0,709,711,1,0,0,0,710,681,1,0,0,0,710,690,1,0,0,0,711,101, - 1,0,0,0,712,714,3,80,32,0,713,712,1,0,0,0,714,715,1,0,0,0,715,713,1,0,0, - 0,715,716,1,0,0,0,716,103,1,0,0,0,717,719,3,80,32,0,718,717,1,0,0,0,719, - 720,1,0,0,0,720,718,1,0,0,0,720,721,1,0,0,0,721,722,1,0,0,0,722,726,3,120, - 52,0,723,725,3,80,32,0,724,723,1,0,0,0,725,728,1,0,0,0,726,724,1,0,0,0, - 726,727,1,0,0,0,727,760,1,0,0,0,728,726,1,0,0,0,729,731,3,120,52,0,730, - 732,3,80,32,0,731,730,1,0,0,0,732,733,1,0,0,0,733,731,1,0,0,0,733,734,1, - 0,0,0,734,760,1,0,0,0,735,737,3,80,32,0,736,735,1,0,0,0,737,738,1,0,0,0, - 738,736,1,0,0,0,738,739,1,0,0,0,739,747,1,0,0,0,740,744,3,120,52,0,741, - 743,3,80,32,0,742,741,1,0,0,0,743,746,1,0,0,0,744,742,1,0,0,0,744,745,1, - 0,0,0,745,748,1,0,0,0,746,744,1,0,0,0,747,740,1,0,0,0,747,748,1,0,0,0,748, - 749,1,0,0,0,749,750,3,88,36,0,750,760,1,0,0,0,751,753,3,120,52,0,752,754, - 3,80,32,0,753,752,1,0,0,0,754,755,1,0,0,0,755,753,1,0,0,0,755,756,1,0,0, - 0,756,757,1,0,0,0,757,758,3,88,36,0,758,760,1,0,0,0,759,718,1,0,0,0,759, - 729,1,0,0,0,759,736,1,0,0,0,759,751,1,0,0,0,760,105,1,0,0,0,761,762,7,32, - 0,0,762,763,7,33,0,0,763,107,1,0,0,0,764,765,7,12,0,0,765,766,7,9,0,0,766, - 767,7,0,0,0,767,109,1,0,0,0,768,769,7,12,0,0,769,770,7,2,0,0,770,771,7, - 4,0,0,771,111,1,0,0,0,772,773,5,61,0,0,773,113,1,0,0,0,774,775,5,58,0,0, - 775,776,5,58,0,0,776,115,1,0,0,0,777,778,5,44,0,0,778,117,1,0,0,0,779,780, - 7,0,0,0,780,781,7,3,0,0,781,782,7,2,0,0,782,783,7,4,0,0,783,119,1,0,0,0, - 784,785,5,46,0,0,785,121,1,0,0,0,786,787,7,15,0,0,787,788,7,12,0,0,788, - 789,7,13,0,0,789,790,7,2,0,0,790,791,7,3,0,0,791,123,1,0,0,0,792,793,7, - 15,0,0,793,794,7,1,0,0,794,795,7,6,0,0,795,796,7,2,0,0,796,797,7,5,0,0, - 797,125,1,0,0,0,798,799,7,13,0,0,799,800,7,12,0,0,800,801,7,2,0,0,801,802, - 7,5,0,0,802,127,1,0,0,0,803,804,5,40,0,0,804,129,1,0,0,0,805,806,7,1,0, - 0,806,807,7,9,0,0,807,131,1,0,0,0,808,809,7,1,0,0,809,810,7,2,0,0,810,133, - 1,0,0,0,811,812,7,13,0,0,812,813,7,1,0,0,813,814,7,18,0,0,814,815,7,3,0, - 0,815,135,1,0,0,0,816,817,7,9,0,0,817,818,7,7,0,0,818,819,7,5,0,0,819,137, - 1,0,0,0,820,821,7,9,0,0,821,822,7,19,0,0,822,823,7,13,0,0,823,824,7,13, - 0,0,824,139,1,0,0,0,825,826,7,9,0,0,826,827,7,19,0,0,827,828,7,13,0,0,828, - 829,7,13,0,0,829,830,7,2,0,0,830,141,1,0,0,0,831,832,7,7,0,0,832,833,7, - 6,0,0,833,143,1,0,0,0,834,835,5,63,0,0,835,145,1,0,0,0,836,837,7,6,0,0, - 837,838,7,13,0,0,838,839,7,1,0,0,839,840,7,18,0,0,840,841,7,3,0,0,841,147, - 1,0,0,0,842,843,5,41,0,0,843,149,1,0,0,0,844,845,7,5,0,0,845,846,7,6,0, - 0,846,847,7,19,0,0,847,848,7,3,0,0,848,151,1,0,0,0,849,850,5,61,0,0,850, - 851,5,61,0,0,851,153,1,0,0,0,852,853,5,61,0,0,853,854,5,126,0,0,854,155, - 1,0,0,0,855,856,5,33,0,0,856,857,5,61,0,0,857,157,1,0,0,0,858,859,5,60, - 0,0,859,159,1,0,0,0,860,861,5,60,0,0,861,862,5,61,0,0,862,161,1,0,0,0,863, - 864,5,62,0,0,864,163,1,0,0,0,865,866,5,62,0,0,866,867,5,61,0,0,867,165, - 1,0,0,0,868,869,5,43,0,0,869,167,1,0,0,0,870,871,5,45,0,0,871,169,1,0,0, - 0,872,873,5,42,0,0,873,171,1,0,0,0,874,875,5,47,0,0,875,173,1,0,0,0,876, - 877,5,37,0,0,877,175,1,0,0,0,878,879,3,144,64,0,879,883,3,82,33,0,880,882, - 3,98,41,0,881,880,1,0,0,0,882,885,1,0,0,0,883,881,1,0,0,0,883,884,1,0,0, - 0,884,893,1,0,0,0,885,883,1,0,0,0,886,888,3,144,64,0,887,889,3,80,32,0, - 888,887,1,0,0,0,889,890,1,0,0,0,890,888,1,0,0,0,890,891,1,0,0,0,891,893, - 1,0,0,0,892,878,1,0,0,0,892,886,1,0,0,0,893,177,1,0,0,0,894,895,5,91,0, - 0,895,896,1,0,0,0,896,897,6,81,0,0,897,898,6,81,0,0,898,179,1,0,0,0,899, - 900,5,93,0,0,900,901,1,0,0,0,901,902,6,82,15,0,902,903,6,82,15,0,903,181, - 1,0,0,0,904,908,3,82,33,0,905,907,3,98,41,0,906,905,1,0,0,0,907,910,1,0, - 0,0,908,906,1,0,0,0,908,909,1,0,0,0,909,921,1,0,0,0,910,908,1,0,0,0,911, - 914,3,96,40,0,912,914,3,90,37,0,913,911,1,0,0,0,913,912,1,0,0,0,914,916, - 1,0,0,0,915,917,3,98,41,0,916,915,1,0,0,0,917,918,1,0,0,0,918,916,1,0,0, - 0,918,919,1,0,0,0,919,921,1,0,0,0,920,904,1,0,0,0,920,913,1,0,0,0,921,183, - 1,0,0,0,922,924,3,92,38,0,923,925,3,94,39,0,924,923,1,0,0,0,925,926,1,0, - 0,0,926,924,1,0,0,0,926,927,1,0,0,0,927,928,1,0,0,0,928,929,3,92,38,0,929, - 185,1,0,0,0,930,931,3,184,84,0,931,187,1,0,0,0,932,933,3,58,21,0,933,934, - 1,0,0,0,934,935,6,86,11,0,935,189,1,0,0,0,936,937,3,60,22,0,937,938,1,0, - 0,0,938,939,6,87,11,0,939,191,1,0,0,0,940,941,3,62,23,0,941,942,1,0,0,0, - 942,943,6,88,11,0,943,193,1,0,0,0,944,945,3,78,31,0,945,946,1,0,0,0,946, - 947,6,89,14,0,947,948,6,89,15,0,948,195,1,0,0,0,949,950,3,178,81,0,950, - 951,1,0,0,0,951,952,6,90,12,0,952,197,1,0,0,0,953,954,3,180,82,0,954,955, - 1,0,0,0,955,956,6,91,16,0,956,199,1,0,0,0,957,958,3,116,50,0,958,959,1, - 0,0,0,959,960,6,92,17,0,960,201,1,0,0,0,961,962,3,112,48,0,962,963,1,0, - 0,0,963,964,6,93,18,0,964,203,1,0,0,0,965,966,3,100,42,0,966,967,1,0,0, - 0,967,968,6,94,19,0,968,205,1,0,0,0,969,970,7,16,0,0,970,971,7,3,0,0,971, - 972,7,5,0,0,972,973,7,12,0,0,973,974,7,0,0,0,974,975,7,12,0,0,975,976,7, - 5,0,0,976,977,7,12,0,0,977,207,1,0,0,0,978,979,3,66,25,0,979,980,1,0,0, - 0,980,981,6,96,20,0,981,209,1,0,0,0,982,983,3,58,21,0,983,984,1,0,0,0,984, - 985,6,97,11,0,985,211,1,0,0,0,986,987,3,60,22,0,987,988,1,0,0,0,988,989, - 6,98,11,0,989,213,1,0,0,0,990,991,3,62,23,0,991,992,1,0,0,0,992,993,6,99, - 11,0,993,215,1,0,0,0,994,995,3,78,31,0,995,996,1,0,0,0,996,997,6,100,14, - 0,997,998,6,100,15,0,998,217,1,0,0,0,999,1000,3,120,52,0,1000,1001,1,0, - 0,0,1001,1002,6,101,21,0,1002,219,1,0,0,0,1003,1004,3,116,50,0,1004,1005, - 1,0,0,0,1005,1006,6,102,17,0,1006,221,1,0,0,0,1007,1012,3,82,33,0,1008, - 1012,3,80,32,0,1009,1012,3,96,40,0,1010,1012,3,170,77,0,1011,1007,1,0,0, - 0,1011,1008,1,0,0,0,1011,1009,1,0,0,0,1011,1010,1,0,0,0,1012,223,1,0,0, - 0,1013,1016,3,82,33,0,1014,1016,3,170,77,0,1015,1013,1,0,0,0,1015,1014, - 1,0,0,0,1016,1020,1,0,0,0,1017,1019,3,222,103,0,1018,1017,1,0,0,0,1019, - 1022,1,0,0,0,1020,1018,1,0,0,0,1020,1021,1,0,0,0,1021,1033,1,0,0,0,1022, - 1020,1,0,0,0,1023,1026,3,96,40,0,1024,1026,3,90,37,0,1025,1023,1,0,0,0, - 1025,1024,1,0,0,0,1026,1028,1,0,0,0,1027,1029,3,222,103,0,1028,1027,1,0, - 0,0,1029,1030,1,0,0,0,1030,1028,1,0,0,0,1030,1031,1,0,0,0,1031,1033,1,0, - 0,0,1032,1015,1,0,0,0,1032,1025,1,0,0,0,1033,225,1,0,0,0,1034,1037,3,224, - 104,0,1035,1037,3,184,84,0,1036,1034,1,0,0,0,1036,1035,1,0,0,0,1037,1038, - 1,0,0,0,1038,1036,1,0,0,0,1038,1039,1,0,0,0,1039,227,1,0,0,0,1040,1041, - 3,58,21,0,1041,1042,1,0,0,0,1042,1043,6,106,11,0,1043,229,1,0,0,0,1044, - 1045,3,60,22,0,1045,1046,1,0,0,0,1046,1047,6,107,11,0,1047,231,1,0,0,0, - 1048,1049,3,62,23,0,1049,1050,1,0,0,0,1050,1051,6,108,11,0,1051,233,1,0, - 0,0,1052,1053,3,78,31,0,1053,1054,1,0,0,0,1054,1055,6,109,14,0,1055,1056, - 6,109,15,0,1056,235,1,0,0,0,1057,1058,3,112,48,0,1058,1059,1,0,0,0,1059, - 1060,6,110,18,0,1060,237,1,0,0,0,1061,1062,3,116,50,0,1062,1063,1,0,0,0, - 1063,1064,6,111,17,0,1064,239,1,0,0,0,1065,1066,3,120,52,0,1066,1067,1, - 0,0,0,1067,1068,6,112,21,0,1068,241,1,0,0,0,1069,1070,7,12,0,0,1070,1071, - 7,2,0,0,1071,243,1,0,0,0,1072,1073,3,226,105,0,1073,1074,1,0,0,0,1074,1075, - 6,114,22,0,1075,245,1,0,0,0,1076,1077,3,58,21,0,1077,1078,1,0,0,0,1078, - 1079,6,115,11,0,1079,247,1,0,0,0,1080,1081,3,60,22,0,1081,1082,1,0,0,0, - 1082,1083,6,116,11,0,1083,249,1,0,0,0,1084,1085,3,62,23,0,1085,1086,1,0, - 0,0,1086,1087,6,117,11,0,1087,251,1,0,0,0,1088,1089,3,78,31,0,1089,1090, - 1,0,0,0,1090,1091,6,118,14,0,1091,1092,6,118,15,0,1092,253,1,0,0,0,1093, - 1094,3,178,81,0,1094,1095,1,0,0,0,1095,1096,6,119,12,0,1096,1097,6,119, - 23,0,1097,255,1,0,0,0,1098,1099,7,7,0,0,1099,1100,7,9,0,0,1100,1101,1,0, - 0,0,1101,1102,6,120,24,0,1102,257,1,0,0,0,1103,1104,7,20,0,0,1104,1105, - 7,1,0,0,1105,1106,7,5,0,0,1106,1107,7,10,0,0,1107,1108,1,0,0,0,1108,1109, - 6,121,24,0,1109,259,1,0,0,0,1110,1111,8,34,0,0,1111,261,1,0,0,0,1112,1114, - 3,260,122,0,1113,1112,1,0,0,0,1114,1115,1,0,0,0,1115,1113,1,0,0,0,1115, - 1116,1,0,0,0,1116,1117,1,0,0,0,1117,1118,3,360,172,0,1118,1120,1,0,0,0, - 1119,1113,1,0,0,0,1119,1120,1,0,0,0,1120,1122,1,0,0,0,1121,1123,3,260,122, - 0,1122,1121,1,0,0,0,1123,1124,1,0,0,0,1124,1122,1,0,0,0,1124,1125,1,0,0, - 0,1125,263,1,0,0,0,1126,1127,3,186,85,0,1127,1128,1,0,0,0,1128,1129,6,124, - 25,0,1129,265,1,0,0,0,1130,1131,3,262,123,0,1131,1132,1,0,0,0,1132,1133, - 6,125,26,0,1133,267,1,0,0,0,1134,1135,3,58,21,0,1135,1136,1,0,0,0,1136, - 1137,6,126,11,0,1137,269,1,0,0,0,1138,1139,3,60,22,0,1139,1140,1,0,0,0, - 1140,1141,6,127,11,0,1141,271,1,0,0,0,1142,1143,3,62,23,0,1143,1144,1,0, - 0,0,1144,1145,6,128,11,0,1145,273,1,0,0,0,1146,1147,3,78,31,0,1147,1148, - 1,0,0,0,1148,1149,6,129,14,0,1149,1150,6,129,15,0,1150,1151,6,129,15,0, - 1151,275,1,0,0,0,1152,1153,3,112,48,0,1153,1154,1,0,0,0,1154,1155,6,130, - 18,0,1155,277,1,0,0,0,1156,1157,3,116,50,0,1157,1158,1,0,0,0,1158,1159, - 6,131,17,0,1159,279,1,0,0,0,1160,1161,3,120,52,0,1161,1162,1,0,0,0,1162, - 1163,6,132,21,0,1163,281,1,0,0,0,1164,1165,3,258,121,0,1165,1166,1,0,0, - 0,1166,1167,6,133,27,0,1167,283,1,0,0,0,1168,1169,3,226,105,0,1169,1170, - 1,0,0,0,1170,1171,6,134,22,0,1171,285,1,0,0,0,1172,1173,3,186,85,0,1173, - 1174,1,0,0,0,1174,1175,6,135,25,0,1175,287,1,0,0,0,1176,1177,3,58,21,0, - 1177,1178,1,0,0,0,1178,1179,6,136,11,0,1179,289,1,0,0,0,1180,1181,3,60, - 22,0,1181,1182,1,0,0,0,1182,1183,6,137,11,0,1183,291,1,0,0,0,1184,1185, - 3,62,23,0,1185,1186,1,0,0,0,1186,1187,6,138,11,0,1187,293,1,0,0,0,1188, - 1189,3,78,31,0,1189,1190,1,0,0,0,1190,1191,6,139,14,0,1191,1192,6,139,15, - 0,1192,295,1,0,0,0,1193,1194,3,116,50,0,1194,1195,1,0,0,0,1195,1196,6,140, - 17,0,1196,297,1,0,0,0,1197,1198,3,120,52,0,1198,1199,1,0,0,0,1199,1200, - 6,141,21,0,1200,299,1,0,0,0,1201,1202,3,256,120,0,1202,1203,1,0,0,0,1203, - 1204,6,142,28,0,1204,1205,6,142,29,0,1205,301,1,0,0,0,1206,1207,3,66,25, - 0,1207,1208,1,0,0,0,1208,1209,6,143,20,0,1209,303,1,0,0,0,1210,1211,3,58, - 21,0,1211,1212,1,0,0,0,1212,1213,6,144,11,0,1213,305,1,0,0,0,1214,1215, - 3,60,22,0,1215,1216,1,0,0,0,1216,1217,6,145,11,0,1217,307,1,0,0,0,1218, - 1219,3,62,23,0,1219,1220,1,0,0,0,1220,1221,6,146,11,0,1221,309,1,0,0,0, - 1222,1223,3,78,31,0,1223,1224,1,0,0,0,1224,1225,6,147,14,0,1225,1226,6, - 147,15,0,1226,1227,6,147,15,0,1227,311,1,0,0,0,1228,1229,3,116,50,0,1229, - 1230,1,0,0,0,1230,1231,6,148,17,0,1231,313,1,0,0,0,1232,1233,3,120,52,0, - 1233,1234,1,0,0,0,1234,1235,6,149,21,0,1235,315,1,0,0,0,1236,1237,3,226, - 105,0,1237,1238,1,0,0,0,1238,1239,6,150,22,0,1239,317,1,0,0,0,1240,1241, - 3,58,21,0,1241,1242,1,0,0,0,1242,1243,6,151,11,0,1243,319,1,0,0,0,1244, - 1245,3,60,22,0,1245,1246,1,0,0,0,1246,1247,6,152,11,0,1247,321,1,0,0,0, - 1248,1249,3,62,23,0,1249,1250,1,0,0,0,1250,1251,6,153,11,0,1251,323,1,0, - 0,0,1252,1253,3,78,31,0,1253,1254,1,0,0,0,1254,1255,6,154,14,0,1255,1256, - 6,154,15,0,1256,325,1,0,0,0,1257,1258,3,120,52,0,1258,1259,1,0,0,0,1259, - 1260,6,155,21,0,1260,327,1,0,0,0,1261,1262,3,186,85,0,1262,1263,1,0,0,0, - 1263,1264,6,156,25,0,1264,329,1,0,0,0,1265,1266,3,182,83,0,1266,1267,1, - 0,0,0,1267,1268,6,157,30,0,1268,331,1,0,0,0,1269,1270,3,58,21,0,1270,1271, - 1,0,0,0,1271,1272,6,158,11,0,1272,333,1,0,0,0,1273,1274,3,60,22,0,1274, - 1275,1,0,0,0,1275,1276,6,159,11,0,1276,335,1,0,0,0,1277,1278,3,62,23,0, - 1278,1279,1,0,0,0,1279,1280,6,160,11,0,1280,337,1,0,0,0,1281,1282,3,78, - 31,0,1282,1283,1,0,0,0,1283,1284,6,161,14,0,1284,1285,6,161,15,0,1285,339, - 1,0,0,0,1286,1287,7,1,0,0,1287,1288,7,9,0,0,1288,1289,7,15,0,0,1289,1290, - 7,7,0,0,1290,341,1,0,0,0,1291,1292,3,58,21,0,1292,1293,1,0,0,0,1293,1294, - 6,163,11,0,1294,343,1,0,0,0,1295,1296,3,60,22,0,1296,1297,1,0,0,0,1297, - 1298,6,164,11,0,1298,345,1,0,0,0,1299,1300,3,62,23,0,1300,1301,1,0,0,0, - 1301,1302,6,165,11,0,1302,347,1,0,0,0,1303,1304,3,78,31,0,1304,1305,1,0, - 0,0,1305,1306,6,166,14,0,1306,1307,6,166,15,0,1307,349,1,0,0,0,1308,1309, - 7,15,0,0,1309,1310,7,19,0,0,1310,1311,7,9,0,0,1311,1312,7,4,0,0,1312,1313, - 7,5,0,0,1313,1314,7,1,0,0,1314,1315,7,7,0,0,1315,1316,7,9,0,0,1316,1317, - 7,2,0,0,1317,351,1,0,0,0,1318,1319,3,58,21,0,1319,1320,1,0,0,0,1320,1321, - 6,168,11,0,1321,353,1,0,0,0,1322,1323,3,60,22,0,1323,1324,1,0,0,0,1324, - 1325,6,169,11,0,1325,355,1,0,0,0,1326,1327,3,62,23,0,1327,1328,1,0,0,0, - 1328,1329,6,170,11,0,1329,357,1,0,0,0,1330,1331,3,180,82,0,1331,1332,1, - 0,0,0,1332,1333,6,171,16,0,1333,1334,6,171,15,0,1334,359,1,0,0,0,1335,1336, - 5,58,0,0,1336,361,1,0,0,0,1337,1343,3,90,37,0,1338,1343,3,80,32,0,1339, - 1343,3,120,52,0,1340,1343,3,82,33,0,1341,1343,3,96,40,0,1342,1337,1,0,0, - 0,1342,1338,1,0,0,0,1342,1339,1,0,0,0,1342,1340,1,0,0,0,1342,1341,1,0,0, - 0,1343,1344,1,0,0,0,1344,1342,1,0,0,0,1344,1345,1,0,0,0,1345,363,1,0,0, - 0,1346,1347,3,58,21,0,1347,1348,1,0,0,0,1348,1349,6,174,11,0,1349,365,1, - 0,0,0,1350,1351,3,60,22,0,1351,1352,1,0,0,0,1352,1353,6,175,11,0,1353,367, - 1,0,0,0,1354,1355,3,62,23,0,1355,1356,1,0,0,0,1356,1357,6,176,11,0,1357, - 369,1,0,0,0,1358,1359,3,78,31,0,1359,1360,1,0,0,0,1360,1361,6,177,14,0, - 1361,1362,6,177,15,0,1362,371,1,0,0,0,1363,1364,3,66,25,0,1364,1365,1,0, - 0,0,1365,1366,6,178,20,0,1366,1367,6,178,15,0,1367,1368,6,178,31,0,1368, - 373,1,0,0,0,1369,1370,3,58,21,0,1370,1371,1,0,0,0,1371,1372,6,179,11,0, - 1372,375,1,0,0,0,1373,1374,3,60,22,0,1374,1375,1,0,0,0,1375,1376,6,180, - 11,0,1376,377,1,0,0,0,1377,1378,3,62,23,0,1378,1379,1,0,0,0,1379,1380,6, - 181,11,0,1380,379,1,0,0,0,1381,1382,3,116,50,0,1382,1383,1,0,0,0,1383,1384, - 6,182,17,0,1384,1385,6,182,15,0,1385,1386,6,182,7,0,1386,381,1,0,0,0,1387, - 1388,3,58,21,0,1388,1389,1,0,0,0,1389,1390,6,183,11,0,1390,383,1,0,0,0, - 1391,1392,3,60,22,0,1392,1393,1,0,0,0,1393,1394,6,184,11,0,1394,385,1,0, - 0,0,1395,1396,3,62,23,0,1396,1397,1,0,0,0,1397,1398,6,185,11,0,1398,387, - 1,0,0,0,1399,1400,3,186,85,0,1400,1401,1,0,0,0,1401,1402,6,186,15,0,1402, - 1403,6,186,0,0,1403,1404,6,186,25,0,1404,389,1,0,0,0,1405,1406,3,182,83, - 0,1406,1407,1,0,0,0,1407,1408,6,187,15,0,1408,1409,6,187,0,0,1409,1410, - 6,187,30,0,1410,391,1,0,0,0,1411,1412,3,106,45,0,1412,1413,1,0,0,0,1413, - 1414,6,188,15,0,1414,1415,6,188,0,0,1415,1416,6,188,32,0,1416,393,1,0,0, - 0,1417,1418,3,78,31,0,1418,1419,1,0,0,0,1419,1420,6,189,14,0,1420,1421, - 6,189,15,0,1421,395,1,0,0,0,65,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,568, - 578,582,585,594,596,607,614,619,658,663,672,679,684,686,697,705,708,710, - 715,720,726,733,738,744,747,755,759,883,890,892,908,913,918,920,926,1011, - 1015,1020,1025,1030,1032,1036,1038,1115,1119,1124,1342,1344,33,5,2,0,5, + 2,187,7,187,2,188,7,188,2,189,7,189,2,190,7,190,2,191,7,191,2,192,7,192, + 2,193,7,193,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3, + 1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6, + 1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1, + 11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1, + 14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1, + 18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,4,20,575,8,20,11,20, + 12,20,576,1,20,1,20,1,21,1,21,1,21,1,21,5,21,585,8,21,10,21,12,21,588,9, + 21,1,21,3,21,591,8,21,1,21,3,21,594,8,21,1,21,1,21,1,22,1,22,1,22,1,22, + 1,22,5,22,603,8,22,10,22,12,22,606,9,22,1,22,1,22,1,22,1,22,1,22,1,23,4, + 23,614,8,23,11,23,12,23,615,1,23,1,23,1,24,1,24,1,24,3,24,623,8,24,1,25, + 4,25,626,8,25,11,25,12,25,627,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1, + 27,1,27,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,31, + 1,31,1,31,1,31,1,32,1,32,1,33,1,33,1,34,1,34,1,34,1,35,1,35,1,36,1,36,3, + 36,667,8,36,1,36,4,36,670,8,36,11,36,12,36,671,1,37,1,37,1,38,1,38,1,39, + 1,39,1,39,3,39,681,8,39,1,40,1,40,1,41,1,41,1,41,3,41,688,8,41,1,42,1,42, + 1,42,5,42,693,8,42,10,42,12,42,696,9,42,1,42,1,42,1,42,1,42,1,42,1,42,5, + 42,704,8,42,10,42,12,42,707,9,42,1,42,1,42,1,42,1,42,1,42,3,42,714,8,42, + 1,42,3,42,717,8,42,3,42,719,8,42,1,43,4,43,722,8,43,11,43,12,43,723,1,44, + 4,44,727,8,44,11,44,12,44,728,1,44,1,44,5,44,733,8,44,10,44,12,44,736,9, + 44,1,44,1,44,4,44,740,8,44,11,44,12,44,741,1,44,4,44,745,8,44,11,44,12, + 44,746,1,44,1,44,5,44,751,8,44,10,44,12,44,754,9,44,3,44,756,8,44,1,44, + 1,44,1,44,1,44,4,44,762,8,44,11,44,12,44,763,1,44,1,44,3,44,768,8,44,1, + 45,1,45,1,45,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,48,1,48,1,49,1,49, + 1,49,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,53,1,53,1,53,1,53,1, + 53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,56,1,56, + 1,57,1,57,1,57,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1, + 60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63, + 1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,67,1,67,1,67,1,67,1, + 67,1,68,1,68,1,68,1,69,1,69,1,69,1,70,1,70,1,70,1,71,1,71,1,72,1,72,1,72, + 1,73,1,73,1,74,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78,1,78,1,79,1, + 79,1,80,1,80,1,80,5,80,890,8,80,10,80,12,80,893,9,80,1,80,1,80,4,80,897, + 8,80,11,80,12,80,898,3,80,901,8,80,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1, + 82,1,82,1,82,1,83,1,83,5,83,915,8,83,10,83,12,83,918,9,83,1,83,1,83,3,83, + 922,8,83,1,83,4,83,925,8,83,11,83,12,83,926,3,83,929,8,83,1,84,1,84,4,84, + 933,8,84,11,84,12,84,934,1,84,1,84,1,85,1,85,1,86,1,86,1,86,1,86,1,87,1, + 87,1,87,1,87,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90, + 1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1, + 94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96, + 1,96,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,100, + 1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102, + 1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104,3,104,1024,8,104,1,105, + 1,105,3,105,1028,8,105,1,105,5,105,1031,8,105,10,105,12,105,1034,9,105, + 1,105,1,105,3,105,1038,8,105,1,105,4,105,1041,8,105,11,105,12,105,1042, + 3,105,1045,8,105,1,106,1,106,4,106,1049,8,106,11,106,12,106,1050,1,107, + 1,107,1,107,1,107,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,110, + 1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112, + 1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,116, + 1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,119, + 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,121, + 1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,124, + 4,124,1126,8,124,11,124,12,124,1127,1,124,1,124,3,124,1132,8,124,1,124, + 4,124,1135,8,124,11,124,12,124,1136,1,125,1,125,1,125,1,125,1,126,1,126, + 1,126,1,126,1,127,1,127,1,127,1,127,1,128,1,128,1,128,1,128,1,129,1,129, + 1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131, + 1,132,1,132,1,132,1,132,1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134, + 1,135,1,135,1,135,1,135,1,136,1,136,1,136,1,136,1,137,1,137,1,137,1,137, + 1,138,1,138,1,138,1,138,1,139,1,139,1,139,1,139,1,139,1,140,1,140,1,140, + 1,140,1,141,1,141,1,141,1,141,1,142,1,142,1,142,1,142,1,143,1,143,1,143, + 1,143,1,143,1,144,1,144,1,144,1,144,1,145,1,145,1,145,1,145,1,146,1,146, + 1,146,1,146,1,147,1,147,1,147,1,147,1,148,1,148,1,148,1,148,1,149,1,149, + 1,149,1,149,1,149,1,149,1,150,1,150,1,150,1,150,1,151,1,151,1,151,1,151, + 1,152,1,152,1,152,1,152,1,153,1,153,1,153,1,153,1,154,1,154,1,154,1,154, + 1,155,1,155,1,155,1,155,1,156,1,156,1,156,1,156,1,156,1,157,1,157,1,157, + 1,157,1,158,1,158,1,158,1,158,1,159,1,159,1,159,1,159,1,160,1,160,1,160, + 1,160,1,161,1,161,1,161,1,161,1,162,1,162,1,162,1,162,1,163,1,163,1,163, + 1,163,1,163,1,164,1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,165,1,166, + 1,166,1,166,1,166,1,167,1,167,1,167,1,167,1,168,1,168,1,168,1,168,1,168, + 1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,169,1,170,1,170, + 1,170,1,170,1,171,1,171,1,171,1,171,1,172,1,172,1,172,1,172,1,173,1,173, + 1,173,1,173,1,173,1,174,1,174,1,175,1,175,1,175,1,175,1,175,4,175,1359, + 8,175,11,175,12,175,1360,1,176,1,176,1,176,1,176,1,177,1,177,1,177,1,177, + 1,178,1,178,1,178,1,178,1,179,1,179,1,179,1,179,1,179,1,180,1,180,1,180, + 1,180,1,180,1,180,1,181,1,181,1,181,1,181,1,181,1,181,1,182,1,182,1,182, + 1,182,1,183,1,183,1,183,1,183,1,184,1,184,1,184,1,184,1,185,1,185,1,185, + 1,185,1,185,1,185,1,186,1,186,1,186,1,186,1,186,1,186,1,187,1,187,1,187, + 1,187,1,188,1,188,1,188,1,188,1,189,1,189,1,189,1,189,1,190,1,190,1,190, + 1,190,1,190,1,190,1,191,1,191,1,191,1,191,1,191,1,191,1,192,1,192,1,192, + 1,192,1,192,1,192,1,193,1,193,1,193,1,193,1,193,2,604,705,0,194,16,1,18, + 2,20,3,22,4,24,5,26,6,28,7,30,8,32,9,34,10,36,11,38,12,40,13,42,14,44,15, + 46,16,48,17,50,18,52,19,54,20,56,21,58,22,60,23,62,24,64,0,66,25,68,0,70, + 0,72,26,74,27,76,28,78,29,80,0,82,0,84,0,86,0,88,0,90,0,92,0,94,0,96,0, + 98,0,100,30,102,31,104,32,106,33,108,34,110,35,112,36,114,37,116,38,118, + 39,120,40,122,41,124,42,126,43,128,44,130,45,132,46,134,47,136,48,138,49, + 140,50,142,51,144,52,146,53,148,54,150,55,152,56,154,57,156,58,158,59,160, + 60,162,61,164,62,166,63,168,64,170,65,172,66,174,67,176,68,178,69,180,70, + 182,71,184,0,186,72,188,73,190,74,192,75,194,0,196,0,198,0,200,0,202,0, + 204,0,206,76,208,0,210,0,212,77,214,78,216,79,218,0,220,0,222,0,224,0,226, + 0,228,80,230,81,232,82,234,83,236,0,238,0,240,0,242,0,244,84,246,0,248, + 85,250,86,252,87,254,0,256,0,258,88,260,89,262,0,264,90,266,0,268,91,270, + 92,272,93,274,0,276,0,278,0,280,0,282,0,284,0,286,0,288,94,290,95,292,96, + 294,0,296,0,298,0,300,0,302,0,304,0,306,0,308,97,310,98,312,99,314,0,316, + 0,318,0,320,0,322,100,324,101,326,102,328,0,330,0,332,0,334,0,336,103,338, + 104,340,105,342,0,344,106,346,107,348,108,350,109,352,0,354,110,356,111, + 358,112,360,113,362,0,364,114,366,115,368,116,370,117,372,118,374,0,376, + 0,378,0,380,119,382,120,384,121,386,0,388,0,390,122,392,123,394,124,396, + 0,398,0,400,0,402,0,16,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,35,2,0,68, + 68,100,100,2,0,73,73,105,105,2,0,83,83,115,115,2,0,69,69,101,101,2,0,67, + 67,99,99,2,0,84,84,116,116,2,0,82,82,114,114,2,0,79,79,111,111,2,0,80,80, + 112,112,2,0,78,78,110,110,2,0,72,72,104,104,2,0,86,86,118,118,2,0,65,65, + 97,97,2,0,76,76,108,108,2,0,88,88,120,120,2,0,70,70,102,102,2,0,77,77,109, + 109,2,0,71,71,103,103,2,0,75,75,107,107,2,0,85,85,117,117,2,0,87,87,119, + 119,6,0,9,10,13,13,32,32,47,47,91,91,93,93,2,0,10,10,13,13,3,0,9,10,13, + 13,32,32,11,0,9,10,13,13,32,32,34,34,44,44,47,47,58,58,61,61,91,91,93,93, + 124,124,2,0,42,42,47,47,1,0,48,57,2,0,65,90,97,122,8,0,34,34,78,78,82,82, + 84,84,92,92,110,110,114,114,116,116,4,0,10,10,13,13,34,34,92,92,2,0,43, + 43,45,45,1,0,96,96,2,0,66,66,98,98,2,0,89,89,121,121,11,0,9,10,13,13,32, + 32,34,35,44,44,47,47,58,58,60,60,62,63,92,92,124,124,1476,0,16,1,0,0,0, + 0,18,1,0,0,0,0,20,1,0,0,0,0,22,1,0,0,0,0,24,1,0,0,0,0,26,1,0,0,0,0,28,1, + 0,0,0,0,30,1,0,0,0,0,32,1,0,0,0,0,34,1,0,0,0,0,36,1,0,0,0,0,38,1,0,0,0, + 0,40,1,0,0,0,0,42,1,0,0,0,0,44,1,0,0,0,0,46,1,0,0,0,0,48,1,0,0,0,0,50,1, + 0,0,0,0,52,1,0,0,0,0,54,1,0,0,0,0,56,1,0,0,0,0,58,1,0,0,0,0,60,1,0,0,0, + 0,62,1,0,0,0,0,66,1,0,0,0,1,68,1,0,0,0,1,70,1,0,0,0,1,72,1,0,0,0,1,74,1, + 0,0,0,1,76,1,0,0,0,2,78,1,0,0,0,2,100,1,0,0,0,2,102,1,0,0,0,2,104,1,0,0, + 0,2,106,1,0,0,0,2,108,1,0,0,0,2,110,1,0,0,0,2,112,1,0,0,0,2,114,1,0,0,0, + 2,116,1,0,0,0,2,118,1,0,0,0,2,120,1,0,0,0,2,122,1,0,0,0,2,124,1,0,0,0,2, + 126,1,0,0,0,2,128,1,0,0,0,2,130,1,0,0,0,2,132,1,0,0,0,2,134,1,0,0,0,2,136, + 1,0,0,0,2,138,1,0,0,0,2,140,1,0,0,0,2,142,1,0,0,0,2,144,1,0,0,0,2,146,1, + 0,0,0,2,148,1,0,0,0,2,150,1,0,0,0,2,152,1,0,0,0,2,154,1,0,0,0,2,156,1,0, + 0,0,2,158,1,0,0,0,2,160,1,0,0,0,2,162,1,0,0,0,2,164,1,0,0,0,2,166,1,0,0, + 0,2,168,1,0,0,0,2,170,1,0,0,0,2,172,1,0,0,0,2,174,1,0,0,0,2,176,1,0,0,0, + 2,178,1,0,0,0,2,180,1,0,0,0,2,182,1,0,0,0,2,186,1,0,0,0,2,188,1,0,0,0,2, + 190,1,0,0,0,2,192,1,0,0,0,3,194,1,0,0,0,3,196,1,0,0,0,3,198,1,0,0,0,3,200, + 1,0,0,0,3,202,1,0,0,0,3,204,1,0,0,0,3,206,1,0,0,0,3,208,1,0,0,0,3,210,1, + 0,0,0,3,212,1,0,0,0,3,214,1,0,0,0,3,216,1,0,0,0,4,218,1,0,0,0,4,220,1,0, + 0,0,4,222,1,0,0,0,4,228,1,0,0,0,4,230,1,0,0,0,4,232,1,0,0,0,4,234,1,0,0, + 0,5,236,1,0,0,0,5,238,1,0,0,0,5,240,1,0,0,0,5,242,1,0,0,0,5,244,1,0,0,0, + 5,246,1,0,0,0,5,248,1,0,0,0,5,250,1,0,0,0,5,252,1,0,0,0,6,254,1,0,0,0,6, + 256,1,0,0,0,6,258,1,0,0,0,6,260,1,0,0,0,6,264,1,0,0,0,6,266,1,0,0,0,6,268, + 1,0,0,0,6,270,1,0,0,0,6,272,1,0,0,0,7,274,1,0,0,0,7,276,1,0,0,0,7,278,1, + 0,0,0,7,280,1,0,0,0,7,282,1,0,0,0,7,284,1,0,0,0,7,286,1,0,0,0,7,288,1,0, + 0,0,7,290,1,0,0,0,7,292,1,0,0,0,8,294,1,0,0,0,8,296,1,0,0,0,8,298,1,0,0, + 0,8,300,1,0,0,0,8,302,1,0,0,0,8,304,1,0,0,0,8,306,1,0,0,0,8,308,1,0,0,0, + 8,310,1,0,0,0,8,312,1,0,0,0,9,314,1,0,0,0,9,316,1,0,0,0,9,318,1,0,0,0,9, + 320,1,0,0,0,9,322,1,0,0,0,9,324,1,0,0,0,9,326,1,0,0,0,10,328,1,0,0,0,10, + 330,1,0,0,0,10,332,1,0,0,0,10,334,1,0,0,0,10,336,1,0,0,0,10,338,1,0,0,0, + 10,340,1,0,0,0,11,342,1,0,0,0,11,344,1,0,0,0,11,346,1,0,0,0,11,348,1,0, + 0,0,11,350,1,0,0,0,12,352,1,0,0,0,12,354,1,0,0,0,12,356,1,0,0,0,12,358, + 1,0,0,0,12,360,1,0,0,0,13,362,1,0,0,0,13,364,1,0,0,0,13,366,1,0,0,0,13, + 368,1,0,0,0,13,370,1,0,0,0,13,372,1,0,0,0,14,374,1,0,0,0,14,376,1,0,0,0, + 14,378,1,0,0,0,14,380,1,0,0,0,14,382,1,0,0,0,14,384,1,0,0,0,15,386,1,0, + 0,0,15,388,1,0,0,0,15,390,1,0,0,0,15,392,1,0,0,0,15,394,1,0,0,0,15,396, + 1,0,0,0,15,398,1,0,0,0,15,400,1,0,0,0,15,402,1,0,0,0,16,404,1,0,0,0,18, + 414,1,0,0,0,20,421,1,0,0,0,22,430,1,0,0,0,24,437,1,0,0,0,26,447,1,0,0,0, + 28,454,1,0,0,0,30,461,1,0,0,0,32,475,1,0,0,0,34,482,1,0,0,0,36,490,1,0, + 0,0,38,499,1,0,0,0,40,506,1,0,0,0,42,516,1,0,0,0,44,528,1,0,0,0,46,537, + 1,0,0,0,48,543,1,0,0,0,50,550,1,0,0,0,52,557,1,0,0,0,54,565,1,0,0,0,56, + 574,1,0,0,0,58,580,1,0,0,0,60,597,1,0,0,0,62,613,1,0,0,0,64,622,1,0,0,0, + 66,625,1,0,0,0,68,629,1,0,0,0,70,634,1,0,0,0,72,639,1,0,0,0,74,643,1,0, + 0,0,76,647,1,0,0,0,78,651,1,0,0,0,80,655,1,0,0,0,82,657,1,0,0,0,84,659, + 1,0,0,0,86,662,1,0,0,0,88,664,1,0,0,0,90,673,1,0,0,0,92,675,1,0,0,0,94, + 680,1,0,0,0,96,682,1,0,0,0,98,687,1,0,0,0,100,718,1,0,0,0,102,721,1,0,0, + 0,104,767,1,0,0,0,106,769,1,0,0,0,108,772,1,0,0,0,110,776,1,0,0,0,112,780, + 1,0,0,0,114,782,1,0,0,0,116,785,1,0,0,0,118,787,1,0,0,0,120,792,1,0,0,0, + 122,794,1,0,0,0,124,800,1,0,0,0,126,806,1,0,0,0,128,811,1,0,0,0,130,813, + 1,0,0,0,132,816,1,0,0,0,134,819,1,0,0,0,136,824,1,0,0,0,138,828,1,0,0,0, + 140,833,1,0,0,0,142,839,1,0,0,0,144,842,1,0,0,0,146,844,1,0,0,0,148,850, + 1,0,0,0,150,852,1,0,0,0,152,857,1,0,0,0,154,860,1,0,0,0,156,863,1,0,0,0, + 158,866,1,0,0,0,160,868,1,0,0,0,162,871,1,0,0,0,164,873,1,0,0,0,166,876, + 1,0,0,0,168,878,1,0,0,0,170,880,1,0,0,0,172,882,1,0,0,0,174,884,1,0,0,0, + 176,900,1,0,0,0,178,902,1,0,0,0,180,907,1,0,0,0,182,928,1,0,0,0,184,930, + 1,0,0,0,186,938,1,0,0,0,188,940,1,0,0,0,190,944,1,0,0,0,192,948,1,0,0,0, + 194,952,1,0,0,0,196,957,1,0,0,0,198,961,1,0,0,0,200,965,1,0,0,0,202,969, + 1,0,0,0,204,973,1,0,0,0,206,977,1,0,0,0,208,986,1,0,0,0,210,990,1,0,0,0, + 212,994,1,0,0,0,214,998,1,0,0,0,216,1002,1,0,0,0,218,1006,1,0,0,0,220,1011, + 1,0,0,0,222,1015,1,0,0,0,224,1023,1,0,0,0,226,1044,1,0,0,0,228,1048,1,0, + 0,0,230,1052,1,0,0,0,232,1056,1,0,0,0,234,1060,1,0,0,0,236,1064,1,0,0,0, + 238,1069,1,0,0,0,240,1073,1,0,0,0,242,1077,1,0,0,0,244,1081,1,0,0,0,246, + 1084,1,0,0,0,248,1088,1,0,0,0,250,1092,1,0,0,0,252,1096,1,0,0,0,254,1100, + 1,0,0,0,256,1105,1,0,0,0,258,1110,1,0,0,0,260,1115,1,0,0,0,262,1122,1,0, + 0,0,264,1131,1,0,0,0,266,1138,1,0,0,0,268,1142,1,0,0,0,270,1146,1,0,0,0, + 272,1150,1,0,0,0,274,1154,1,0,0,0,276,1160,1,0,0,0,278,1164,1,0,0,0,280, + 1168,1,0,0,0,282,1172,1,0,0,0,284,1176,1,0,0,0,286,1180,1,0,0,0,288,1184, + 1,0,0,0,290,1188,1,0,0,0,292,1192,1,0,0,0,294,1196,1,0,0,0,296,1201,1,0, + 0,0,298,1205,1,0,0,0,300,1209,1,0,0,0,302,1213,1,0,0,0,304,1218,1,0,0,0, + 306,1222,1,0,0,0,308,1226,1,0,0,0,310,1230,1,0,0,0,312,1234,1,0,0,0,314, + 1238,1,0,0,0,316,1244,1,0,0,0,318,1248,1,0,0,0,320,1252,1,0,0,0,322,1256, + 1,0,0,0,324,1260,1,0,0,0,326,1264,1,0,0,0,328,1268,1,0,0,0,330,1273,1,0, + 0,0,332,1277,1,0,0,0,334,1281,1,0,0,0,336,1285,1,0,0,0,338,1289,1,0,0,0, + 340,1293,1,0,0,0,342,1297,1,0,0,0,344,1302,1,0,0,0,346,1307,1,0,0,0,348, + 1311,1,0,0,0,350,1315,1,0,0,0,352,1319,1,0,0,0,354,1324,1,0,0,0,356,1334, + 1,0,0,0,358,1338,1,0,0,0,360,1342,1,0,0,0,362,1346,1,0,0,0,364,1351,1,0, + 0,0,366,1358,1,0,0,0,368,1362,1,0,0,0,370,1366,1,0,0,0,372,1370,1,0,0,0, + 374,1374,1,0,0,0,376,1379,1,0,0,0,378,1385,1,0,0,0,380,1391,1,0,0,0,382, + 1395,1,0,0,0,384,1399,1,0,0,0,386,1403,1,0,0,0,388,1409,1,0,0,0,390,1415, + 1,0,0,0,392,1419,1,0,0,0,394,1423,1,0,0,0,396,1427,1,0,0,0,398,1433,1,0, + 0,0,400,1439,1,0,0,0,402,1445,1,0,0,0,404,405,7,0,0,0,405,406,7,1,0,0,406, + 407,7,2,0,0,407,408,7,2,0,0,408,409,7,3,0,0,409,410,7,4,0,0,410,411,7,5, + 0,0,411,412,1,0,0,0,412,413,6,0,0,0,413,17,1,0,0,0,414,415,7,0,0,0,415, + 416,7,6,0,0,416,417,7,7,0,0,417,418,7,8,0,0,418,419,1,0,0,0,419,420,6,1, + 1,0,420,19,1,0,0,0,421,422,7,3,0,0,422,423,7,9,0,0,423,424,7,6,0,0,424, + 425,7,1,0,0,425,426,7,4,0,0,426,427,7,10,0,0,427,428,1,0,0,0,428,429,6, + 2,2,0,429,21,1,0,0,0,430,431,7,3,0,0,431,432,7,11,0,0,432,433,7,12,0,0, + 433,434,7,13,0,0,434,435,1,0,0,0,435,436,6,3,0,0,436,23,1,0,0,0,437,438, + 7,3,0,0,438,439,7,14,0,0,439,440,7,8,0,0,440,441,7,13,0,0,441,442,7,12, + 0,0,442,443,7,1,0,0,443,444,7,9,0,0,444,445,1,0,0,0,445,446,6,4,3,0,446, + 25,1,0,0,0,447,448,7,15,0,0,448,449,7,6,0,0,449,450,7,7,0,0,450,451,7,16, + 0,0,451,452,1,0,0,0,452,453,6,5,4,0,453,27,1,0,0,0,454,455,7,17,0,0,455, + 456,7,6,0,0,456,457,7,7,0,0,457,458,7,18,0,0,458,459,1,0,0,0,459,460,6, + 6,0,0,460,29,1,0,0,0,461,462,7,1,0,0,462,463,7,9,0,0,463,464,7,13,0,0,464, + 465,7,1,0,0,465,466,7,9,0,0,466,467,7,3,0,0,467,468,7,2,0,0,468,469,7,5, + 0,0,469,470,7,12,0,0,470,471,7,5,0,0,471,472,7,2,0,0,472,473,1,0,0,0,473, + 474,6,7,0,0,474,31,1,0,0,0,475,476,7,18,0,0,476,477,7,3,0,0,477,478,7,3, + 0,0,478,479,7,8,0,0,479,480,1,0,0,0,480,481,6,8,1,0,481,33,1,0,0,0,482, + 483,7,13,0,0,483,484,7,1,0,0,484,485,7,16,0,0,485,486,7,1,0,0,486,487,7, + 5,0,0,487,488,1,0,0,0,488,489,6,9,0,0,489,35,1,0,0,0,490,491,7,13,0,0,491, + 492,7,7,0,0,492,493,7,7,0,0,493,494,7,18,0,0,494,495,7,19,0,0,495,496,7, + 8,0,0,496,497,1,0,0,0,497,498,6,10,5,0,498,37,1,0,0,0,499,500,7,16,0,0, + 500,501,7,3,0,0,501,502,7,5,0,0,502,503,7,12,0,0,503,504,1,0,0,0,504,505, + 6,11,6,0,505,39,1,0,0,0,506,507,7,16,0,0,507,508,7,3,0,0,508,509,7,5,0, + 0,509,510,7,6,0,0,510,511,7,1,0,0,511,512,7,4,0,0,512,513,7,2,0,0,513,514, + 1,0,0,0,514,515,6,12,7,0,515,41,1,0,0,0,516,517,7,16,0,0,517,518,7,11,0, + 0,518,519,5,95,0,0,519,520,7,3,0,0,520,521,7,14,0,0,521,522,7,8,0,0,522, + 523,7,12,0,0,523,524,7,9,0,0,524,525,7,0,0,0,525,526,1,0,0,0,526,527,6, + 13,8,0,527,43,1,0,0,0,528,529,7,6,0,0,529,530,7,3,0,0,530,531,7,9,0,0,531, + 532,7,12,0,0,532,533,7,16,0,0,533,534,7,3,0,0,534,535,1,0,0,0,535,536,6, + 14,9,0,536,45,1,0,0,0,537,538,7,6,0,0,538,539,7,7,0,0,539,540,7,20,0,0, + 540,541,1,0,0,0,541,542,6,15,0,0,542,47,1,0,0,0,543,544,7,2,0,0,544,545, + 7,10,0,0,545,546,7,7,0,0,546,547,7,20,0,0,547,548,1,0,0,0,548,549,6,16, + 10,0,549,49,1,0,0,0,550,551,7,2,0,0,551,552,7,7,0,0,552,553,7,6,0,0,553, + 554,7,5,0,0,554,555,1,0,0,0,555,556,6,17,0,0,556,51,1,0,0,0,557,558,7,2, + 0,0,558,559,7,5,0,0,559,560,7,12,0,0,560,561,7,5,0,0,561,562,7,2,0,0,562, + 563,1,0,0,0,563,564,6,18,0,0,564,53,1,0,0,0,565,566,7,20,0,0,566,567,7, + 10,0,0,567,568,7,3,0,0,568,569,7,6,0,0,569,570,7,3,0,0,570,571,1,0,0,0, + 571,572,6,19,0,0,572,55,1,0,0,0,573,575,8,21,0,0,574,573,1,0,0,0,575,576, + 1,0,0,0,576,574,1,0,0,0,576,577,1,0,0,0,577,578,1,0,0,0,578,579,6,20,0, + 0,579,57,1,0,0,0,580,581,5,47,0,0,581,582,5,47,0,0,582,586,1,0,0,0,583, + 585,8,22,0,0,584,583,1,0,0,0,585,588,1,0,0,0,586,584,1,0,0,0,586,587,1, + 0,0,0,587,590,1,0,0,0,588,586,1,0,0,0,589,591,5,13,0,0,590,589,1,0,0,0, + 590,591,1,0,0,0,591,593,1,0,0,0,592,594,5,10,0,0,593,592,1,0,0,0,593,594, + 1,0,0,0,594,595,1,0,0,0,595,596,6,21,11,0,596,59,1,0,0,0,597,598,5,47,0, + 0,598,599,5,42,0,0,599,604,1,0,0,0,600,603,3,60,22,0,601,603,9,0,0,0,602, + 600,1,0,0,0,602,601,1,0,0,0,603,606,1,0,0,0,604,605,1,0,0,0,604,602,1,0, + 0,0,605,607,1,0,0,0,606,604,1,0,0,0,607,608,5,42,0,0,608,609,5,47,0,0,609, + 610,1,0,0,0,610,611,6,22,11,0,611,61,1,0,0,0,612,614,7,23,0,0,613,612,1, + 0,0,0,614,615,1,0,0,0,615,613,1,0,0,0,615,616,1,0,0,0,616,617,1,0,0,0,617, + 618,6,23,11,0,618,63,1,0,0,0,619,623,8,24,0,0,620,621,5,47,0,0,621,623, + 8,25,0,0,622,619,1,0,0,0,622,620,1,0,0,0,623,65,1,0,0,0,624,626,3,64,24, + 0,625,624,1,0,0,0,626,627,1,0,0,0,627,625,1,0,0,0,627,628,1,0,0,0,628,67, + 1,0,0,0,629,630,3,178,81,0,630,631,1,0,0,0,631,632,6,26,12,0,632,633,6, + 26,13,0,633,69,1,0,0,0,634,635,3,78,31,0,635,636,1,0,0,0,636,637,6,27,14, + 0,637,638,6,27,15,0,638,71,1,0,0,0,639,640,3,62,23,0,640,641,1,0,0,0,641, + 642,6,28,11,0,642,73,1,0,0,0,643,644,3,58,21,0,644,645,1,0,0,0,645,646, + 6,29,11,0,646,75,1,0,0,0,647,648,3,60,22,0,648,649,1,0,0,0,649,650,6,30, + 11,0,650,77,1,0,0,0,651,652,5,124,0,0,652,653,1,0,0,0,653,654,6,31,15,0, + 654,79,1,0,0,0,655,656,7,26,0,0,656,81,1,0,0,0,657,658,7,27,0,0,658,83, + 1,0,0,0,659,660,5,92,0,0,660,661,7,28,0,0,661,85,1,0,0,0,662,663,8,29,0, + 0,663,87,1,0,0,0,664,666,7,3,0,0,665,667,7,30,0,0,666,665,1,0,0,0,666,667, + 1,0,0,0,667,669,1,0,0,0,668,670,3,80,32,0,669,668,1,0,0,0,670,671,1,0,0, + 0,671,669,1,0,0,0,671,672,1,0,0,0,672,89,1,0,0,0,673,674,5,64,0,0,674,91, + 1,0,0,0,675,676,5,96,0,0,676,93,1,0,0,0,677,681,8,31,0,0,678,679,5,96,0, + 0,679,681,5,96,0,0,680,677,1,0,0,0,680,678,1,0,0,0,681,95,1,0,0,0,682,683, + 5,95,0,0,683,97,1,0,0,0,684,688,3,82,33,0,685,688,3,80,32,0,686,688,3,96, + 40,0,687,684,1,0,0,0,687,685,1,0,0,0,687,686,1,0,0,0,688,99,1,0,0,0,689, + 694,5,34,0,0,690,693,3,84,34,0,691,693,3,86,35,0,692,690,1,0,0,0,692,691, + 1,0,0,0,693,696,1,0,0,0,694,692,1,0,0,0,694,695,1,0,0,0,695,697,1,0,0,0, + 696,694,1,0,0,0,697,719,5,34,0,0,698,699,5,34,0,0,699,700,5,34,0,0,700, + 701,5,34,0,0,701,705,1,0,0,0,702,704,8,22,0,0,703,702,1,0,0,0,704,707,1, + 0,0,0,705,706,1,0,0,0,705,703,1,0,0,0,706,708,1,0,0,0,707,705,1,0,0,0,708, + 709,5,34,0,0,709,710,5,34,0,0,710,711,5,34,0,0,711,713,1,0,0,0,712,714, + 5,34,0,0,713,712,1,0,0,0,713,714,1,0,0,0,714,716,1,0,0,0,715,717,5,34,0, + 0,716,715,1,0,0,0,716,717,1,0,0,0,717,719,1,0,0,0,718,689,1,0,0,0,718,698, + 1,0,0,0,719,101,1,0,0,0,720,722,3,80,32,0,721,720,1,0,0,0,722,723,1,0,0, + 0,723,721,1,0,0,0,723,724,1,0,0,0,724,103,1,0,0,0,725,727,3,80,32,0,726, + 725,1,0,0,0,727,728,1,0,0,0,728,726,1,0,0,0,728,729,1,0,0,0,729,730,1,0, + 0,0,730,734,3,120,52,0,731,733,3,80,32,0,732,731,1,0,0,0,733,736,1,0,0, + 0,734,732,1,0,0,0,734,735,1,0,0,0,735,768,1,0,0,0,736,734,1,0,0,0,737,739, + 3,120,52,0,738,740,3,80,32,0,739,738,1,0,0,0,740,741,1,0,0,0,741,739,1, + 0,0,0,741,742,1,0,0,0,742,768,1,0,0,0,743,745,3,80,32,0,744,743,1,0,0,0, + 745,746,1,0,0,0,746,744,1,0,0,0,746,747,1,0,0,0,747,755,1,0,0,0,748,752, + 3,120,52,0,749,751,3,80,32,0,750,749,1,0,0,0,751,754,1,0,0,0,752,750,1, + 0,0,0,752,753,1,0,0,0,753,756,1,0,0,0,754,752,1,0,0,0,755,748,1,0,0,0,755, + 756,1,0,0,0,756,757,1,0,0,0,757,758,3,88,36,0,758,768,1,0,0,0,759,761,3, + 120,52,0,760,762,3,80,32,0,761,760,1,0,0,0,762,763,1,0,0,0,763,761,1,0, + 0,0,763,764,1,0,0,0,764,765,1,0,0,0,765,766,3,88,36,0,766,768,1,0,0,0,767, + 726,1,0,0,0,767,737,1,0,0,0,767,744,1,0,0,0,767,759,1,0,0,0,768,105,1,0, + 0,0,769,770,7,32,0,0,770,771,7,33,0,0,771,107,1,0,0,0,772,773,7,12,0,0, + 773,774,7,9,0,0,774,775,7,0,0,0,775,109,1,0,0,0,776,777,7,12,0,0,777,778, + 7,2,0,0,778,779,7,4,0,0,779,111,1,0,0,0,780,781,5,61,0,0,781,113,1,0,0, + 0,782,783,5,58,0,0,783,784,5,58,0,0,784,115,1,0,0,0,785,786,5,44,0,0,786, + 117,1,0,0,0,787,788,7,0,0,0,788,789,7,3,0,0,789,790,7,2,0,0,790,791,7,4, + 0,0,791,119,1,0,0,0,792,793,5,46,0,0,793,121,1,0,0,0,794,795,7,15,0,0,795, + 796,7,12,0,0,796,797,7,13,0,0,797,798,7,2,0,0,798,799,7,3,0,0,799,123,1, + 0,0,0,800,801,7,15,0,0,801,802,7,1,0,0,802,803,7,6,0,0,803,804,7,2,0,0, + 804,805,7,5,0,0,805,125,1,0,0,0,806,807,7,13,0,0,807,808,7,12,0,0,808,809, + 7,2,0,0,809,810,7,5,0,0,810,127,1,0,0,0,811,812,5,40,0,0,812,129,1,0,0, + 0,813,814,7,1,0,0,814,815,7,9,0,0,815,131,1,0,0,0,816,817,7,1,0,0,817,818, + 7,2,0,0,818,133,1,0,0,0,819,820,7,13,0,0,820,821,7,1,0,0,821,822,7,18,0, + 0,822,823,7,3,0,0,823,135,1,0,0,0,824,825,7,9,0,0,825,826,7,7,0,0,826,827, + 7,5,0,0,827,137,1,0,0,0,828,829,7,9,0,0,829,830,7,19,0,0,830,831,7,13,0, + 0,831,832,7,13,0,0,832,139,1,0,0,0,833,834,7,9,0,0,834,835,7,19,0,0,835, + 836,7,13,0,0,836,837,7,13,0,0,837,838,7,2,0,0,838,141,1,0,0,0,839,840,7, + 7,0,0,840,841,7,6,0,0,841,143,1,0,0,0,842,843,5,63,0,0,843,145,1,0,0,0, + 844,845,7,6,0,0,845,846,7,13,0,0,846,847,7,1,0,0,847,848,7,18,0,0,848,849, + 7,3,0,0,849,147,1,0,0,0,850,851,5,41,0,0,851,149,1,0,0,0,852,853,7,5,0, + 0,853,854,7,6,0,0,854,855,7,19,0,0,855,856,7,3,0,0,856,151,1,0,0,0,857, + 858,5,61,0,0,858,859,5,61,0,0,859,153,1,0,0,0,860,861,5,61,0,0,861,862, + 5,126,0,0,862,155,1,0,0,0,863,864,5,33,0,0,864,865,5,61,0,0,865,157,1,0, + 0,0,866,867,5,60,0,0,867,159,1,0,0,0,868,869,5,60,0,0,869,870,5,61,0,0, + 870,161,1,0,0,0,871,872,5,62,0,0,872,163,1,0,0,0,873,874,5,62,0,0,874,875, + 5,61,0,0,875,165,1,0,0,0,876,877,5,43,0,0,877,167,1,0,0,0,878,879,5,45, + 0,0,879,169,1,0,0,0,880,881,5,42,0,0,881,171,1,0,0,0,882,883,5,47,0,0,883, + 173,1,0,0,0,884,885,5,37,0,0,885,175,1,0,0,0,886,887,3,144,64,0,887,891, + 3,82,33,0,888,890,3,98,41,0,889,888,1,0,0,0,890,893,1,0,0,0,891,889,1,0, + 0,0,891,892,1,0,0,0,892,901,1,0,0,0,893,891,1,0,0,0,894,896,3,144,64,0, + 895,897,3,80,32,0,896,895,1,0,0,0,897,898,1,0,0,0,898,896,1,0,0,0,898,899, + 1,0,0,0,899,901,1,0,0,0,900,886,1,0,0,0,900,894,1,0,0,0,901,177,1,0,0,0, + 902,903,5,91,0,0,903,904,1,0,0,0,904,905,6,81,0,0,905,906,6,81,0,0,906, + 179,1,0,0,0,907,908,5,93,0,0,908,909,1,0,0,0,909,910,6,82,15,0,910,911, + 6,82,15,0,911,181,1,0,0,0,912,916,3,82,33,0,913,915,3,98,41,0,914,913,1, + 0,0,0,915,918,1,0,0,0,916,914,1,0,0,0,916,917,1,0,0,0,917,929,1,0,0,0,918, + 916,1,0,0,0,919,922,3,96,40,0,920,922,3,90,37,0,921,919,1,0,0,0,921,920, + 1,0,0,0,922,924,1,0,0,0,923,925,3,98,41,0,924,923,1,0,0,0,925,926,1,0,0, + 0,926,924,1,0,0,0,926,927,1,0,0,0,927,929,1,0,0,0,928,912,1,0,0,0,928,921, + 1,0,0,0,929,183,1,0,0,0,930,932,3,92,38,0,931,933,3,94,39,0,932,931,1,0, + 0,0,933,934,1,0,0,0,934,932,1,0,0,0,934,935,1,0,0,0,935,936,1,0,0,0,936, + 937,3,92,38,0,937,185,1,0,0,0,938,939,3,184,84,0,939,187,1,0,0,0,940,941, + 3,58,21,0,941,942,1,0,0,0,942,943,6,86,11,0,943,189,1,0,0,0,944,945,3,60, + 22,0,945,946,1,0,0,0,946,947,6,87,11,0,947,191,1,0,0,0,948,949,3,62,23, + 0,949,950,1,0,0,0,950,951,6,88,11,0,951,193,1,0,0,0,952,953,3,78,31,0,953, + 954,1,0,0,0,954,955,6,89,14,0,955,956,6,89,15,0,956,195,1,0,0,0,957,958, + 3,178,81,0,958,959,1,0,0,0,959,960,6,90,12,0,960,197,1,0,0,0,961,962,3, + 180,82,0,962,963,1,0,0,0,963,964,6,91,16,0,964,199,1,0,0,0,965,966,3,364, + 174,0,966,967,1,0,0,0,967,968,6,92,17,0,968,201,1,0,0,0,969,970,3,116,50, + 0,970,971,1,0,0,0,971,972,6,93,18,0,972,203,1,0,0,0,973,974,3,112,48,0, + 974,975,1,0,0,0,975,976,6,94,19,0,976,205,1,0,0,0,977,978,7,16,0,0,978, + 979,7,3,0,0,979,980,7,5,0,0,980,981,7,12,0,0,981,982,7,0,0,0,982,983,7, + 12,0,0,983,984,7,5,0,0,984,985,7,12,0,0,985,207,1,0,0,0,986,987,3,66,25, + 0,987,988,1,0,0,0,988,989,6,96,20,0,989,209,1,0,0,0,990,991,3,100,42,0, + 991,992,1,0,0,0,992,993,6,97,21,0,993,211,1,0,0,0,994,995,3,58,21,0,995, + 996,1,0,0,0,996,997,6,98,11,0,997,213,1,0,0,0,998,999,3,60,22,0,999,1000, + 1,0,0,0,1000,1001,6,99,11,0,1001,215,1,0,0,0,1002,1003,3,62,23,0,1003,1004, + 1,0,0,0,1004,1005,6,100,11,0,1005,217,1,0,0,0,1006,1007,3,78,31,0,1007, + 1008,1,0,0,0,1008,1009,6,101,14,0,1009,1010,6,101,15,0,1010,219,1,0,0,0, + 1011,1012,3,120,52,0,1012,1013,1,0,0,0,1013,1014,6,102,22,0,1014,221,1, + 0,0,0,1015,1016,3,116,50,0,1016,1017,1,0,0,0,1017,1018,6,103,18,0,1018, + 223,1,0,0,0,1019,1024,3,82,33,0,1020,1024,3,80,32,0,1021,1024,3,96,40,0, + 1022,1024,3,170,77,0,1023,1019,1,0,0,0,1023,1020,1,0,0,0,1023,1021,1,0, + 0,0,1023,1022,1,0,0,0,1024,225,1,0,0,0,1025,1028,3,82,33,0,1026,1028,3, + 170,77,0,1027,1025,1,0,0,0,1027,1026,1,0,0,0,1028,1032,1,0,0,0,1029,1031, + 3,224,104,0,1030,1029,1,0,0,0,1031,1034,1,0,0,0,1032,1030,1,0,0,0,1032, + 1033,1,0,0,0,1033,1045,1,0,0,0,1034,1032,1,0,0,0,1035,1038,3,96,40,0,1036, + 1038,3,90,37,0,1037,1035,1,0,0,0,1037,1036,1,0,0,0,1038,1040,1,0,0,0,1039, + 1041,3,224,104,0,1040,1039,1,0,0,0,1041,1042,1,0,0,0,1042,1040,1,0,0,0, + 1042,1043,1,0,0,0,1043,1045,1,0,0,0,1044,1027,1,0,0,0,1044,1037,1,0,0,0, + 1045,227,1,0,0,0,1046,1049,3,226,105,0,1047,1049,3,184,84,0,1048,1046,1, + 0,0,0,1048,1047,1,0,0,0,1049,1050,1,0,0,0,1050,1048,1,0,0,0,1050,1051,1, + 0,0,0,1051,229,1,0,0,0,1052,1053,3,58,21,0,1053,1054,1,0,0,0,1054,1055, + 6,107,11,0,1055,231,1,0,0,0,1056,1057,3,60,22,0,1057,1058,1,0,0,0,1058, + 1059,6,108,11,0,1059,233,1,0,0,0,1060,1061,3,62,23,0,1061,1062,1,0,0,0, + 1062,1063,6,109,11,0,1063,235,1,0,0,0,1064,1065,3,78,31,0,1065,1066,1,0, + 0,0,1066,1067,6,110,14,0,1067,1068,6,110,15,0,1068,237,1,0,0,0,1069,1070, + 3,112,48,0,1070,1071,1,0,0,0,1071,1072,6,111,19,0,1072,239,1,0,0,0,1073, + 1074,3,116,50,0,1074,1075,1,0,0,0,1075,1076,6,112,18,0,1076,241,1,0,0,0, + 1077,1078,3,120,52,0,1078,1079,1,0,0,0,1079,1080,6,113,22,0,1080,243,1, + 0,0,0,1081,1082,7,12,0,0,1082,1083,7,2,0,0,1083,245,1,0,0,0,1084,1085,3, + 228,106,0,1085,1086,1,0,0,0,1086,1087,6,115,23,0,1087,247,1,0,0,0,1088, + 1089,3,58,21,0,1089,1090,1,0,0,0,1090,1091,6,116,11,0,1091,249,1,0,0,0, + 1092,1093,3,60,22,0,1093,1094,1,0,0,0,1094,1095,6,117,11,0,1095,251,1,0, + 0,0,1096,1097,3,62,23,0,1097,1098,1,0,0,0,1098,1099,6,118,11,0,1099,253, + 1,0,0,0,1100,1101,3,78,31,0,1101,1102,1,0,0,0,1102,1103,6,119,14,0,1103, + 1104,6,119,15,0,1104,255,1,0,0,0,1105,1106,3,178,81,0,1106,1107,1,0,0,0, + 1107,1108,6,120,12,0,1108,1109,6,120,24,0,1109,257,1,0,0,0,1110,1111,7, + 7,0,0,1111,1112,7,9,0,0,1112,1113,1,0,0,0,1113,1114,6,121,25,0,1114,259, + 1,0,0,0,1115,1116,7,20,0,0,1116,1117,7,1,0,0,1117,1118,7,5,0,0,1118,1119, + 7,10,0,0,1119,1120,1,0,0,0,1120,1121,6,122,25,0,1121,261,1,0,0,0,1122,1123, + 8,34,0,0,1123,263,1,0,0,0,1124,1126,3,262,123,0,1125,1124,1,0,0,0,1126, + 1127,1,0,0,0,1127,1125,1,0,0,0,1127,1128,1,0,0,0,1128,1129,1,0,0,0,1129, + 1130,3,364,174,0,1130,1132,1,0,0,0,1131,1125,1,0,0,0,1131,1132,1,0,0,0, + 1132,1134,1,0,0,0,1133,1135,3,262,123,0,1134,1133,1,0,0,0,1135,1136,1,0, + 0,0,1136,1134,1,0,0,0,1136,1137,1,0,0,0,1137,265,1,0,0,0,1138,1139,3,264, + 124,0,1139,1140,1,0,0,0,1140,1141,6,125,26,0,1141,267,1,0,0,0,1142,1143, + 3,58,21,0,1143,1144,1,0,0,0,1144,1145,6,126,11,0,1145,269,1,0,0,0,1146, + 1147,3,60,22,0,1147,1148,1,0,0,0,1148,1149,6,127,11,0,1149,271,1,0,0,0, + 1150,1151,3,62,23,0,1151,1152,1,0,0,0,1152,1153,6,128,11,0,1153,273,1,0, + 0,0,1154,1155,3,78,31,0,1155,1156,1,0,0,0,1156,1157,6,129,14,0,1157,1158, + 6,129,15,0,1158,1159,6,129,15,0,1159,275,1,0,0,0,1160,1161,3,112,48,0,1161, + 1162,1,0,0,0,1162,1163,6,130,19,0,1163,277,1,0,0,0,1164,1165,3,116,50,0, + 1165,1166,1,0,0,0,1166,1167,6,131,18,0,1167,279,1,0,0,0,1168,1169,3,120, + 52,0,1169,1170,1,0,0,0,1170,1171,6,132,22,0,1171,281,1,0,0,0,1172,1173, + 3,260,122,0,1173,1174,1,0,0,0,1174,1175,6,133,27,0,1175,283,1,0,0,0,1176, + 1177,3,228,106,0,1177,1178,1,0,0,0,1178,1179,6,134,23,0,1179,285,1,0,0, + 0,1180,1181,3,186,85,0,1181,1182,1,0,0,0,1182,1183,6,135,28,0,1183,287, + 1,0,0,0,1184,1185,3,58,21,0,1185,1186,1,0,0,0,1186,1187,6,136,11,0,1187, + 289,1,0,0,0,1188,1189,3,60,22,0,1189,1190,1,0,0,0,1190,1191,6,137,11,0, + 1191,291,1,0,0,0,1192,1193,3,62,23,0,1193,1194,1,0,0,0,1194,1195,6,138, + 11,0,1195,293,1,0,0,0,1196,1197,3,78,31,0,1197,1198,1,0,0,0,1198,1199,6, + 139,14,0,1199,1200,6,139,15,0,1200,295,1,0,0,0,1201,1202,3,364,174,0,1202, + 1203,1,0,0,0,1203,1204,6,140,17,0,1204,297,1,0,0,0,1205,1206,3,116,50,0, + 1206,1207,1,0,0,0,1207,1208,6,141,18,0,1208,299,1,0,0,0,1209,1210,3,120, + 52,0,1210,1211,1,0,0,0,1211,1212,6,142,22,0,1212,301,1,0,0,0,1213,1214, + 3,258,121,0,1214,1215,1,0,0,0,1215,1216,6,143,29,0,1216,1217,6,143,30,0, + 1217,303,1,0,0,0,1218,1219,3,66,25,0,1219,1220,1,0,0,0,1220,1221,6,144, + 20,0,1221,305,1,0,0,0,1222,1223,3,100,42,0,1223,1224,1,0,0,0,1224,1225, + 6,145,21,0,1225,307,1,0,0,0,1226,1227,3,58,21,0,1227,1228,1,0,0,0,1228, + 1229,6,146,11,0,1229,309,1,0,0,0,1230,1231,3,60,22,0,1231,1232,1,0,0,0, + 1232,1233,6,147,11,0,1233,311,1,0,0,0,1234,1235,3,62,23,0,1235,1236,1,0, + 0,0,1236,1237,6,148,11,0,1237,313,1,0,0,0,1238,1239,3,78,31,0,1239,1240, + 1,0,0,0,1240,1241,6,149,14,0,1241,1242,6,149,15,0,1242,1243,6,149,15,0, + 1243,315,1,0,0,0,1244,1245,3,116,50,0,1245,1246,1,0,0,0,1246,1247,6,150, + 18,0,1247,317,1,0,0,0,1248,1249,3,120,52,0,1249,1250,1,0,0,0,1250,1251, + 6,151,22,0,1251,319,1,0,0,0,1252,1253,3,228,106,0,1253,1254,1,0,0,0,1254, + 1255,6,152,23,0,1255,321,1,0,0,0,1256,1257,3,58,21,0,1257,1258,1,0,0,0, + 1258,1259,6,153,11,0,1259,323,1,0,0,0,1260,1261,3,60,22,0,1261,1262,1,0, + 0,0,1262,1263,6,154,11,0,1263,325,1,0,0,0,1264,1265,3,62,23,0,1265,1266, + 1,0,0,0,1266,1267,6,155,11,0,1267,327,1,0,0,0,1268,1269,3,78,31,0,1269, + 1270,1,0,0,0,1270,1271,6,156,14,0,1271,1272,6,156,15,0,1272,329,1,0,0,0, + 1273,1274,3,120,52,0,1274,1275,1,0,0,0,1275,1276,6,157,22,0,1276,331,1, + 0,0,0,1277,1278,3,186,85,0,1278,1279,1,0,0,0,1279,1280,6,158,28,0,1280, + 333,1,0,0,0,1281,1282,3,182,83,0,1282,1283,1,0,0,0,1283,1284,6,159,31,0, + 1284,335,1,0,0,0,1285,1286,3,58,21,0,1286,1287,1,0,0,0,1287,1288,6,160, + 11,0,1288,337,1,0,0,0,1289,1290,3,60,22,0,1290,1291,1,0,0,0,1291,1292,6, + 161,11,0,1292,339,1,0,0,0,1293,1294,3,62,23,0,1294,1295,1,0,0,0,1295,1296, + 6,162,11,0,1296,341,1,0,0,0,1297,1298,3,78,31,0,1298,1299,1,0,0,0,1299, + 1300,6,163,14,0,1300,1301,6,163,15,0,1301,343,1,0,0,0,1302,1303,7,1,0,0, + 1303,1304,7,9,0,0,1304,1305,7,15,0,0,1305,1306,7,7,0,0,1306,345,1,0,0,0, + 1307,1308,3,58,21,0,1308,1309,1,0,0,0,1309,1310,6,165,11,0,1310,347,1,0, + 0,0,1311,1312,3,60,22,0,1312,1313,1,0,0,0,1313,1314,6,166,11,0,1314,349, + 1,0,0,0,1315,1316,3,62,23,0,1316,1317,1,0,0,0,1317,1318,6,167,11,0,1318, + 351,1,0,0,0,1319,1320,3,78,31,0,1320,1321,1,0,0,0,1321,1322,6,168,14,0, + 1322,1323,6,168,15,0,1323,353,1,0,0,0,1324,1325,7,15,0,0,1325,1326,7,19, + 0,0,1326,1327,7,9,0,0,1327,1328,7,4,0,0,1328,1329,7,5,0,0,1329,1330,7,1, + 0,0,1330,1331,7,7,0,0,1331,1332,7,9,0,0,1332,1333,7,2,0,0,1333,355,1,0, + 0,0,1334,1335,3,58,21,0,1335,1336,1,0,0,0,1336,1337,6,170,11,0,1337,357, + 1,0,0,0,1338,1339,3,60,22,0,1339,1340,1,0,0,0,1340,1341,6,171,11,0,1341, + 359,1,0,0,0,1342,1343,3,62,23,0,1343,1344,1,0,0,0,1344,1345,6,172,11,0, + 1345,361,1,0,0,0,1346,1347,3,180,82,0,1347,1348,1,0,0,0,1348,1349,6,173, + 16,0,1349,1350,6,173,15,0,1350,363,1,0,0,0,1351,1352,5,58,0,0,1352,365, + 1,0,0,0,1353,1359,3,90,37,0,1354,1359,3,80,32,0,1355,1359,3,120,52,0,1356, + 1359,3,82,33,0,1357,1359,3,96,40,0,1358,1353,1,0,0,0,1358,1354,1,0,0,0, + 1358,1355,1,0,0,0,1358,1356,1,0,0,0,1358,1357,1,0,0,0,1359,1360,1,0,0,0, + 1360,1358,1,0,0,0,1360,1361,1,0,0,0,1361,367,1,0,0,0,1362,1363,3,58,21, + 0,1363,1364,1,0,0,0,1364,1365,6,176,11,0,1365,369,1,0,0,0,1366,1367,3,60, + 22,0,1367,1368,1,0,0,0,1368,1369,6,177,11,0,1369,371,1,0,0,0,1370,1371, + 3,62,23,0,1371,1372,1,0,0,0,1372,1373,6,178,11,0,1373,373,1,0,0,0,1374, + 1375,3,78,31,0,1375,1376,1,0,0,0,1376,1377,6,179,14,0,1377,1378,6,179,15, + 0,1378,375,1,0,0,0,1379,1380,3,66,25,0,1380,1381,1,0,0,0,1381,1382,6,180, + 20,0,1382,1383,6,180,15,0,1383,1384,6,180,32,0,1384,377,1,0,0,0,1385,1386, + 3,100,42,0,1386,1387,1,0,0,0,1387,1388,6,181,21,0,1388,1389,6,181,15,0, + 1389,1390,6,181,32,0,1390,379,1,0,0,0,1391,1392,3,58,21,0,1392,1393,1,0, + 0,0,1393,1394,6,182,11,0,1394,381,1,0,0,0,1395,1396,3,60,22,0,1396,1397, + 1,0,0,0,1397,1398,6,183,11,0,1398,383,1,0,0,0,1399,1400,3,62,23,0,1400, + 1401,1,0,0,0,1401,1402,6,184,11,0,1402,385,1,0,0,0,1403,1404,3,364,174, + 0,1404,1405,1,0,0,0,1405,1406,6,185,17,0,1406,1407,6,185,15,0,1407,1408, + 6,185,7,0,1408,387,1,0,0,0,1409,1410,3,116,50,0,1410,1411,1,0,0,0,1411, + 1412,6,186,18,0,1412,1413,6,186,15,0,1413,1414,6,186,7,0,1414,389,1,0,0, + 0,1415,1416,3,58,21,0,1416,1417,1,0,0,0,1417,1418,6,187,11,0,1418,391,1, + 0,0,0,1419,1420,3,60,22,0,1420,1421,1,0,0,0,1421,1422,6,188,11,0,1422,393, + 1,0,0,0,1423,1424,3,62,23,0,1424,1425,1,0,0,0,1425,1426,6,189,11,0,1426, + 395,1,0,0,0,1427,1428,3,186,85,0,1428,1429,1,0,0,0,1429,1430,6,190,15,0, + 1430,1431,6,190,0,0,1431,1432,6,190,28,0,1432,397,1,0,0,0,1433,1434,3,182, + 83,0,1434,1435,1,0,0,0,1435,1436,6,191,15,0,1436,1437,6,191,0,0,1437,1438, + 6,191,31,0,1438,399,1,0,0,0,1439,1440,3,106,45,0,1440,1441,1,0,0,0,1441, + 1442,6,192,15,0,1442,1443,6,192,0,0,1443,1444,6,192,33,0,1444,401,1,0,0, + 0,1445,1446,3,78,31,0,1446,1447,1,0,0,0,1447,1448,6,193,14,0,1448,1449, + 6,193,15,0,1449,403,1,0,0,0,65,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,576, + 586,590,593,602,604,615,622,627,666,671,680,687,692,694,705,713,716,718, + 723,728,734,741,746,752,755,763,767,891,898,900,916,921,926,928,934,1023, + 1027,1032,1037,1042,1044,1048,1050,1127,1131,1136,1358,1360,34,5,2,0,5, 4,0,5,6,0,5,1,0,5,3,0,5,8,0,5,12,0,5,14,0,5,10,0,5,5,0,5,11,0,0,1,0,7,69, - 0,5,0,0,7,29,0,4,0,0,7,70,0,7,38,0,7,36,0,7,30,0,7,25,0,7,40,0,7,80,0,5, - 13,0,5,7,0,7,72,0,7,90,0,7,89,0,7,88,0,5,9,0,7,71,0,5,15,0,7,33,0]; + 0,5,0,0,7,29,0,4,0,0,7,70,0,7,114,0,7,38,0,7,36,0,7,25,0,7,30,0,7,40,0, + 7,80,0,5,13,0,5,7,0,7,90,0,7,89,0,7,72,0,7,88,0,5,9,0,7,71,0,5,15,0,7,33, + 0]; private static __ATN: ATN; public static get _ATN(): ATN { diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 index 59c9ee6ca5770..bae91675fbb02 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.g4 +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.g4 @@ -115,11 +115,21 @@ field ; fromCommand - : FROM indexIdentifier (COMMA indexIdentifier)* metadata? + : FROM indexPattern (COMMA indexPattern)* metadata? ; -indexIdentifier - : INDEX_UNQUOTED_IDENTIFIER +indexPattern + : clusterString COLON indexString + | indexString + ; + +clusterString + : UNQUOTED_SOURCE + ; + +indexString + : UNQUOTED_SOURCE + | QUOTED_STRING ; metadata @@ -128,7 +138,7 @@ metadata ; metadataOption - : METADATA indexIdentifier (COMMA indexIdentifier)* + : METADATA UNQUOTED_SOURCE (COMMA UNQUOTED_SOURCE)* ; deprecated_metadata @@ -136,7 +146,7 @@ deprecated_metadata ; metricsCommand - : METRICS indexIdentifier (COMMA indexIdentifier)* aggregates=fields? (BY grouping=fields)? + : METRICS indexPattern (COMMA indexPattern)* aggregates=fields? (BY grouping=fields)? ; evalCommand @@ -289,5 +299,5 @@ enrichWithClause ; lookupCommand - : LOOKUP tableName=INDEX_UNQUOTED_IDENTIFIER ON matchFields=qualifiedNamePatterns + : LOOKUP tableName=indexPattern ON matchFields=qualifiedNamePatterns ; \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.interp b/packages/kbn-esql-ast/src/antlr/esql_parser.interp index 5900020590110..6c5edef9e98f0 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.interp +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.interp @@ -151,7 +151,7 @@ UNKNOWN_CMD LINE_COMMENT MULTILINE_COMMENT WS -INDEX_UNQUOTED_IDENTIFIER +UNQUOTED_SOURCE EXPLAIN_WS EXPLAIN_LINE_COMMENT EXPLAIN_MULTILINE_COMMENT @@ -269,7 +269,9 @@ rowCommand fields field fromCommand -indexIdentifier +indexPattern +clusterString +indexString metadata metadataOption deprecated_metadata @@ -312,4 +314,4 @@ lookupCommand atn: -[4, 1, 124, 554, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 122, 8, 1, 10, 1, 12, 1, 125, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 133, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 149, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 161, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 168, 8, 5, 10, 5, 12, 5, 171, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 178, 8, 5, 1, 5, 1, 5, 3, 5, 182, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 190, 8, 5, 10, 5, 12, 5, 193, 9, 5, 1, 6, 1, 6, 3, 6, 197, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 204, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 209, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 216, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 222, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 230, 8, 8, 10, 8, 12, 8, 233, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 243, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 248, 8, 9, 10, 9, 12, 9, 251, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 259, 8, 10, 10, 10, 12, 10, 262, 9, 10, 3, 10, 264, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 276, 8, 13, 10, 13, 12, 13, 279, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 286, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 292, 8, 15, 10, 15, 12, 15, 295, 9, 15, 1, 15, 3, 15, 298, 8, 15, 1, 16, 1, 16, 1, 17, 1, 17, 3, 17, 304, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 310, 8, 18, 10, 18, 12, 18, 313, 9, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 323, 8, 20, 10, 20, 12, 20, 326, 9, 20, 1, 20, 3, 20, 329, 8, 20, 1, 20, 1, 20, 3, 20, 333, 8, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 340, 8, 22, 1, 22, 1, 22, 3, 22, 344, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 350, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 355, 8, 24, 10, 24, 12, 24, 358, 9, 24, 1, 25, 1, 25, 1, 25, 5, 25, 363, 8, 25, 10, 25, 12, 25, 366, 9, 25, 1, 26, 1, 26, 1, 26, 5, 26, 371, 8, 26, 10, 26, 12, 26, 374, 9, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 393, 8, 29, 10, 29, 12, 29, 396, 9, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 404, 8, 29, 10, 29, 12, 29, 407, 9, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 415, 8, 29, 10, 29, 12, 29, 418, 9, 29, 1, 29, 1, 29, 3, 29, 422, 8, 29, 1, 30, 1, 30, 3, 30, 426, 8, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 435, 8, 32, 10, 32, 12, 32, 438, 9, 32, 1, 33, 1, 33, 3, 33, 442, 8, 33, 1, 33, 1, 33, 3, 33, 446, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 458, 8, 36, 10, 36, 12, 36, 461, 9, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 471, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 5, 41, 483, 8, 41, 10, 41, 12, 41, 486, 9, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 496, 8, 44, 1, 45, 3, 45, 499, 8, 45, 1, 45, 1, 45, 1, 46, 3, 46, 504, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 529, 8, 53, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 535, 8, 53, 10, 53, 12, 53, 538, 9, 53, 3, 53, 540, 8, 53, 1, 54, 1, 54, 1, 54, 3, 54, 545, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 0, 4, 2, 10, 16, 18, 56, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 0, 7, 1, 0, 63, 64, 1, 0, 65, 67, 1, 0, 71, 72, 2, 0, 35, 35, 39, 39, 1, 0, 42, 43, 2, 0, 41, 41, 55, 55, 2, 0, 56, 56, 58, 62, 580, 0, 112, 1, 0, 0, 0, 2, 115, 1, 0, 0, 0, 4, 132, 1, 0, 0, 0, 6, 148, 1, 0, 0, 0, 8, 150, 1, 0, 0, 0, 10, 181, 1, 0, 0, 0, 12, 208, 1, 0, 0, 0, 14, 215, 1, 0, 0, 0, 16, 221, 1, 0, 0, 0, 18, 242, 1, 0, 0, 0, 20, 252, 1, 0, 0, 0, 22, 267, 1, 0, 0, 0, 24, 269, 1, 0, 0, 0, 26, 272, 1, 0, 0, 0, 28, 285, 1, 0, 0, 0, 30, 287, 1, 0, 0, 0, 32, 299, 1, 0, 0, 0, 34, 303, 1, 0, 0, 0, 36, 305, 1, 0, 0, 0, 38, 314, 1, 0, 0, 0, 40, 318, 1, 0, 0, 0, 42, 334, 1, 0, 0, 0, 44, 337, 1, 0, 0, 0, 46, 345, 1, 0, 0, 0, 48, 351, 1, 0, 0, 0, 50, 359, 1, 0, 0, 0, 52, 367, 1, 0, 0, 0, 54, 375, 1, 0, 0, 0, 56, 377, 1, 0, 0, 0, 58, 421, 1, 0, 0, 0, 60, 425, 1, 0, 0, 0, 62, 427, 1, 0, 0, 0, 64, 430, 1, 0, 0, 0, 66, 439, 1, 0, 0, 0, 68, 447, 1, 0, 0, 0, 70, 450, 1, 0, 0, 0, 72, 453, 1, 0, 0, 0, 74, 462, 1, 0, 0, 0, 76, 466, 1, 0, 0, 0, 78, 472, 1, 0, 0, 0, 80, 476, 1, 0, 0, 0, 82, 479, 1, 0, 0, 0, 84, 487, 1, 0, 0, 0, 86, 491, 1, 0, 0, 0, 88, 495, 1, 0, 0, 0, 90, 498, 1, 0, 0, 0, 92, 503, 1, 0, 0, 0, 94, 507, 1, 0, 0, 0, 96, 509, 1, 0, 0, 0, 98, 511, 1, 0, 0, 0, 100, 514, 1, 0, 0, 0, 102, 518, 1, 0, 0, 0, 104, 521, 1, 0, 0, 0, 106, 524, 1, 0, 0, 0, 108, 544, 1, 0, 0, 0, 110, 548, 1, 0, 0, 0, 112, 113, 3, 2, 1, 0, 113, 114, 5, 0, 0, 1, 114, 1, 1, 0, 0, 0, 115, 116, 6, 1, -1, 0, 116, 117, 3, 4, 2, 0, 117, 123, 1, 0, 0, 0, 118, 119, 10, 1, 0, 0, 119, 120, 5, 29, 0, 0, 120, 122, 3, 6, 3, 0, 121, 118, 1, 0, 0, 0, 122, 125, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 123, 124, 1, 0, 0, 0, 124, 3, 1, 0, 0, 0, 125, 123, 1, 0, 0, 0, 126, 133, 3, 98, 49, 0, 127, 133, 3, 30, 15, 0, 128, 133, 3, 24, 12, 0, 129, 133, 3, 40, 20, 0, 130, 133, 3, 102, 51, 0, 131, 133, 3, 104, 52, 0, 132, 126, 1, 0, 0, 0, 132, 127, 1, 0, 0, 0, 132, 128, 1, 0, 0, 0, 132, 129, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 132, 131, 1, 0, 0, 0, 133, 5, 1, 0, 0, 0, 134, 149, 3, 42, 21, 0, 135, 149, 3, 46, 23, 0, 136, 149, 3, 62, 31, 0, 137, 149, 3, 110, 55, 0, 138, 149, 3, 68, 34, 0, 139, 149, 3, 64, 32, 0, 140, 149, 3, 44, 22, 0, 141, 149, 3, 8, 4, 0, 142, 149, 3, 70, 35, 0, 143, 149, 3, 72, 36, 0, 144, 149, 3, 76, 38, 0, 145, 149, 3, 78, 39, 0, 146, 149, 3, 106, 53, 0, 147, 149, 3, 80, 40, 0, 148, 134, 1, 0, 0, 0, 148, 135, 1, 0, 0, 0, 148, 136, 1, 0, 0, 0, 148, 137, 1, 0, 0, 0, 148, 138, 1, 0, 0, 0, 148, 139, 1, 0, 0, 0, 148, 140, 1, 0, 0, 0, 148, 141, 1, 0, 0, 0, 148, 142, 1, 0, 0, 0, 148, 143, 1, 0, 0, 0, 148, 144, 1, 0, 0, 0, 148, 145, 1, 0, 0, 0, 148, 146, 1, 0, 0, 0, 148, 147, 1, 0, 0, 0, 149, 7, 1, 0, 0, 0, 150, 151, 5, 20, 0, 0, 151, 152, 3, 10, 5, 0, 152, 9, 1, 0, 0, 0, 153, 154, 6, 5, -1, 0, 154, 155, 5, 48, 0, 0, 155, 182, 3, 10, 5, 7, 156, 182, 3, 14, 7, 0, 157, 182, 3, 12, 6, 0, 158, 160, 3, 14, 7, 0, 159, 161, 5, 48, 0, 0, 160, 159, 1, 0, 0, 0, 160, 161, 1, 0, 0, 0, 161, 162, 1, 0, 0, 0, 162, 163, 5, 45, 0, 0, 163, 164, 5, 44, 0, 0, 164, 169, 3, 14, 7, 0, 165, 166, 5, 38, 0, 0, 166, 168, 3, 14, 7, 0, 167, 165, 1, 0, 0, 0, 168, 171, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 172, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 172, 173, 5, 54, 0, 0, 173, 182, 1, 0, 0, 0, 174, 175, 3, 14, 7, 0, 175, 177, 5, 46, 0, 0, 176, 178, 5, 48, 0, 0, 177, 176, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 180, 5, 49, 0, 0, 180, 182, 1, 0, 0, 0, 181, 153, 1, 0, 0, 0, 181, 156, 1, 0, 0, 0, 181, 157, 1, 0, 0, 0, 181, 158, 1, 0, 0, 0, 181, 174, 1, 0, 0, 0, 182, 191, 1, 0, 0, 0, 183, 184, 10, 4, 0, 0, 184, 185, 5, 34, 0, 0, 185, 190, 3, 10, 5, 5, 186, 187, 10, 3, 0, 0, 187, 188, 5, 51, 0, 0, 188, 190, 3, 10, 5, 4, 189, 183, 1, 0, 0, 0, 189, 186, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 11, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 196, 3, 14, 7, 0, 195, 197, 5, 48, 0, 0, 196, 195, 1, 0, 0, 0, 196, 197, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 199, 5, 47, 0, 0, 199, 200, 3, 94, 47, 0, 200, 209, 1, 0, 0, 0, 201, 203, 3, 14, 7, 0, 202, 204, 5, 48, 0, 0, 203, 202, 1, 0, 0, 0, 203, 204, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 206, 5, 53, 0, 0, 206, 207, 3, 94, 47, 0, 207, 209, 1, 0, 0, 0, 208, 194, 1, 0, 0, 0, 208, 201, 1, 0, 0, 0, 209, 13, 1, 0, 0, 0, 210, 216, 3, 16, 8, 0, 211, 212, 3, 16, 8, 0, 212, 213, 3, 96, 48, 0, 213, 214, 3, 16, 8, 0, 214, 216, 1, 0, 0, 0, 215, 210, 1, 0, 0, 0, 215, 211, 1, 0, 0, 0, 216, 15, 1, 0, 0, 0, 217, 218, 6, 8, -1, 0, 218, 222, 3, 18, 9, 0, 219, 220, 7, 0, 0, 0, 220, 222, 3, 16, 8, 3, 221, 217, 1, 0, 0, 0, 221, 219, 1, 0, 0, 0, 222, 231, 1, 0, 0, 0, 223, 224, 10, 2, 0, 0, 224, 225, 7, 1, 0, 0, 225, 230, 3, 16, 8, 3, 226, 227, 10, 1, 0, 0, 227, 228, 7, 0, 0, 0, 228, 230, 3, 16, 8, 2, 229, 223, 1, 0, 0, 0, 229, 226, 1, 0, 0, 0, 230, 233, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 231, 232, 1, 0, 0, 0, 232, 17, 1, 0, 0, 0, 233, 231, 1, 0, 0, 0, 234, 235, 6, 9, -1, 0, 235, 243, 3, 58, 29, 0, 236, 243, 3, 48, 24, 0, 237, 243, 3, 20, 10, 0, 238, 239, 5, 44, 0, 0, 239, 240, 3, 10, 5, 0, 240, 241, 5, 54, 0, 0, 241, 243, 1, 0, 0, 0, 242, 234, 1, 0, 0, 0, 242, 236, 1, 0, 0, 0, 242, 237, 1, 0, 0, 0, 242, 238, 1, 0, 0, 0, 243, 249, 1, 0, 0, 0, 244, 245, 10, 1, 0, 0, 245, 246, 5, 37, 0, 0, 246, 248, 3, 22, 11, 0, 247, 244, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 19, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 252, 253, 3, 54, 27, 0, 253, 263, 5, 44, 0, 0, 254, 264, 5, 65, 0, 0, 255, 260, 3, 10, 5, 0, 256, 257, 5, 38, 0, 0, 257, 259, 3, 10, 5, 0, 258, 256, 1, 0, 0, 0, 259, 262, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 264, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 263, 254, 1, 0, 0, 0, 263, 255, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 54, 0, 0, 266, 21, 1, 0, 0, 0, 267, 268, 3, 54, 27, 0, 268, 23, 1, 0, 0, 0, 269, 270, 5, 16, 0, 0, 270, 271, 3, 26, 13, 0, 271, 25, 1, 0, 0, 0, 272, 277, 3, 28, 14, 0, 273, 274, 5, 38, 0, 0, 274, 276, 3, 28, 14, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 27, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 286, 3, 10, 5, 0, 281, 282, 3, 48, 24, 0, 282, 283, 5, 36, 0, 0, 283, 284, 3, 10, 5, 0, 284, 286, 1, 0, 0, 0, 285, 280, 1, 0, 0, 0, 285, 281, 1, 0, 0, 0, 286, 29, 1, 0, 0, 0, 287, 288, 5, 6, 0, 0, 288, 293, 3, 32, 16, 0, 289, 290, 5, 38, 0, 0, 290, 292, 3, 32, 16, 0, 291, 289, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 297, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 298, 3, 34, 17, 0, 297, 296, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 31, 1, 0, 0, 0, 299, 300, 5, 25, 0, 0, 300, 33, 1, 0, 0, 0, 301, 304, 3, 36, 18, 0, 302, 304, 3, 38, 19, 0, 303, 301, 1, 0, 0, 0, 303, 302, 1, 0, 0, 0, 304, 35, 1, 0, 0, 0, 305, 306, 5, 76, 0, 0, 306, 311, 3, 32, 16, 0, 307, 308, 5, 38, 0, 0, 308, 310, 3, 32, 16, 0, 309, 307, 1, 0, 0, 0, 310, 313, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 37, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 314, 315, 5, 69, 0, 0, 315, 316, 3, 36, 18, 0, 316, 317, 5, 70, 0, 0, 317, 39, 1, 0, 0, 0, 318, 319, 5, 13, 0, 0, 319, 324, 3, 32, 16, 0, 320, 321, 5, 38, 0, 0, 321, 323, 3, 32, 16, 0, 322, 320, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 328, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 329, 3, 26, 13, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 332, 1, 0, 0, 0, 330, 331, 5, 33, 0, 0, 331, 333, 3, 26, 13, 0, 332, 330, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 41, 1, 0, 0, 0, 334, 335, 5, 4, 0, 0, 335, 336, 3, 26, 13, 0, 336, 43, 1, 0, 0, 0, 337, 339, 5, 19, 0, 0, 338, 340, 3, 26, 13, 0, 339, 338, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 342, 5, 33, 0, 0, 342, 344, 3, 26, 13, 0, 343, 341, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 45, 1, 0, 0, 0, 345, 346, 5, 8, 0, 0, 346, 349, 3, 26, 13, 0, 347, 348, 5, 33, 0, 0, 348, 350, 3, 26, 13, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 47, 1, 0, 0, 0, 351, 356, 3, 54, 27, 0, 352, 353, 5, 40, 0, 0, 353, 355, 3, 54, 27, 0, 354, 352, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 49, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 359, 364, 3, 56, 28, 0, 360, 361, 5, 40, 0, 0, 361, 363, 3, 56, 28, 0, 362, 360, 1, 0, 0, 0, 363, 366, 1, 0, 0, 0, 364, 362, 1, 0, 0, 0, 364, 365, 1, 0, 0, 0, 365, 51, 1, 0, 0, 0, 366, 364, 1, 0, 0, 0, 367, 372, 3, 50, 25, 0, 368, 369, 5, 38, 0, 0, 369, 371, 3, 50, 25, 0, 370, 368, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 53, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 7, 2, 0, 0, 376, 55, 1, 0, 0, 0, 377, 378, 5, 80, 0, 0, 378, 57, 1, 0, 0, 0, 379, 422, 5, 49, 0, 0, 380, 381, 3, 92, 46, 0, 381, 382, 5, 71, 0, 0, 382, 422, 1, 0, 0, 0, 383, 422, 3, 90, 45, 0, 384, 422, 3, 92, 46, 0, 385, 422, 3, 86, 43, 0, 386, 422, 3, 60, 30, 0, 387, 422, 3, 94, 47, 0, 388, 389, 5, 69, 0, 0, 389, 394, 3, 88, 44, 0, 390, 391, 5, 38, 0, 0, 391, 393, 3, 88, 44, 0, 392, 390, 1, 0, 0, 0, 393, 396, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 397, 398, 5, 70, 0, 0, 398, 422, 1, 0, 0, 0, 399, 400, 5, 69, 0, 0, 400, 405, 3, 86, 43, 0, 401, 402, 5, 38, 0, 0, 402, 404, 3, 86, 43, 0, 403, 401, 1, 0, 0, 0, 404, 407, 1, 0, 0, 0, 405, 403, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 405, 1, 0, 0, 0, 408, 409, 5, 70, 0, 0, 409, 422, 1, 0, 0, 0, 410, 411, 5, 69, 0, 0, 411, 416, 3, 94, 47, 0, 412, 413, 5, 38, 0, 0, 413, 415, 3, 94, 47, 0, 414, 412, 1, 0, 0, 0, 415, 418, 1, 0, 0, 0, 416, 414, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 419, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 419, 420, 5, 70, 0, 0, 420, 422, 1, 0, 0, 0, 421, 379, 1, 0, 0, 0, 421, 380, 1, 0, 0, 0, 421, 383, 1, 0, 0, 0, 421, 384, 1, 0, 0, 0, 421, 385, 1, 0, 0, 0, 421, 386, 1, 0, 0, 0, 421, 387, 1, 0, 0, 0, 421, 388, 1, 0, 0, 0, 421, 399, 1, 0, 0, 0, 421, 410, 1, 0, 0, 0, 422, 59, 1, 0, 0, 0, 423, 426, 5, 52, 0, 0, 424, 426, 5, 68, 0, 0, 425, 423, 1, 0, 0, 0, 425, 424, 1, 0, 0, 0, 426, 61, 1, 0, 0, 0, 427, 428, 5, 10, 0, 0, 428, 429, 5, 31, 0, 0, 429, 63, 1, 0, 0, 0, 430, 431, 5, 18, 0, 0, 431, 436, 3, 66, 33, 0, 432, 433, 5, 38, 0, 0, 433, 435, 3, 66, 33, 0, 434, 432, 1, 0, 0, 0, 435, 438, 1, 0, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 65, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 439, 441, 3, 10, 5, 0, 440, 442, 7, 3, 0, 0, 441, 440, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 445, 1, 0, 0, 0, 443, 444, 5, 50, 0, 0, 444, 446, 7, 4, 0, 0, 445, 443, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 67, 1, 0, 0, 0, 447, 448, 5, 9, 0, 0, 448, 449, 3, 52, 26, 0, 449, 69, 1, 0, 0, 0, 450, 451, 5, 2, 0, 0, 451, 452, 3, 52, 26, 0, 452, 71, 1, 0, 0, 0, 453, 454, 5, 15, 0, 0, 454, 459, 3, 74, 37, 0, 455, 456, 5, 38, 0, 0, 456, 458, 3, 74, 37, 0, 457, 455, 1, 0, 0, 0, 458, 461, 1, 0, 0, 0, 459, 457, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 73, 1, 0, 0, 0, 461, 459, 1, 0, 0, 0, 462, 463, 3, 50, 25, 0, 463, 464, 5, 84, 0, 0, 464, 465, 3, 50, 25, 0, 465, 75, 1, 0, 0, 0, 466, 467, 5, 1, 0, 0, 467, 468, 3, 18, 9, 0, 468, 470, 3, 94, 47, 0, 469, 471, 3, 82, 41, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 77, 1, 0, 0, 0, 472, 473, 5, 7, 0, 0, 473, 474, 3, 18, 9, 0, 474, 475, 3, 94, 47, 0, 475, 79, 1, 0, 0, 0, 476, 477, 5, 14, 0, 0, 477, 478, 3, 48, 24, 0, 478, 81, 1, 0, 0, 0, 479, 484, 3, 84, 42, 0, 480, 481, 5, 38, 0, 0, 481, 483, 3, 84, 42, 0, 482, 480, 1, 0, 0, 0, 483, 486, 1, 0, 0, 0, 484, 482, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 83, 1, 0, 0, 0, 486, 484, 1, 0, 0, 0, 487, 488, 3, 54, 27, 0, 488, 489, 5, 36, 0, 0, 489, 490, 3, 58, 29, 0, 490, 85, 1, 0, 0, 0, 491, 492, 7, 5, 0, 0, 492, 87, 1, 0, 0, 0, 493, 496, 3, 90, 45, 0, 494, 496, 3, 92, 46, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 89, 1, 0, 0, 0, 497, 499, 7, 0, 0, 0, 498, 497, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 501, 5, 32, 0, 0, 501, 91, 1, 0, 0, 0, 502, 504, 7, 0, 0, 0, 503, 502, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 5, 31, 0, 0, 506, 93, 1, 0, 0, 0, 507, 508, 5, 30, 0, 0, 508, 95, 1, 0, 0, 0, 509, 510, 7, 6, 0, 0, 510, 97, 1, 0, 0, 0, 511, 512, 5, 5, 0, 0, 512, 513, 3, 100, 50, 0, 513, 99, 1, 0, 0, 0, 514, 515, 5, 69, 0, 0, 515, 516, 3, 2, 1, 0, 516, 517, 5, 70, 0, 0, 517, 101, 1, 0, 0, 0, 518, 519, 5, 17, 0, 0, 519, 520, 5, 106, 0, 0, 520, 103, 1, 0, 0, 0, 521, 522, 5, 12, 0, 0, 522, 523, 5, 110, 0, 0, 523, 105, 1, 0, 0, 0, 524, 525, 5, 3, 0, 0, 525, 528, 5, 90, 0, 0, 526, 527, 5, 88, 0, 0, 527, 529, 3, 50, 25, 0, 528, 526, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 539, 1, 0, 0, 0, 530, 531, 5, 89, 0, 0, 531, 536, 3, 108, 54, 0, 532, 533, 5, 38, 0, 0, 533, 535, 3, 108, 54, 0, 534, 532, 1, 0, 0, 0, 535, 538, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 539, 530, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 107, 1, 0, 0, 0, 541, 542, 3, 50, 25, 0, 542, 543, 5, 36, 0, 0, 543, 545, 1, 0, 0, 0, 544, 541, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 3, 50, 25, 0, 547, 109, 1, 0, 0, 0, 548, 549, 5, 11, 0, 0, 549, 550, 5, 25, 0, 0, 550, 551, 5, 88, 0, 0, 551, 552, 3, 52, 26, 0, 552, 111, 1, 0, 0, 0, 53, 123, 132, 148, 160, 169, 177, 181, 189, 191, 196, 203, 208, 215, 221, 229, 231, 242, 249, 260, 263, 277, 285, 293, 297, 303, 311, 324, 328, 332, 339, 343, 349, 356, 364, 372, 394, 405, 416, 421, 425, 436, 441, 445, 459, 470, 484, 495, 498, 503, 528, 536, 539, 544] \ No newline at end of file +[4, 1, 124, 567, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 126, 8, 1, 10, 1, 12, 1, 129, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 137, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 153, 8, 3, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 165, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 172, 8, 5, 10, 5, 12, 5, 175, 9, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 182, 8, 5, 1, 5, 1, 5, 3, 5, 186, 8, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 5, 5, 194, 8, 5, 10, 5, 12, 5, 197, 9, 5, 1, 6, 1, 6, 3, 6, 201, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 208, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 213, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 220, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 226, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 234, 8, 8, 10, 8, 12, 8, 237, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 252, 8, 9, 10, 9, 12, 9, 255, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 263, 8, 10, 10, 10, 12, 10, 266, 9, 10, 3, 10, 268, 8, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 5, 13, 280, 8, 13, 10, 13, 12, 13, 283, 9, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 290, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 296, 8, 15, 10, 15, 12, 15, 299, 9, 15, 1, 15, 3, 15, 302, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 309, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 1, 19, 3, 19, 317, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 323, 8, 20, 10, 20, 12, 20, 326, 9, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 336, 8, 22, 10, 22, 12, 22, 339, 9, 22, 1, 22, 3, 22, 342, 8, 22, 1, 22, 1, 22, 3, 22, 346, 8, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 3, 24, 353, 8, 24, 1, 24, 1, 24, 3, 24, 357, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 363, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 368, 8, 26, 10, 26, 12, 26, 371, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 376, 8, 27, 10, 27, 12, 27, 379, 9, 27, 1, 28, 1, 28, 1, 28, 5, 28, 384, 8, 28, 10, 28, 12, 28, 387, 9, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 406, 8, 31, 10, 31, 12, 31, 409, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 417, 8, 31, 10, 31, 12, 31, 420, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 428, 8, 31, 10, 31, 12, 31, 431, 9, 31, 1, 31, 1, 31, 3, 31, 435, 8, 31, 1, 32, 1, 32, 3, 32, 439, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 448, 8, 34, 10, 34, 12, 34, 451, 9, 34, 1, 35, 1, 35, 3, 35, 455, 8, 35, 1, 35, 1, 35, 3, 35, 459, 8, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 471, 8, 38, 10, 38, 12, 38, 474, 9, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 484, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 5, 43, 496, 8, 43, 10, 43, 12, 43, 499, 9, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 3, 46, 509, 8, 46, 1, 47, 3, 47, 512, 8, 47, 1, 47, 1, 47, 1, 48, 3, 48, 517, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 542, 8, 55, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 548, 8, 55, 10, 55, 12, 55, 551, 9, 55, 3, 55, 553, 8, 55, 1, 56, 1, 56, 1, 56, 3, 56, 558, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 0, 4, 2, 10, 16, 18, 58, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 0, 8, 1, 0, 63, 64, 1, 0, 65, 67, 2, 0, 25, 25, 30, 30, 1, 0, 71, 72, 2, 0, 35, 35, 39, 39, 1, 0, 42, 43, 2, 0, 41, 41, 55, 55, 2, 0, 56, 56, 58, 62, 592, 0, 116, 1, 0, 0, 0, 2, 119, 1, 0, 0, 0, 4, 136, 1, 0, 0, 0, 6, 152, 1, 0, 0, 0, 8, 154, 1, 0, 0, 0, 10, 185, 1, 0, 0, 0, 12, 212, 1, 0, 0, 0, 14, 219, 1, 0, 0, 0, 16, 225, 1, 0, 0, 0, 18, 246, 1, 0, 0, 0, 20, 256, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 273, 1, 0, 0, 0, 26, 276, 1, 0, 0, 0, 28, 289, 1, 0, 0, 0, 30, 291, 1, 0, 0, 0, 32, 308, 1, 0, 0, 0, 34, 310, 1, 0, 0, 0, 36, 312, 1, 0, 0, 0, 38, 316, 1, 0, 0, 0, 40, 318, 1, 0, 0, 0, 42, 327, 1, 0, 0, 0, 44, 331, 1, 0, 0, 0, 46, 347, 1, 0, 0, 0, 48, 350, 1, 0, 0, 0, 50, 358, 1, 0, 0, 0, 52, 364, 1, 0, 0, 0, 54, 372, 1, 0, 0, 0, 56, 380, 1, 0, 0, 0, 58, 388, 1, 0, 0, 0, 60, 390, 1, 0, 0, 0, 62, 434, 1, 0, 0, 0, 64, 438, 1, 0, 0, 0, 66, 440, 1, 0, 0, 0, 68, 443, 1, 0, 0, 0, 70, 452, 1, 0, 0, 0, 72, 460, 1, 0, 0, 0, 74, 463, 1, 0, 0, 0, 76, 466, 1, 0, 0, 0, 78, 475, 1, 0, 0, 0, 80, 479, 1, 0, 0, 0, 82, 485, 1, 0, 0, 0, 84, 489, 1, 0, 0, 0, 86, 492, 1, 0, 0, 0, 88, 500, 1, 0, 0, 0, 90, 504, 1, 0, 0, 0, 92, 508, 1, 0, 0, 0, 94, 511, 1, 0, 0, 0, 96, 516, 1, 0, 0, 0, 98, 520, 1, 0, 0, 0, 100, 522, 1, 0, 0, 0, 102, 524, 1, 0, 0, 0, 104, 527, 1, 0, 0, 0, 106, 531, 1, 0, 0, 0, 108, 534, 1, 0, 0, 0, 110, 537, 1, 0, 0, 0, 112, 557, 1, 0, 0, 0, 114, 561, 1, 0, 0, 0, 116, 117, 3, 2, 1, 0, 117, 118, 5, 0, 0, 1, 118, 1, 1, 0, 0, 0, 119, 120, 6, 1, -1, 0, 120, 121, 3, 4, 2, 0, 121, 127, 1, 0, 0, 0, 122, 123, 10, 1, 0, 0, 123, 124, 5, 29, 0, 0, 124, 126, 3, 6, 3, 0, 125, 122, 1, 0, 0, 0, 126, 129, 1, 0, 0, 0, 127, 125, 1, 0, 0, 0, 127, 128, 1, 0, 0, 0, 128, 3, 1, 0, 0, 0, 129, 127, 1, 0, 0, 0, 130, 137, 3, 102, 51, 0, 131, 137, 3, 30, 15, 0, 132, 137, 3, 24, 12, 0, 133, 137, 3, 44, 22, 0, 134, 137, 3, 106, 53, 0, 135, 137, 3, 108, 54, 0, 136, 130, 1, 0, 0, 0, 136, 131, 1, 0, 0, 0, 136, 132, 1, 0, 0, 0, 136, 133, 1, 0, 0, 0, 136, 134, 1, 0, 0, 0, 136, 135, 1, 0, 0, 0, 137, 5, 1, 0, 0, 0, 138, 153, 3, 46, 23, 0, 139, 153, 3, 50, 25, 0, 140, 153, 3, 66, 33, 0, 141, 153, 3, 114, 57, 0, 142, 153, 3, 72, 36, 0, 143, 153, 3, 68, 34, 0, 144, 153, 3, 48, 24, 0, 145, 153, 3, 8, 4, 0, 146, 153, 3, 74, 37, 0, 147, 153, 3, 76, 38, 0, 148, 153, 3, 80, 40, 0, 149, 153, 3, 82, 41, 0, 150, 153, 3, 110, 55, 0, 151, 153, 3, 84, 42, 0, 152, 138, 1, 0, 0, 0, 152, 139, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 141, 1, 0, 0, 0, 152, 142, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 144, 1, 0, 0, 0, 152, 145, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 147, 1, 0, 0, 0, 152, 148, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 152, 150, 1, 0, 0, 0, 152, 151, 1, 0, 0, 0, 153, 7, 1, 0, 0, 0, 154, 155, 5, 20, 0, 0, 155, 156, 3, 10, 5, 0, 156, 9, 1, 0, 0, 0, 157, 158, 6, 5, -1, 0, 158, 159, 5, 48, 0, 0, 159, 186, 3, 10, 5, 7, 160, 186, 3, 14, 7, 0, 161, 186, 3, 12, 6, 0, 162, 164, 3, 14, 7, 0, 163, 165, 5, 48, 0, 0, 164, 163, 1, 0, 0, 0, 164, 165, 1, 0, 0, 0, 165, 166, 1, 0, 0, 0, 166, 167, 5, 45, 0, 0, 167, 168, 5, 44, 0, 0, 168, 173, 3, 14, 7, 0, 169, 170, 5, 38, 0, 0, 170, 172, 3, 14, 7, 0, 171, 169, 1, 0, 0, 0, 172, 175, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 54, 0, 0, 177, 186, 1, 0, 0, 0, 178, 179, 3, 14, 7, 0, 179, 181, 5, 46, 0, 0, 180, 182, 5, 48, 0, 0, 181, 180, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 183, 1, 0, 0, 0, 183, 184, 5, 49, 0, 0, 184, 186, 1, 0, 0, 0, 185, 157, 1, 0, 0, 0, 185, 160, 1, 0, 0, 0, 185, 161, 1, 0, 0, 0, 185, 162, 1, 0, 0, 0, 185, 178, 1, 0, 0, 0, 186, 195, 1, 0, 0, 0, 187, 188, 10, 4, 0, 0, 188, 189, 5, 34, 0, 0, 189, 194, 3, 10, 5, 5, 190, 191, 10, 3, 0, 0, 191, 192, 5, 51, 0, 0, 192, 194, 3, 10, 5, 4, 193, 187, 1, 0, 0, 0, 193, 190, 1, 0, 0, 0, 194, 197, 1, 0, 0, 0, 195, 193, 1, 0, 0, 0, 195, 196, 1, 0, 0, 0, 196, 11, 1, 0, 0, 0, 197, 195, 1, 0, 0, 0, 198, 200, 3, 14, 7, 0, 199, 201, 5, 48, 0, 0, 200, 199, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 202, 1, 0, 0, 0, 202, 203, 5, 47, 0, 0, 203, 204, 3, 98, 49, 0, 204, 213, 1, 0, 0, 0, 205, 207, 3, 14, 7, 0, 206, 208, 5, 48, 0, 0, 207, 206, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 1, 0, 0, 0, 209, 210, 5, 53, 0, 0, 210, 211, 3, 98, 49, 0, 211, 213, 1, 0, 0, 0, 212, 198, 1, 0, 0, 0, 212, 205, 1, 0, 0, 0, 213, 13, 1, 0, 0, 0, 214, 220, 3, 16, 8, 0, 215, 216, 3, 16, 8, 0, 216, 217, 3, 100, 50, 0, 217, 218, 3, 16, 8, 0, 218, 220, 1, 0, 0, 0, 219, 214, 1, 0, 0, 0, 219, 215, 1, 0, 0, 0, 220, 15, 1, 0, 0, 0, 221, 222, 6, 8, -1, 0, 222, 226, 3, 18, 9, 0, 223, 224, 7, 0, 0, 0, 224, 226, 3, 16, 8, 3, 225, 221, 1, 0, 0, 0, 225, 223, 1, 0, 0, 0, 226, 235, 1, 0, 0, 0, 227, 228, 10, 2, 0, 0, 228, 229, 7, 1, 0, 0, 229, 234, 3, 16, 8, 3, 230, 231, 10, 1, 0, 0, 231, 232, 7, 0, 0, 0, 232, 234, 3, 16, 8, 2, 233, 227, 1, 0, 0, 0, 233, 230, 1, 0, 0, 0, 234, 237, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 17, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 238, 239, 6, 9, -1, 0, 239, 247, 3, 62, 31, 0, 240, 247, 3, 52, 26, 0, 241, 247, 3, 20, 10, 0, 242, 243, 5, 44, 0, 0, 243, 244, 3, 10, 5, 0, 244, 245, 5, 54, 0, 0, 245, 247, 1, 0, 0, 0, 246, 238, 1, 0, 0, 0, 246, 240, 1, 0, 0, 0, 246, 241, 1, 0, 0, 0, 246, 242, 1, 0, 0, 0, 247, 253, 1, 0, 0, 0, 248, 249, 10, 1, 0, 0, 249, 250, 5, 37, 0, 0, 250, 252, 3, 22, 11, 0, 251, 248, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 19, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 257, 3, 58, 29, 0, 257, 267, 5, 44, 0, 0, 258, 268, 5, 65, 0, 0, 259, 264, 3, 10, 5, 0, 260, 261, 5, 38, 0, 0, 261, 263, 3, 10, 5, 0, 262, 260, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 267, 258, 1, 0, 0, 0, 267, 259, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 270, 5, 54, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 3, 58, 29, 0, 272, 23, 1, 0, 0, 0, 273, 274, 5, 16, 0, 0, 274, 275, 3, 26, 13, 0, 275, 25, 1, 0, 0, 0, 276, 281, 3, 28, 14, 0, 277, 278, 5, 38, 0, 0, 278, 280, 3, 28, 14, 0, 279, 277, 1, 0, 0, 0, 280, 283, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 27, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 290, 3, 10, 5, 0, 285, 286, 3, 52, 26, 0, 286, 287, 5, 36, 0, 0, 287, 288, 3, 10, 5, 0, 288, 290, 1, 0, 0, 0, 289, 284, 1, 0, 0, 0, 289, 285, 1, 0, 0, 0, 290, 29, 1, 0, 0, 0, 291, 292, 5, 6, 0, 0, 292, 297, 3, 32, 16, 0, 293, 294, 5, 38, 0, 0, 294, 296, 3, 32, 16, 0, 295, 293, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 302, 3, 38, 19, 0, 301, 300, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 31, 1, 0, 0, 0, 303, 304, 3, 34, 17, 0, 304, 305, 5, 114, 0, 0, 305, 306, 3, 36, 18, 0, 306, 309, 1, 0, 0, 0, 307, 309, 3, 36, 18, 0, 308, 303, 1, 0, 0, 0, 308, 307, 1, 0, 0, 0, 309, 33, 1, 0, 0, 0, 310, 311, 5, 25, 0, 0, 311, 35, 1, 0, 0, 0, 312, 313, 7, 2, 0, 0, 313, 37, 1, 0, 0, 0, 314, 317, 3, 40, 20, 0, 315, 317, 3, 42, 21, 0, 316, 314, 1, 0, 0, 0, 316, 315, 1, 0, 0, 0, 317, 39, 1, 0, 0, 0, 318, 319, 5, 76, 0, 0, 319, 324, 5, 25, 0, 0, 320, 321, 5, 38, 0, 0, 321, 323, 5, 25, 0, 0, 322, 320, 1, 0, 0, 0, 323, 326, 1, 0, 0, 0, 324, 322, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 41, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 327, 328, 5, 69, 0, 0, 328, 329, 3, 40, 20, 0, 329, 330, 5, 70, 0, 0, 330, 43, 1, 0, 0, 0, 331, 332, 5, 13, 0, 0, 332, 337, 3, 32, 16, 0, 333, 334, 5, 38, 0, 0, 334, 336, 3, 32, 16, 0, 335, 333, 1, 0, 0, 0, 336, 339, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 341, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 340, 342, 3, 26, 13, 0, 341, 340, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 345, 1, 0, 0, 0, 343, 344, 5, 33, 0, 0, 344, 346, 3, 26, 13, 0, 345, 343, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 45, 1, 0, 0, 0, 347, 348, 5, 4, 0, 0, 348, 349, 3, 26, 13, 0, 349, 47, 1, 0, 0, 0, 350, 352, 5, 19, 0, 0, 351, 353, 3, 26, 13, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 355, 5, 33, 0, 0, 355, 357, 3, 26, 13, 0, 356, 354, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 49, 1, 0, 0, 0, 358, 359, 5, 8, 0, 0, 359, 362, 3, 26, 13, 0, 360, 361, 5, 33, 0, 0, 361, 363, 3, 26, 13, 0, 362, 360, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 51, 1, 0, 0, 0, 364, 369, 3, 58, 29, 0, 365, 366, 5, 40, 0, 0, 366, 368, 3, 58, 29, 0, 367, 365, 1, 0, 0, 0, 368, 371, 1, 0, 0, 0, 369, 367, 1, 0, 0, 0, 369, 370, 1, 0, 0, 0, 370, 53, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 372, 377, 3, 60, 30, 0, 373, 374, 5, 40, 0, 0, 374, 376, 3, 60, 30, 0, 375, 373, 1, 0, 0, 0, 376, 379, 1, 0, 0, 0, 377, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 55, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 380, 385, 3, 54, 27, 0, 381, 382, 5, 38, 0, 0, 382, 384, 3, 54, 27, 0, 383, 381, 1, 0, 0, 0, 384, 387, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 57, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 388, 389, 7, 3, 0, 0, 389, 59, 1, 0, 0, 0, 390, 391, 5, 80, 0, 0, 391, 61, 1, 0, 0, 0, 392, 435, 5, 49, 0, 0, 393, 394, 3, 96, 48, 0, 394, 395, 5, 71, 0, 0, 395, 435, 1, 0, 0, 0, 396, 435, 3, 94, 47, 0, 397, 435, 3, 96, 48, 0, 398, 435, 3, 90, 45, 0, 399, 435, 3, 64, 32, 0, 400, 435, 3, 98, 49, 0, 401, 402, 5, 69, 0, 0, 402, 407, 3, 92, 46, 0, 403, 404, 5, 38, 0, 0, 404, 406, 3, 92, 46, 0, 405, 403, 1, 0, 0, 0, 406, 409, 1, 0, 0, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 410, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 410, 411, 5, 70, 0, 0, 411, 435, 1, 0, 0, 0, 412, 413, 5, 69, 0, 0, 413, 418, 3, 90, 45, 0, 414, 415, 5, 38, 0, 0, 415, 417, 3, 90, 45, 0, 416, 414, 1, 0, 0, 0, 417, 420, 1, 0, 0, 0, 418, 416, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 418, 1, 0, 0, 0, 421, 422, 5, 70, 0, 0, 422, 435, 1, 0, 0, 0, 423, 424, 5, 69, 0, 0, 424, 429, 3, 98, 49, 0, 425, 426, 5, 38, 0, 0, 426, 428, 3, 98, 49, 0, 427, 425, 1, 0, 0, 0, 428, 431, 1, 0, 0, 0, 429, 427, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 432, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 432, 433, 5, 70, 0, 0, 433, 435, 1, 0, 0, 0, 434, 392, 1, 0, 0, 0, 434, 393, 1, 0, 0, 0, 434, 396, 1, 0, 0, 0, 434, 397, 1, 0, 0, 0, 434, 398, 1, 0, 0, 0, 434, 399, 1, 0, 0, 0, 434, 400, 1, 0, 0, 0, 434, 401, 1, 0, 0, 0, 434, 412, 1, 0, 0, 0, 434, 423, 1, 0, 0, 0, 435, 63, 1, 0, 0, 0, 436, 439, 5, 52, 0, 0, 437, 439, 5, 68, 0, 0, 438, 436, 1, 0, 0, 0, 438, 437, 1, 0, 0, 0, 439, 65, 1, 0, 0, 0, 440, 441, 5, 10, 0, 0, 441, 442, 5, 31, 0, 0, 442, 67, 1, 0, 0, 0, 443, 444, 5, 18, 0, 0, 444, 449, 3, 70, 35, 0, 445, 446, 5, 38, 0, 0, 446, 448, 3, 70, 35, 0, 447, 445, 1, 0, 0, 0, 448, 451, 1, 0, 0, 0, 449, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 69, 1, 0, 0, 0, 451, 449, 1, 0, 0, 0, 452, 454, 3, 10, 5, 0, 453, 455, 7, 4, 0, 0, 454, 453, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 458, 1, 0, 0, 0, 456, 457, 5, 50, 0, 0, 457, 459, 7, 5, 0, 0, 458, 456, 1, 0, 0, 0, 458, 459, 1, 0, 0, 0, 459, 71, 1, 0, 0, 0, 460, 461, 5, 9, 0, 0, 461, 462, 3, 56, 28, 0, 462, 73, 1, 0, 0, 0, 463, 464, 5, 2, 0, 0, 464, 465, 3, 56, 28, 0, 465, 75, 1, 0, 0, 0, 466, 467, 5, 15, 0, 0, 467, 472, 3, 78, 39, 0, 468, 469, 5, 38, 0, 0, 469, 471, 3, 78, 39, 0, 470, 468, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 77, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 475, 476, 3, 54, 27, 0, 476, 477, 5, 84, 0, 0, 477, 478, 3, 54, 27, 0, 478, 79, 1, 0, 0, 0, 479, 480, 5, 1, 0, 0, 480, 481, 3, 18, 9, 0, 481, 483, 3, 98, 49, 0, 482, 484, 3, 86, 43, 0, 483, 482, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 81, 1, 0, 0, 0, 485, 486, 5, 7, 0, 0, 486, 487, 3, 18, 9, 0, 487, 488, 3, 98, 49, 0, 488, 83, 1, 0, 0, 0, 489, 490, 5, 14, 0, 0, 490, 491, 3, 52, 26, 0, 491, 85, 1, 0, 0, 0, 492, 497, 3, 88, 44, 0, 493, 494, 5, 38, 0, 0, 494, 496, 3, 88, 44, 0, 495, 493, 1, 0, 0, 0, 496, 499, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 87, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 501, 3, 58, 29, 0, 501, 502, 5, 36, 0, 0, 502, 503, 3, 62, 31, 0, 503, 89, 1, 0, 0, 0, 504, 505, 7, 6, 0, 0, 505, 91, 1, 0, 0, 0, 506, 509, 3, 94, 47, 0, 507, 509, 3, 96, 48, 0, 508, 506, 1, 0, 0, 0, 508, 507, 1, 0, 0, 0, 509, 93, 1, 0, 0, 0, 510, 512, 7, 0, 0, 0, 511, 510, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 1, 0, 0, 0, 513, 514, 5, 32, 0, 0, 514, 95, 1, 0, 0, 0, 515, 517, 7, 0, 0, 0, 516, 515, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 5, 31, 0, 0, 519, 97, 1, 0, 0, 0, 520, 521, 5, 30, 0, 0, 521, 99, 1, 0, 0, 0, 522, 523, 7, 7, 0, 0, 523, 101, 1, 0, 0, 0, 524, 525, 5, 5, 0, 0, 525, 526, 3, 104, 52, 0, 526, 103, 1, 0, 0, 0, 527, 528, 5, 69, 0, 0, 528, 529, 3, 2, 1, 0, 529, 530, 5, 70, 0, 0, 530, 105, 1, 0, 0, 0, 531, 532, 5, 17, 0, 0, 532, 533, 5, 106, 0, 0, 533, 107, 1, 0, 0, 0, 534, 535, 5, 12, 0, 0, 535, 536, 5, 110, 0, 0, 536, 109, 1, 0, 0, 0, 537, 538, 5, 3, 0, 0, 538, 541, 5, 90, 0, 0, 539, 540, 5, 88, 0, 0, 540, 542, 3, 54, 27, 0, 541, 539, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 552, 1, 0, 0, 0, 543, 544, 5, 89, 0, 0, 544, 549, 3, 112, 56, 0, 545, 546, 5, 38, 0, 0, 546, 548, 3, 112, 56, 0, 547, 545, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 543, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 111, 1, 0, 0, 0, 554, 555, 3, 54, 27, 0, 555, 556, 5, 36, 0, 0, 556, 558, 1, 0, 0, 0, 557, 554, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 3, 54, 27, 0, 560, 113, 1, 0, 0, 0, 561, 562, 5, 11, 0, 0, 562, 563, 3, 32, 16, 0, 563, 564, 5, 88, 0, 0, 564, 565, 3, 56, 28, 0, 565, 115, 1, 0, 0, 0, 54, 127, 136, 152, 164, 173, 181, 185, 193, 195, 200, 207, 212, 219, 225, 233, 235, 246, 253, 264, 267, 281, 289, 297, 301, 308, 316, 324, 337, 341, 345, 352, 356, 362, 369, 377, 385, 407, 418, 429, 434, 438, 449, 454, 458, 472, 483, 497, 508, 511, 516, 541, 549, 552, 557] \ No newline at end of file diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens index 04798fc3dca8a..63eb3a86419a3 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.tokens +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.tokens @@ -22,7 +22,7 @@ UNKNOWN_CMD=21 LINE_COMMENT=22 MULTILINE_COMMENT=23 WS=24 -INDEX_UNQUOTED_IDENTIFIER=25 +UNQUOTED_SOURCE=25 EXPLAIN_WS=26 EXPLAIN_LINE_COMMENT=27 EXPLAIN_MULTILINE_COMMENT=28 diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser.ts b/packages/kbn-esql-ast/src/antlr/esql_parser.ts index 5181349c62c88..1c8ce9f0d86e5 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser.ts @@ -42,7 +42,7 @@ export default class esql_parser extends Parser { public static readonly LINE_COMMENT = 22; public static readonly MULTILINE_COMMENT = 23; public static readonly WS = 24; - public static readonly INDEX_UNQUOTED_IDENTIFIER = 25; + public static readonly UNQUOTED_SOURCE = 25; public static readonly EXPLAIN_WS = 26; public static readonly EXPLAIN_LINE_COMMENT = 27; public static readonly EXPLAIN_MULTILINE_COMMENT = 28; @@ -159,213 +159,216 @@ export default class esql_parser extends Parser { public static readonly RULE_fields = 13; public static readonly RULE_field = 14; public static readonly RULE_fromCommand = 15; - public static readonly RULE_indexIdentifier = 16; - public static readonly RULE_metadata = 17; - public static readonly RULE_metadataOption = 18; - public static readonly RULE_deprecated_metadata = 19; - public static readonly RULE_metricsCommand = 20; - public static readonly RULE_evalCommand = 21; - public static readonly RULE_statsCommand = 22; - public static readonly RULE_inlinestatsCommand = 23; - public static readonly RULE_qualifiedName = 24; - public static readonly RULE_qualifiedNamePattern = 25; - public static readonly RULE_qualifiedNamePatterns = 26; - public static readonly RULE_identifier = 27; - public static readonly RULE_identifierPattern = 28; - public static readonly RULE_constant = 29; - public static readonly RULE_params = 30; - public static readonly RULE_limitCommand = 31; - public static readonly RULE_sortCommand = 32; - public static readonly RULE_orderExpression = 33; - public static readonly RULE_keepCommand = 34; - public static readonly RULE_dropCommand = 35; - public static readonly RULE_renameCommand = 36; - public static readonly RULE_renameClause = 37; - public static readonly RULE_dissectCommand = 38; - public static readonly RULE_grokCommand = 39; - public static readonly RULE_mvExpandCommand = 40; - public static readonly RULE_commandOptions = 41; - public static readonly RULE_commandOption = 42; - public static readonly RULE_booleanValue = 43; - public static readonly RULE_numericValue = 44; - public static readonly RULE_decimalValue = 45; - public static readonly RULE_integerValue = 46; - public static readonly RULE_string = 47; - public static readonly RULE_comparisonOperator = 48; - public static readonly RULE_explainCommand = 49; - public static readonly RULE_subqueryExpression = 50; - public static readonly RULE_showCommand = 51; - public static readonly RULE_metaCommand = 52; - public static readonly RULE_enrichCommand = 53; - public static readonly RULE_enrichWithClause = 54; - public static readonly RULE_lookupCommand = 55; - public static readonly literalNames: (string | null)[] = [ null, "'dissect'", - "'drop'", "'enrich'", - "'eval'", "'explain'", - "'from'", "'grok'", - "'inlinestats'", - "'keep'", "'limit'", - "'lookup'", - "'meta'", "'metrics'", - "'mv_expand'", - "'rename'", - "'row'", "'show'", - "'sort'", "'stats'", - "'where'", null, - null, null, - null, null, - null, null, - null, "'|'", - null, null, - null, "'by'", - "'and'", "'asc'", - "'='", "'::'", - "','", "'desc'", - "'.'", "'false'", - "'first'", "'last'", - "'('", "'in'", - "'is'", "'like'", - "'not'", "'null'", - "'nulls'", "'or'", - "'?'", "'rlike'", - "')'", "'true'", - "'=='", "'=~'", - "'!='", "'<'", - "'<='", "'>'", - "'>='", "'+'", - "'-'", "'*'", - "'/'", "'%'", - null, null, - "']'", null, - null, null, - null, null, - "'metadata'", - null, null, - null, null, - null, null, - null, "'as'", - null, null, - null, "'on'", - "'with'", null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, null, - null, "'info'", - null, null, - null, "'functions'", - null, null, + public static readonly RULE_indexPattern = 16; + public static readonly RULE_clusterString = 17; + public static readonly RULE_indexString = 18; + public static readonly RULE_metadata = 19; + public static readonly RULE_metadataOption = 20; + public static readonly RULE_deprecated_metadata = 21; + public static readonly RULE_metricsCommand = 22; + public static readonly RULE_evalCommand = 23; + public static readonly RULE_statsCommand = 24; + public static readonly RULE_inlinestatsCommand = 25; + public static readonly RULE_qualifiedName = 26; + public static readonly RULE_qualifiedNamePattern = 27; + public static readonly RULE_qualifiedNamePatterns = 28; + public static readonly RULE_identifier = 29; + public static readonly RULE_identifierPattern = 30; + public static readonly RULE_constant = 31; + public static readonly RULE_params = 32; + public static readonly RULE_limitCommand = 33; + public static readonly RULE_sortCommand = 34; + public static readonly RULE_orderExpression = 35; + public static readonly RULE_keepCommand = 36; + public static readonly RULE_dropCommand = 37; + public static readonly RULE_renameCommand = 38; + public static readonly RULE_renameClause = 39; + public static readonly RULE_dissectCommand = 40; + public static readonly RULE_grokCommand = 41; + public static readonly RULE_mvExpandCommand = 42; + public static readonly RULE_commandOptions = 43; + public static readonly RULE_commandOption = 44; + public static readonly RULE_booleanValue = 45; + public static readonly RULE_numericValue = 46; + public static readonly RULE_decimalValue = 47; + public static readonly RULE_integerValue = 48; + public static readonly RULE_string = 49; + public static readonly RULE_comparisonOperator = 50; + public static readonly RULE_explainCommand = 51; + public static readonly RULE_subqueryExpression = 52; + public static readonly RULE_showCommand = 53; + public static readonly RULE_metaCommand = 54; + public static readonly RULE_enrichCommand = 55; + public static readonly RULE_enrichWithClause = 56; + public static readonly RULE_lookupCommand = 57; + public static readonly literalNames: (string | null)[] = [ null, "'dissect'", + "'drop'", "'enrich'", + "'eval'", "'explain'", + "'from'", "'grok'", + "'inlinestats'", + "'keep'", "'limit'", + "'lookup'", + "'meta'", "'metrics'", + "'mv_expand'", + "'rename'", + "'row'", "'show'", + "'sort'", "'stats'", + "'where'", null, + null, null, + null, null, + null, null, + null, "'|'", + null, null, + null, "'by'", + "'and'", "'asc'", + "'='", "'::'", + "','", "'desc'", + "'.'", "'false'", + "'first'", "'last'", + "'('", "'in'", + "'is'", "'like'", + "'not'", "'null'", + "'nulls'", "'or'", + "'?'", "'rlike'", + "')'", "'true'", + "'=='", "'=~'", + "'!='", "'<'", + "'<='", "'>'", + "'>='", "'+'", + "'-'", "'*'", + "'/'", "'%'", + null, null, + "']'", null, + null, null, + null, null, + "'metadata'", + null, null, + null, null, + null, null, + null, "'as'", + null, null, + null, "'on'", + "'with'", null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, null, + null, "'info'", + null, null, + null, "'functions'", + null, null, null, "':'" ]; - public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", - "DROP", "ENRICH", - "EVAL", "EXPLAIN", - "FROM", "GROK", - "INLINESTATS", - "KEEP", "LIMIT", - "LOOKUP", "META", - "METRICS", - "MV_EXPAND", - "RENAME", "ROW", - "SHOW", "SORT", - "STATS", "WHERE", - "UNKNOWN_CMD", - "LINE_COMMENT", - "MULTILINE_COMMENT", - "WS", "INDEX_UNQUOTED_IDENTIFIER", - "EXPLAIN_WS", - "EXPLAIN_LINE_COMMENT", - "EXPLAIN_MULTILINE_COMMENT", - "PIPE", "QUOTED_STRING", - "INTEGER_LITERAL", - "DECIMAL_LITERAL", - "BY", "AND", - "ASC", "ASSIGN", - "CAST_OP", - "COMMA", "DESC", - "DOT", "FALSE", - "FIRST", "LAST", - "LP", "IN", - "IS", "LIKE", - "NOT", "NULL", - "NULLS", "OR", - "PARAM", "RLIKE", - "RP", "TRUE", - "EQ", "CIEQ", - "NEQ", "LT", - "LTE", "GT", - "GTE", "PLUS", - "MINUS", "ASTERISK", - "SLASH", "PERCENT", - "NAMED_OR_POSITIONAL_PARAM", - "OPENING_BRACKET", - "CLOSING_BRACKET", - "UNQUOTED_IDENTIFIER", - "QUOTED_IDENTIFIER", - "EXPR_LINE_COMMENT", - "EXPR_MULTILINE_COMMENT", - "EXPR_WS", - "METADATA", - "FROM_LINE_COMMENT", - "FROM_MULTILINE_COMMENT", - "FROM_WS", - "ID_PATTERN", - "PROJECT_LINE_COMMENT", - "PROJECT_MULTILINE_COMMENT", - "PROJECT_WS", - "AS", "RENAME_LINE_COMMENT", - "RENAME_MULTILINE_COMMENT", - "RENAME_WS", - "ON", "WITH", - "ENRICH_POLICY_NAME", - "ENRICH_LINE_COMMENT", - "ENRICH_MULTILINE_COMMENT", - "ENRICH_WS", - "ENRICH_FIELD_LINE_COMMENT", - "ENRICH_FIELD_MULTILINE_COMMENT", - "ENRICH_FIELD_WS", - "LOOKUP_LINE_COMMENT", - "LOOKUP_MULTILINE_COMMENT", - "LOOKUP_WS", - "LOOKUP_FIELD_LINE_COMMENT", - "LOOKUP_FIELD_MULTILINE_COMMENT", - "LOOKUP_FIELD_WS", - "MVEXPAND_LINE_COMMENT", - "MVEXPAND_MULTILINE_COMMENT", - "MVEXPAND_WS", - "INFO", "SHOW_LINE_COMMENT", - "SHOW_MULTILINE_COMMENT", - "SHOW_WS", - "FUNCTIONS", - "META_LINE_COMMENT", - "META_MULTILINE_COMMENT", - "META_WS", - "COLON", "SETTING", - "SETTING_LINE_COMMENT", - "SETTTING_MULTILINE_COMMENT", - "SETTING_WS", - "METRICS_LINE_COMMENT", - "METRICS_MULTILINE_COMMENT", - "METRICS_WS", - "CLOSING_METRICS_LINE_COMMENT", - "CLOSING_METRICS_MULTILINE_COMMENT", + public static readonly symbolicNames: (string | null)[] = [ null, "DISSECT", + "DROP", "ENRICH", + "EVAL", "EXPLAIN", + "FROM", "GROK", + "INLINESTATS", + "KEEP", "LIMIT", + "LOOKUP", "META", + "METRICS", + "MV_EXPAND", + "RENAME", "ROW", + "SHOW", "SORT", + "STATS", "WHERE", + "UNKNOWN_CMD", + "LINE_COMMENT", + "MULTILINE_COMMENT", + "WS", "UNQUOTED_SOURCE", + "EXPLAIN_WS", + "EXPLAIN_LINE_COMMENT", + "EXPLAIN_MULTILINE_COMMENT", + "PIPE", "QUOTED_STRING", + "INTEGER_LITERAL", + "DECIMAL_LITERAL", + "BY", "AND", + "ASC", "ASSIGN", + "CAST_OP", + "COMMA", "DESC", + "DOT", "FALSE", + "FIRST", "LAST", + "LP", "IN", + "IS", "LIKE", + "NOT", "NULL", + "NULLS", "OR", + "PARAM", "RLIKE", + "RP", "TRUE", + "EQ", "CIEQ", + "NEQ", "LT", + "LTE", "GT", + "GTE", "PLUS", + "MINUS", "ASTERISK", + "SLASH", "PERCENT", + "NAMED_OR_POSITIONAL_PARAM", + "OPENING_BRACKET", + "CLOSING_BRACKET", + "UNQUOTED_IDENTIFIER", + "QUOTED_IDENTIFIER", + "EXPR_LINE_COMMENT", + "EXPR_MULTILINE_COMMENT", + "EXPR_WS", + "METADATA", + "FROM_LINE_COMMENT", + "FROM_MULTILINE_COMMENT", + "FROM_WS", + "ID_PATTERN", + "PROJECT_LINE_COMMENT", + "PROJECT_MULTILINE_COMMENT", + "PROJECT_WS", + "AS", "RENAME_LINE_COMMENT", + "RENAME_MULTILINE_COMMENT", + "RENAME_WS", + "ON", "WITH", + "ENRICH_POLICY_NAME", + "ENRICH_LINE_COMMENT", + "ENRICH_MULTILINE_COMMENT", + "ENRICH_WS", + "ENRICH_FIELD_LINE_COMMENT", + "ENRICH_FIELD_MULTILINE_COMMENT", + "ENRICH_FIELD_WS", + "LOOKUP_LINE_COMMENT", + "LOOKUP_MULTILINE_COMMENT", + "LOOKUP_WS", + "LOOKUP_FIELD_LINE_COMMENT", + "LOOKUP_FIELD_MULTILINE_COMMENT", + "LOOKUP_FIELD_WS", + "MVEXPAND_LINE_COMMENT", + "MVEXPAND_MULTILINE_COMMENT", + "MVEXPAND_WS", + "INFO", "SHOW_LINE_COMMENT", + "SHOW_MULTILINE_COMMENT", + "SHOW_WS", + "FUNCTIONS", + "META_LINE_COMMENT", + "META_MULTILINE_COMMENT", + "META_WS", + "COLON", "SETTING", + "SETTING_LINE_COMMENT", + "SETTTING_MULTILINE_COMMENT", + "SETTING_WS", + "METRICS_LINE_COMMENT", + "METRICS_MULTILINE_COMMENT", + "METRICS_WS", + "CLOSING_METRICS_LINE_COMMENT", + "CLOSING_METRICS_MULTILINE_COMMENT", "CLOSING_METRICS_WS" ]; // tslint:disable:no-trailing-whitespace public static readonly ruleNames: string[] = [ - "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", - "booleanExpression", "regexBooleanExpression", "valueExpression", "operatorExpression", - "primaryExpression", "functionExpression", "dataType", "rowCommand", "fields", - "field", "fromCommand", "indexIdentifier", "metadata", "metadataOption", - "deprecated_metadata", "metricsCommand", "evalCommand", "statsCommand", - "inlinestatsCommand", "qualifiedName", "qualifiedNamePattern", "qualifiedNamePatterns", - "identifier", "identifierPattern", "constant", "params", "limitCommand", - "sortCommand", "orderExpression", "keepCommand", "dropCommand", "renameCommand", - "renameClause", "dissectCommand", "grokCommand", "mvExpandCommand", "commandOptions", - "commandOption", "booleanValue", "numericValue", "decimalValue", "integerValue", - "string", "comparisonOperator", "explainCommand", "subqueryExpression", - "showCommand", "metaCommand", "enrichCommand", "enrichWithClause", "lookupCommand", + "singleStatement", "query", "sourceCommand", "processingCommand", "whereCommand", + "booleanExpression", "regexBooleanExpression", "valueExpression", "operatorExpression", + "primaryExpression", "functionExpression", "dataType", "rowCommand", "fields", + "field", "fromCommand", "indexPattern", "clusterString", "indexString", + "metadata", "metadataOption", "deprecated_metadata", "metricsCommand", + "evalCommand", "statsCommand", "inlinestatsCommand", "qualifiedName", + "qualifiedNamePattern", "qualifiedNamePatterns", "identifier", "identifierPattern", + "constant", "params", "limitCommand", "sortCommand", "orderExpression", + "keepCommand", "dropCommand", "renameCommand", "renameClause", "dissectCommand", + "grokCommand", "mvExpandCommand", "commandOptions", "commandOption", "booleanValue", + "numericValue", "decimalValue", "integerValue", "string", "comparisonOperator", + "explainCommand", "subqueryExpression", "showCommand", "metaCommand", + "enrichCommand", "enrichWithClause", "lookupCommand", ]; public get grammarFileName(): string { return "esql_parser.g4"; } public get literalNames(): (string | null)[] { return esql_parser.literalNames; } @@ -388,9 +391,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 112; + this.state = 116; this.query(0); - this.state = 113; + this.state = 117; this.match(esql_parser.EOF); } } @@ -432,11 +435,11 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 116; + this.state = 120; this.sourceCommand(); } this._ctx.stop = this._input.LT(-1); - this.state = 123; + this.state = 127; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -449,18 +452,18 @@ export default class esql_parser extends Parser { { localctx = new CompositeQueryContext(this, new QueryContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_query); - this.state = 118; + this.state = 122; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 119; + this.state = 123; this.match(esql_parser.PIPE); - this.state = 120; + this.state = 124; this.processingCommand(); } } } - this.state = 125; + this.state = 129; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 0, this._ctx); } @@ -485,48 +488,48 @@ export default class esql_parser extends Parser { let localctx: SourceCommandContext = new SourceCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 4, esql_parser.RULE_sourceCommand); try { - this.state = 132; + this.state = 136; this._errHandler.sync(this); switch (this._input.LA(1)) { case 5: this.enterOuterAlt(localctx, 1); { - this.state = 126; + this.state = 130; this.explainCommand(); } break; case 6: this.enterOuterAlt(localctx, 2); { - this.state = 127; + this.state = 131; this.fromCommand(); } break; case 16: this.enterOuterAlt(localctx, 3); { - this.state = 128; + this.state = 132; this.rowCommand(); } break; case 13: this.enterOuterAlt(localctx, 4); { - this.state = 129; + this.state = 133; this.metricsCommand(); } break; case 17: this.enterOuterAlt(localctx, 5); { - this.state = 130; + this.state = 134; this.showCommand(); } break; case 12: this.enterOuterAlt(localctx, 6); { - this.state = 131; + this.state = 135; this.metaCommand(); } break; @@ -553,104 +556,104 @@ export default class esql_parser extends Parser { let localctx: ProcessingCommandContext = new ProcessingCommandContext(this, this._ctx, this.state); this.enterRule(localctx, 6, esql_parser.RULE_processingCommand); try { - this.state = 148; + this.state = 152; this._errHandler.sync(this); switch (this._input.LA(1)) { case 4: this.enterOuterAlt(localctx, 1); { - this.state = 134; + this.state = 138; this.evalCommand(); } break; case 8: this.enterOuterAlt(localctx, 2); { - this.state = 135; + this.state = 139; this.inlinestatsCommand(); } break; case 10: this.enterOuterAlt(localctx, 3); { - this.state = 136; + this.state = 140; this.limitCommand(); } break; case 11: this.enterOuterAlt(localctx, 4); { - this.state = 137; + this.state = 141; this.lookupCommand(); } break; case 9: this.enterOuterAlt(localctx, 5); { - this.state = 138; + this.state = 142; this.keepCommand(); } break; case 18: this.enterOuterAlt(localctx, 6); { - this.state = 139; + this.state = 143; this.sortCommand(); } break; case 19: this.enterOuterAlt(localctx, 7); { - this.state = 140; + this.state = 144; this.statsCommand(); } break; case 20: this.enterOuterAlt(localctx, 8); { - this.state = 141; + this.state = 145; this.whereCommand(); } break; case 2: this.enterOuterAlt(localctx, 9); { - this.state = 142; + this.state = 146; this.dropCommand(); } break; case 15: this.enterOuterAlt(localctx, 10); { - this.state = 143; + this.state = 147; this.renameCommand(); } break; case 1: this.enterOuterAlt(localctx, 11); { - this.state = 144; + this.state = 148; this.dissectCommand(); } break; case 7: this.enterOuterAlt(localctx, 12); { - this.state = 145; + this.state = 149; this.grokCommand(); } break; case 3: this.enterOuterAlt(localctx, 13); { - this.state = 146; + this.state = 150; this.enrichCommand(); } break; case 14: this.enterOuterAlt(localctx, 14); { - this.state = 147; + this.state = 151; this.mvExpandCommand(); } break; @@ -679,9 +682,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 150; + this.state = 154; this.match(esql_parser.WHERE); - this.state = 151; + this.state = 155; this.booleanExpression(0); } } @@ -719,7 +722,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 181; + this.state = 185; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 6, this._ctx) ) { case 1: @@ -728,9 +731,9 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 154; + this.state = 158; this.match(esql_parser.NOT); - this.state = 155; + this.state = 159; this.booleanExpression(7); } break; @@ -739,7 +742,7 @@ export default class esql_parser extends Parser { localctx = new BooleanDefaultContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 156; + this.state = 160; this.valueExpression(); } break; @@ -748,7 +751,7 @@ export default class esql_parser extends Parser { localctx = new RegexExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 157; + this.state = 161; this.regexBooleanExpression(); } break; @@ -757,41 +760,41 @@ export default class esql_parser extends Parser { localctx = new LogicalInContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 158; + this.state = 162; this.valueExpression(); - this.state = 160; + this.state = 164; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===48) { { - this.state = 159; + this.state = 163; this.match(esql_parser.NOT); } } - this.state = 162; + this.state = 166; this.match(esql_parser.IN); - this.state = 163; + this.state = 167; this.match(esql_parser.LP); - this.state = 164; + this.state = 168; this.valueExpression(); - this.state = 169; + this.state = 173; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===38) { { { - this.state = 165; + this.state = 169; this.match(esql_parser.COMMA); - this.state = 166; + this.state = 170; this.valueExpression(); } } - this.state = 171; + this.state = 175; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 172; + this.state = 176; this.match(esql_parser.RP); } break; @@ -800,27 +803,27 @@ export default class esql_parser extends Parser { localctx = new IsNullContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 174; + this.state = 178; this.valueExpression(); - this.state = 175; + this.state = 179; this.match(esql_parser.IS); - this.state = 177; + this.state = 181; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===48) { { - this.state = 176; + this.state = 180; this.match(esql_parser.NOT); } } - this.state = 179; + this.state = 183; this.match(esql_parser.NULL); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 191; + this.state = 195; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -830,7 +833,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 189; + this.state = 193; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 7, this._ctx) ) { case 1: @@ -838,13 +841,13 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 183; + this.state = 187; if (!(this.precpred(this._ctx, 4))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 4)"); } - this.state = 184; + this.state = 188; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.AND); - this.state = 185; + this.state = 189; (localctx as LogicalBinaryContext)._right = this.booleanExpression(5); } break; @@ -853,20 +856,20 @@ export default class esql_parser extends Parser { localctx = new LogicalBinaryContext(this, new BooleanExpressionContext(this, _parentctx, _parentState)); (localctx as LogicalBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_booleanExpression); - this.state = 186; + this.state = 190; if (!(this.precpred(this._ctx, 3))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 3)"); } - this.state = 187; + this.state = 191; (localctx as LogicalBinaryContext)._operator = this.match(esql_parser.OR); - this.state = 188; + this.state = 192; (localctx as LogicalBinaryContext)._right = this.booleanExpression(4); } break; } } } - this.state = 193; + this.state = 197; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 8, this._ctx); } @@ -892,48 +895,48 @@ export default class esql_parser extends Parser { this.enterRule(localctx, 12, esql_parser.RULE_regexBooleanExpression); let _la: number; try { - this.state = 208; + this.state = 212; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 11, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 194; + this.state = 198; this.valueExpression(); - this.state = 196; + this.state = 200; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===48) { { - this.state = 195; + this.state = 199; this.match(esql_parser.NOT); } } - this.state = 198; + this.state = 202; localctx._kind = this.match(esql_parser.LIKE); - this.state = 199; + this.state = 203; localctx._pattern = this.string_(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 201; + this.state = 205; this.valueExpression(); - this.state = 203; + this.state = 207; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===48) { { - this.state = 202; + this.state = 206; this.match(esql_parser.NOT); } } - this.state = 205; + this.state = 209; localctx._kind = this.match(esql_parser.RLIKE); - this.state = 206; + this.state = 210; localctx._pattern = this.string_(); } break; @@ -958,14 +961,14 @@ export default class esql_parser extends Parser { let localctx: ValueExpressionContext = new ValueExpressionContext(this, this._ctx, this.state); this.enterRule(localctx, 14, esql_parser.RULE_valueExpression); try { - this.state = 215; + this.state = 219; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 12, this._ctx) ) { case 1: localctx = new ValueExpressionDefaultContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 210; + this.state = 214; this.operatorExpression(0); } break; @@ -973,11 +976,11 @@ export default class esql_parser extends Parser { localctx = new ComparisonContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 211; + this.state = 215; (localctx as ComparisonContext)._left = this.operatorExpression(0); - this.state = 212; + this.state = 216; this.comparisonOperator(); - this.state = 213; + this.state = 217; (localctx as ComparisonContext)._right = this.operatorExpression(0); } break; @@ -1017,7 +1020,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 221; + this.state = 225; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 13, this._ctx) ) { case 1: @@ -1026,7 +1029,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 218; + this.state = 222; this.primaryExpression(0); } break; @@ -1035,7 +1038,7 @@ export default class esql_parser extends Parser { localctx = new ArithmeticUnaryContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 219; + this.state = 223; (localctx as ArithmeticUnaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); if(!(_la===63 || _la===64)) { @@ -1045,13 +1048,13 @@ export default class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 220; + this.state = 224; this.operatorExpression(3); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 231; + this.state = 235; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1061,7 +1064,7 @@ export default class esql_parser extends Parser { } _prevctx = localctx; { - this.state = 229; + this.state = 233; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 14, this._ctx) ) { case 1: @@ -1069,11 +1072,11 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 223; + this.state = 227; if (!(this.precpred(this._ctx, 2))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 2)"); } - this.state = 224; + this.state = 228; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); if(!(((((_la - 65)) & ~0x1F) === 0 && ((1 << (_la - 65)) & 7) !== 0))) { @@ -1083,7 +1086,7 @@ export default class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 225; + this.state = 229; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(3); } break; @@ -1092,11 +1095,11 @@ export default class esql_parser extends Parser { localctx = new ArithmeticBinaryContext(this, new OperatorExpressionContext(this, _parentctx, _parentState)); (localctx as ArithmeticBinaryContext)._left = _prevctx; this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_operatorExpression); - this.state = 226; + this.state = 230; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 227; + this.state = 231; (localctx as ArithmeticBinaryContext)._operator = this._input.LT(1); _la = this._input.LA(1); if(!(_la===63 || _la===64)) { @@ -1106,14 +1109,14 @@ export default class esql_parser extends Parser { this._errHandler.reportMatch(this); this.consume(); } - this.state = 228; + this.state = 232; (localctx as ArithmeticBinaryContext)._right = this.operatorExpression(2); } break; } } } - this.state = 233; + this.state = 237; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 15, this._ctx); } @@ -1152,7 +1155,7 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 242; + this.state = 246; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 16, this._ctx) ) { case 1: @@ -1161,7 +1164,7 @@ export default class esql_parser extends Parser { this._ctx = localctx; _prevctx = localctx; - this.state = 235; + this.state = 239; this.constant(); } break; @@ -1170,7 +1173,7 @@ export default class esql_parser extends Parser { localctx = new DereferenceContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 236; + this.state = 240; this.qualifiedName(); } break; @@ -1179,7 +1182,7 @@ export default class esql_parser extends Parser { localctx = new FunctionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 237; + this.state = 241; this.functionExpression(); } break; @@ -1188,17 +1191,17 @@ export default class esql_parser extends Parser { localctx = new ParenthesizedExpressionContext(this, localctx); this._ctx = localctx; _prevctx = localctx; - this.state = 238; + this.state = 242; this.match(esql_parser.LP); - this.state = 239; + this.state = 243; this.booleanExpression(0); - this.state = 240; + this.state = 244; this.match(esql_parser.RP); } break; } this._ctx.stop = this._input.LT(-1); - this.state = 249; + this.state = 253; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { @@ -1211,18 +1214,18 @@ export default class esql_parser extends Parser { { localctx = new InlineCastContext(this, new PrimaryExpressionContext(this, _parentctx, _parentState)); this.pushNewRecursionContext(localctx, _startState, esql_parser.RULE_primaryExpression); - this.state = 244; + this.state = 248; if (!(this.precpred(this._ctx, 1))) { throw this.createFailedPredicateException("this.precpred(this._ctx, 1)"); } - this.state = 245; + this.state = 249; this.match(esql_parser.CAST_OP); - this.state = 246; + this.state = 250; this.dataType(); } } } - this.state = 251; + this.state = 255; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 17, this._ctx); } @@ -1250,16 +1253,16 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 252; + this.state = 256; this.identifier(); - this.state = 253; + this.state = 257; this.match(esql_parser.LP); - this.state = 263; + this.state = 267; this._errHandler.sync(this); switch (this._input.LA(1)) { case 65: { - this.state = 254; + this.state = 258; this.match(esql_parser.ASTERISK); } break; @@ -1280,21 +1283,21 @@ export default class esql_parser extends Parser { case 72: { { - this.state = 255; + this.state = 259; this.booleanExpression(0); - this.state = 260; + this.state = 264; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===38) { { { - this.state = 256; + this.state = 260; this.match(esql_parser.COMMA); - this.state = 257; + this.state = 261; this.booleanExpression(0); } } - this.state = 262; + this.state = 266; this._errHandler.sync(this); _la = this._input.LA(1); } @@ -1306,7 +1309,7 @@ export default class esql_parser extends Parser { default: break; } - this.state = 265; + this.state = 269; this.match(esql_parser.RP); } } @@ -1332,7 +1335,7 @@ export default class esql_parser extends Parser { localctx = new ToDataTypeContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 267; + this.state = 271; this.identifier(); } } @@ -1357,9 +1360,9 @@ export default class esql_parser extends Parser { try { this.enterOuterAlt(localctx, 1); { - this.state = 269; + this.state = 273; this.match(esql_parser.ROW); - this.state = 270; + this.state = 274; this.fields(); } } @@ -1385,23 +1388,23 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 272; + this.state = 276; this.field(); - this.state = 277; + this.state = 281; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 273; + this.state = 277; this.match(esql_parser.COMMA); - this.state = 274; + this.state = 278; this.field(); } } } - this.state = 279; + this.state = 283; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 20, this._ctx); } @@ -1426,24 +1429,24 @@ export default class esql_parser extends Parser { let localctx: FieldContext = new FieldContext(this, this._ctx, this.state); this.enterRule(localctx, 28, esql_parser.RULE_field); try { - this.state = 285; + this.state = 289; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 21, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 280; + this.state = 284; this.booleanExpression(0); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 281; + this.state = 285; this.qualifiedName(); - this.state = 282; + this.state = 286; this.match(esql_parser.ASSIGN); - this.state = 283; + this.state = 287; this.booleanExpression(0); } break; @@ -1471,34 +1474,34 @@ export default class esql_parser extends Parser { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 287; + this.state = 291; this.match(esql_parser.FROM); - this.state = 288; - this.indexIdentifier(); - this.state = 293; + this.state = 292; + this.indexPattern(); + this.state = 297; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 289; + this.state = 293; this.match(esql_parser.COMMA); - this.state = 290; - this.indexIdentifier(); + this.state = 294; + this.indexPattern(); } } } - this.state = 295; + this.state = 299; this._errHandler.sync(this); _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); } - this.state = 297; + this.state = 301; this._errHandler.sync(this); switch ( this._interp.adaptivePredict(this._input, 23, this._ctx) ) { case 1: { - this.state = 296; + this.state = 300; this.metadata(); } break; @@ -1520,14 +1523,89 @@ export default class esql_parser extends Parser { return localctx; } // @RuleVersion(0) - public indexIdentifier(): IndexIdentifierContext { - let localctx: IndexIdentifierContext = new IndexIdentifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 32, esql_parser.RULE_indexIdentifier); + public indexPattern(): IndexPatternContext { + let localctx: IndexPatternContext = new IndexPatternContext(this, this._ctx, this.state); + this.enterRule(localctx, 32, esql_parser.RULE_indexPattern); + try { + this.state = 308; + this._errHandler.sync(this); + switch ( this._interp.adaptivePredict(this._input, 24, this._ctx) ) { + case 1: + this.enterOuterAlt(localctx, 1); + { + this.state = 303; + this.clusterString(); + this.state = 304; + this.match(esql_parser.COLON); + this.state = 305; + this.indexString(); + } + break; + case 2: + this.enterOuterAlt(localctx, 2); + { + this.state = 307; + this.indexString(); + } + break; + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) + public clusterString(): ClusterStringContext { + let localctx: ClusterStringContext = new ClusterStringContext(this, this._ctx, this.state); + this.enterRule(localctx, 34, esql_parser.RULE_clusterString); try { this.enterOuterAlt(localctx, 1); { - this.state = 299; - this.match(esql_parser.INDEX_UNQUOTED_IDENTIFIER); + this.state = 310; + this.match(esql_parser.UNQUOTED_SOURCE); + } + } + catch (re) { + if (re instanceof RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localctx; + } + // @RuleVersion(0) + public indexString(): IndexStringContext { + let localctx: IndexStringContext = new IndexStringContext(this, this._ctx, this.state); + this.enterRule(localctx, 36, esql_parser.RULE_indexString); + let _la: number; + try { + this.enterOuterAlt(localctx, 1); + { + this.state = 312; + _la = this._input.LA(1); + if(!(_la===25 || _la===30)) { + this._errHandler.recoverInline(this); + } + else { + this._errHandler.reportMatch(this); + this.consume(); + } } } catch (re) { @@ -1547,22 +1625,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public metadata(): MetadataContext { let localctx: MetadataContext = new MetadataContext(this, this._ctx, this.state); - this.enterRule(localctx, 34, esql_parser.RULE_metadata); + this.enterRule(localctx, 38, esql_parser.RULE_metadata); try { - this.state = 303; + this.state = 316; this._errHandler.sync(this); switch (this._input.LA(1)) { case 76: this.enterOuterAlt(localctx, 1); { - this.state = 301; + this.state = 314; this.metadataOption(); } break; case 69: this.enterOuterAlt(localctx, 2); { - this.state = 302; + this.state = 315; this.deprecated_metadata(); } break; @@ -1587,32 +1665,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public metadataOption(): MetadataOptionContext { let localctx: MetadataOptionContext = new MetadataOptionContext(this, this._ctx, this.state); - this.enterRule(localctx, 36, esql_parser.RULE_metadataOption); + this.enterRule(localctx, 40, esql_parser.RULE_metadataOption); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 305; + this.state = 318; this.match(esql_parser.METADATA); - this.state = 306; - this.indexIdentifier(); - this.state = 311; + this.state = 319; + this.match(esql_parser.UNQUOTED_SOURCE); + this.state = 324; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 25, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 307; + this.state = 320; this.match(esql_parser.COMMA); - this.state = 308; - this.indexIdentifier(); + this.state = 321; + this.match(esql_parser.UNQUOTED_SOURCE); } } } - this.state = 313; + this.state = 326; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 25, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); } } } @@ -1633,15 +1711,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public deprecated_metadata(): Deprecated_metadataContext { let localctx: Deprecated_metadataContext = new Deprecated_metadataContext(this, this._ctx, this.state); - this.enterRule(localctx, 38, esql_parser.RULE_deprecated_metadata); + this.enterRule(localctx, 42, esql_parser.RULE_deprecated_metadata); try { this.enterOuterAlt(localctx, 1); { - this.state = 314; + this.state = 327; this.match(esql_parser.OPENING_BRACKET); - this.state = 315; + this.state = 328; this.metadataOption(); - this.state = 316; + this.state = 329; this.match(esql_parser.CLOSING_BRACKET); } } @@ -1662,51 +1740,51 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public metricsCommand(): MetricsCommandContext { let localctx: MetricsCommandContext = new MetricsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 40, esql_parser.RULE_metricsCommand); + this.enterRule(localctx, 44, esql_parser.RULE_metricsCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 318; + this.state = 331; this.match(esql_parser.METRICS); - this.state = 319; - this.indexIdentifier(); - this.state = 324; + this.state = 332; + this.indexPattern(); + this.state = 337; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 320; + this.state = 333; this.match(esql_parser.COMMA); - this.state = 321; - this.indexIdentifier(); + this.state = 334; + this.indexPattern(); } } } - this.state = 326; + this.state = 339; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 26, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); } - this.state = 328; + this.state = 341; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 27, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { case 1: { - this.state = 327; + this.state = 340; localctx._aggregates = this.fields(); } break; } - this.state = 332; + this.state = 345; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 28, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 29, this._ctx) ) { case 1: { - this.state = 330; + this.state = 343; this.match(esql_parser.BY); - this.state = 331; + this.state = 344; localctx._grouping = this.fields(); } break; @@ -1730,13 +1808,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public evalCommand(): EvalCommandContext { let localctx: EvalCommandContext = new EvalCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 42, esql_parser.RULE_evalCommand); + this.enterRule(localctx, 46, esql_parser.RULE_evalCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 334; + this.state = 347; this.match(esql_parser.EVAL); - this.state = 335; + this.state = 348; this.fields(); } } @@ -1757,30 +1835,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public statsCommand(): StatsCommandContext { let localctx: StatsCommandContext = new StatsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 44, esql_parser.RULE_statsCommand); + this.enterRule(localctx, 48, esql_parser.RULE_statsCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 337; + this.state = 350; this.match(esql_parser.STATS); - this.state = 339; + this.state = 352; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 29, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { case 1: { - this.state = 338; + this.state = 351; localctx._stats = this.fields(); } break; } - this.state = 343; + this.state = 356; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 30, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { case 1: { - this.state = 341; + this.state = 354; this.match(esql_parser.BY); - this.state = 342; + this.state = 355; localctx._grouping = this.fields(); } break; @@ -1804,22 +1882,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public inlinestatsCommand(): InlinestatsCommandContext { let localctx: InlinestatsCommandContext = new InlinestatsCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 46, esql_parser.RULE_inlinestatsCommand); + this.enterRule(localctx, 50, esql_parser.RULE_inlinestatsCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 345; + this.state = 358; this.match(esql_parser.INLINESTATS); - this.state = 346; + this.state = 359; localctx._stats = this.fields(); - this.state = 349; + this.state = 362; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 31, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 32, this._ctx) ) { case 1: { - this.state = 347; + this.state = 360; this.match(esql_parser.BY); - this.state = 348; + this.state = 361; localctx._grouping = this.fields(); } break; @@ -1843,30 +1921,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public qualifiedName(): QualifiedNameContext { let localctx: QualifiedNameContext = new QualifiedNameContext(this, this._ctx, this.state); - this.enterRule(localctx, 48, esql_parser.RULE_qualifiedName); + this.enterRule(localctx, 52, esql_parser.RULE_qualifiedName); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 351; + this.state = 364; this.identifier(); - this.state = 356; + this.state = 369; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 352; + this.state = 365; this.match(esql_parser.DOT); - this.state = 353; + this.state = 366; this.identifier(); } } } - this.state = 358; + this.state = 371; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 32, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); } } } @@ -1887,30 +1965,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public qualifiedNamePattern(): QualifiedNamePatternContext { let localctx: QualifiedNamePatternContext = new QualifiedNamePatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 50, esql_parser.RULE_qualifiedNamePattern); + this.enterRule(localctx, 54, esql_parser.RULE_qualifiedNamePattern); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 359; + this.state = 372; this.identifierPattern(); - this.state = 364; + this.state = 377; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 360; + this.state = 373; this.match(esql_parser.DOT); - this.state = 361; + this.state = 374; this.identifierPattern(); } } } - this.state = 366; + this.state = 379; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 33, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); } } } @@ -1931,30 +2009,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public qualifiedNamePatterns(): QualifiedNamePatternsContext { let localctx: QualifiedNamePatternsContext = new QualifiedNamePatternsContext(this, this._ctx, this.state); - this.enterRule(localctx, 52, esql_parser.RULE_qualifiedNamePatterns); + this.enterRule(localctx, 56, esql_parser.RULE_qualifiedNamePatterns); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 367; + this.state = 380; this.qualifiedNamePattern(); - this.state = 372; + this.state = 385; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 368; + this.state = 381; this.match(esql_parser.COMMA); - this.state = 369; + this.state = 382; this.qualifiedNamePattern(); } } } - this.state = 374; + this.state = 387; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 35, this._ctx); } } } @@ -1975,12 +2053,12 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public identifier(): IdentifierContext { let localctx: IdentifierContext = new IdentifierContext(this, this._ctx, this.state); - this.enterRule(localctx, 54, esql_parser.RULE_identifier); + this.enterRule(localctx, 58, esql_parser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 375; + this.state = 388; _la = this._input.LA(1); if(!(_la===71 || _la===72)) { this._errHandler.recoverInline(this); @@ -2008,11 +2086,11 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public identifierPattern(): IdentifierPatternContext { let localctx: IdentifierPatternContext = new IdentifierPatternContext(this, this._ctx, this.state); - this.enterRule(localctx, 56, esql_parser.RULE_identifierPattern); + this.enterRule(localctx, 60, esql_parser.RULE_identifierPattern); try { this.enterOuterAlt(localctx, 1); { - this.state = 377; + this.state = 390; this.match(esql_parser.ID_PATTERN); } } @@ -2033,17 +2111,17 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public constant(): ConstantContext { let localctx: ConstantContext = new ConstantContext(this, this._ctx, this.state); - this.enterRule(localctx, 58, esql_parser.RULE_constant); + this.enterRule(localctx, 62, esql_parser.RULE_constant); let _la: number; try { - this.state = 421; + this.state = 434; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 38, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 39, this._ctx) ) { case 1: localctx = new NullLiteralContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 379; + this.state = 392; this.match(esql_parser.NULL); } break; @@ -2051,9 +2129,9 @@ export default class esql_parser extends Parser { localctx = new QualifiedIntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 380; + this.state = 393; this.integerValue(); - this.state = 381; + this.state = 394; this.match(esql_parser.UNQUOTED_IDENTIFIER); } break; @@ -2061,7 +2139,7 @@ export default class esql_parser extends Parser { localctx = new DecimalLiteralContext(this, localctx); this.enterOuterAlt(localctx, 3); { - this.state = 383; + this.state = 396; this.decimalValue(); } break; @@ -2069,7 +2147,7 @@ export default class esql_parser extends Parser { localctx = new IntegerLiteralContext(this, localctx); this.enterOuterAlt(localctx, 4); { - this.state = 384; + this.state = 397; this.integerValue(); } break; @@ -2077,7 +2155,7 @@ export default class esql_parser extends Parser { localctx = new BooleanLiteralContext(this, localctx); this.enterOuterAlt(localctx, 5); { - this.state = 385; + this.state = 398; this.booleanValue(); } break; @@ -2085,7 +2163,7 @@ export default class esql_parser extends Parser { localctx = new InputParamsContext(this, localctx); this.enterOuterAlt(localctx, 6); { - this.state = 386; + this.state = 399; this.params(); } break; @@ -2093,7 +2171,7 @@ export default class esql_parser extends Parser { localctx = new StringLiteralContext(this, localctx); this.enterOuterAlt(localctx, 7); { - this.state = 387; + this.state = 400; this.string_(); } break; @@ -2101,27 +2179,27 @@ export default class esql_parser extends Parser { localctx = new NumericArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 8); { - this.state = 388; + this.state = 401; this.match(esql_parser.OPENING_BRACKET); - this.state = 389; + this.state = 402; this.numericValue(); - this.state = 394; + this.state = 407; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===38) { { { - this.state = 390; + this.state = 403; this.match(esql_parser.COMMA); - this.state = 391; + this.state = 404; this.numericValue(); } } - this.state = 396; + this.state = 409; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 397; + this.state = 410; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2129,27 +2207,27 @@ export default class esql_parser extends Parser { localctx = new BooleanArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 9); { - this.state = 399; + this.state = 412; this.match(esql_parser.OPENING_BRACKET); - this.state = 400; + this.state = 413; this.booleanValue(); - this.state = 405; + this.state = 418; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===38) { { { - this.state = 401; + this.state = 414; this.match(esql_parser.COMMA); - this.state = 402; + this.state = 415; this.booleanValue(); } } - this.state = 407; + this.state = 420; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 408; + this.state = 421; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2157,27 +2235,27 @@ export default class esql_parser extends Parser { localctx = new StringArrayLiteralContext(this, localctx); this.enterOuterAlt(localctx, 10); { - this.state = 410; + this.state = 423; this.match(esql_parser.OPENING_BRACKET); - this.state = 411; + this.state = 424; this.string_(); - this.state = 416; + this.state = 429; this._errHandler.sync(this); _la = this._input.LA(1); while (_la===38) { { { - this.state = 412; + this.state = 425; this.match(esql_parser.COMMA); - this.state = 413; + this.state = 426; this.string_(); } } - this.state = 418; + this.state = 431; this._errHandler.sync(this); _la = this._input.LA(1); } - this.state = 419; + this.state = 432; this.match(esql_parser.CLOSING_BRACKET); } break; @@ -2200,16 +2278,16 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public params(): ParamsContext { let localctx: ParamsContext = new ParamsContext(this, this._ctx, this.state); - this.enterRule(localctx, 60, esql_parser.RULE_params); + this.enterRule(localctx, 64, esql_parser.RULE_params); try { - this.state = 425; + this.state = 438; this._errHandler.sync(this); switch (this._input.LA(1)) { case 52: localctx = new InputParamContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 423; + this.state = 436; this.match(esql_parser.PARAM); } break; @@ -2217,7 +2295,7 @@ export default class esql_parser extends Parser { localctx = new InputNamedOrPositionalParamContext(this, localctx); this.enterOuterAlt(localctx, 2); { - this.state = 424; + this.state = 437; this.match(esql_parser.NAMED_OR_POSITIONAL_PARAM); } break; @@ -2242,13 +2320,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public limitCommand(): LimitCommandContext { let localctx: LimitCommandContext = new LimitCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 62, esql_parser.RULE_limitCommand); + this.enterRule(localctx, 66, esql_parser.RULE_limitCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 427; + this.state = 440; this.match(esql_parser.LIMIT); - this.state = 428; + this.state = 441; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2269,32 +2347,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public sortCommand(): SortCommandContext { let localctx: SortCommandContext = new SortCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 64, esql_parser.RULE_sortCommand); + this.enterRule(localctx, 68, esql_parser.RULE_sortCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 430; + this.state = 443; this.match(esql_parser.SORT); - this.state = 431; + this.state = 444; this.orderExpression(); - this.state = 436; + this.state = 449; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 40, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 432; + this.state = 445; this.match(esql_parser.COMMA); - this.state = 433; + this.state = 446; this.orderExpression(); } } } - this.state = 438; + this.state = 451; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 40, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 41, this._ctx); } } } @@ -2315,19 +2393,19 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public orderExpression(): OrderExpressionContext { let localctx: OrderExpressionContext = new OrderExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 66, esql_parser.RULE_orderExpression); + this.enterRule(localctx, 70, esql_parser.RULE_orderExpression); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 439; + this.state = 452; this.booleanExpression(0); - this.state = 441; + this.state = 454; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 41, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 42, this._ctx) ) { case 1: { - this.state = 440; + this.state = 453; localctx._ordering = this._input.LT(1); _la = this._input.LA(1); if(!(_la===35 || _la===39)) { @@ -2340,14 +2418,14 @@ export default class esql_parser extends Parser { } break; } - this.state = 445; + this.state = 458; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 42, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 43, this._ctx) ) { case 1: { - this.state = 443; + this.state = 456; this.match(esql_parser.NULLS); - this.state = 444; + this.state = 457; localctx._nullOrdering = this._input.LT(1); _la = this._input.LA(1); if(!(_la===42 || _la===43)) { @@ -2379,13 +2457,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public keepCommand(): KeepCommandContext { let localctx: KeepCommandContext = new KeepCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 68, esql_parser.RULE_keepCommand); + this.enterRule(localctx, 72, esql_parser.RULE_keepCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 447; + this.state = 460; this.match(esql_parser.KEEP); - this.state = 448; + this.state = 461; this.qualifiedNamePatterns(); } } @@ -2406,13 +2484,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dropCommand(): DropCommandContext { let localctx: DropCommandContext = new DropCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 70, esql_parser.RULE_dropCommand); + this.enterRule(localctx, 74, esql_parser.RULE_dropCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 450; + this.state = 463; this.match(esql_parser.DROP); - this.state = 451; + this.state = 464; this.qualifiedNamePatterns(); } } @@ -2433,32 +2511,32 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameCommand(): RenameCommandContext { let localctx: RenameCommandContext = new RenameCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 72, esql_parser.RULE_renameCommand); + this.enterRule(localctx, 76, esql_parser.RULE_renameCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 453; + this.state = 466; this.match(esql_parser.RENAME); - this.state = 454; + this.state = 467; this.renameClause(); - this.state = 459; + this.state = 472; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 43, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 455; + this.state = 468; this.match(esql_parser.COMMA); - this.state = 456; + this.state = 469; this.renameClause(); } } } - this.state = 461; + this.state = 474; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 43, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 44, this._ctx); } } } @@ -2479,15 +2557,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public renameClause(): RenameClauseContext { let localctx: RenameClauseContext = new RenameClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 74, esql_parser.RULE_renameClause); + this.enterRule(localctx, 78, esql_parser.RULE_renameClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 462; + this.state = 475; localctx._oldName = this.qualifiedNamePattern(); - this.state = 463; + this.state = 476; this.match(esql_parser.AS); - this.state = 464; + this.state = 477; localctx._newName = this.qualifiedNamePattern(); } } @@ -2508,22 +2586,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public dissectCommand(): DissectCommandContext { let localctx: DissectCommandContext = new DissectCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 76, esql_parser.RULE_dissectCommand); + this.enterRule(localctx, 80, esql_parser.RULE_dissectCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 466; + this.state = 479; this.match(esql_parser.DISSECT); - this.state = 467; + this.state = 480; this.primaryExpression(0); - this.state = 468; + this.state = 481; this.string_(); - this.state = 470; + this.state = 483; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 44, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 45, this._ctx) ) { case 1: { - this.state = 469; + this.state = 482; this.commandOptions(); } break; @@ -2547,15 +2625,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public grokCommand(): GrokCommandContext { let localctx: GrokCommandContext = new GrokCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 78, esql_parser.RULE_grokCommand); + this.enterRule(localctx, 82, esql_parser.RULE_grokCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 472; + this.state = 485; this.match(esql_parser.GROK); - this.state = 473; + this.state = 486; this.primaryExpression(0); - this.state = 474; + this.state = 487; this.string_(); } } @@ -2576,13 +2654,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public mvExpandCommand(): MvExpandCommandContext { let localctx: MvExpandCommandContext = new MvExpandCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 80, esql_parser.RULE_mvExpandCommand); + this.enterRule(localctx, 84, esql_parser.RULE_mvExpandCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 476; + this.state = 489; this.match(esql_parser.MV_EXPAND); - this.state = 477; + this.state = 490; this.qualifiedName(); } } @@ -2603,30 +2681,30 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOptions(): CommandOptionsContext { let localctx: CommandOptionsContext = new CommandOptionsContext(this, this._ctx, this.state); - this.enterRule(localctx, 82, esql_parser.RULE_commandOptions); + this.enterRule(localctx, 86, esql_parser.RULE_commandOptions); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 479; + this.state = 492; this.commandOption(); - this.state = 484; + this.state = 497; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 480; + this.state = 493; this.match(esql_parser.COMMA); - this.state = 481; + this.state = 494; this.commandOption(); } } } - this.state = 486; + this.state = 499; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 45, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); } } } @@ -2647,15 +2725,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public commandOption(): CommandOptionContext { let localctx: CommandOptionContext = new CommandOptionContext(this, this._ctx, this.state); - this.enterRule(localctx, 84, esql_parser.RULE_commandOption); + this.enterRule(localctx, 88, esql_parser.RULE_commandOption); try { this.enterOuterAlt(localctx, 1); { - this.state = 487; + this.state = 500; this.identifier(); - this.state = 488; + this.state = 501; this.match(esql_parser.ASSIGN); - this.state = 489; + this.state = 502; this.constant(); } } @@ -2676,12 +2754,12 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public booleanValue(): BooleanValueContext { let localctx: BooleanValueContext = new BooleanValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 86, esql_parser.RULE_booleanValue); + this.enterRule(localctx, 90, esql_parser.RULE_booleanValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 491; + this.state = 504; _la = this._input.LA(1); if(!(_la===41 || _la===55)) { this._errHandler.recoverInline(this); @@ -2709,22 +2787,22 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public numericValue(): NumericValueContext { let localctx: NumericValueContext = new NumericValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 88, esql_parser.RULE_numericValue); + this.enterRule(localctx, 92, esql_parser.RULE_numericValue); try { - this.state = 495; + this.state = 508; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 46, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 47, this._ctx) ) { case 1: this.enterOuterAlt(localctx, 1); { - this.state = 493; + this.state = 506; this.decimalValue(); } break; case 2: this.enterOuterAlt(localctx, 2); { - this.state = 494; + this.state = 507; this.integerValue(); } break; @@ -2747,17 +2825,17 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public decimalValue(): DecimalValueContext { let localctx: DecimalValueContext = new DecimalValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 90, esql_parser.RULE_decimalValue); + this.enterRule(localctx, 94, esql_parser.RULE_decimalValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 498; + this.state = 511; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===63 || _la===64) { { - this.state = 497; + this.state = 510; _la = this._input.LA(1); if(!(_la===63 || _la===64)) { this._errHandler.recoverInline(this); @@ -2769,7 +2847,7 @@ export default class esql_parser extends Parser { } } - this.state = 500; + this.state = 513; this.match(esql_parser.DECIMAL_LITERAL); } } @@ -2790,17 +2868,17 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public integerValue(): IntegerValueContext { let localctx: IntegerValueContext = new IntegerValueContext(this, this._ctx, this.state); - this.enterRule(localctx, 92, esql_parser.RULE_integerValue); + this.enterRule(localctx, 96, esql_parser.RULE_integerValue); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 503; + this.state = 516; this._errHandler.sync(this); _la = this._input.LA(1); if (_la===63 || _la===64) { { - this.state = 502; + this.state = 515; _la = this._input.LA(1); if(!(_la===63 || _la===64)) { this._errHandler.recoverInline(this); @@ -2812,7 +2890,7 @@ export default class esql_parser extends Parser { } } - this.state = 505; + this.state = 518; this.match(esql_parser.INTEGER_LITERAL); } } @@ -2833,11 +2911,11 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public string_(): StringContext { let localctx: StringContext = new StringContext(this, this._ctx, this.state); - this.enterRule(localctx, 94, esql_parser.RULE_string); + this.enterRule(localctx, 98, esql_parser.RULE_string); try { this.enterOuterAlt(localctx, 1); { - this.state = 507; + this.state = 520; this.match(esql_parser.QUOTED_STRING); } } @@ -2858,12 +2936,12 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public comparisonOperator(): ComparisonOperatorContext { let localctx: ComparisonOperatorContext = new ComparisonOperatorContext(this, this._ctx, this.state); - this.enterRule(localctx, 96, esql_parser.RULE_comparisonOperator); + this.enterRule(localctx, 100, esql_parser.RULE_comparisonOperator); let _la: number; try { this.enterOuterAlt(localctx, 1); { - this.state = 509; + this.state = 522; _la = this._input.LA(1); if(!(((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 125) !== 0))) { this._errHandler.recoverInline(this); @@ -2891,13 +2969,13 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public explainCommand(): ExplainCommandContext { let localctx: ExplainCommandContext = new ExplainCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 98, esql_parser.RULE_explainCommand); + this.enterRule(localctx, 102, esql_parser.RULE_explainCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 511; + this.state = 524; this.match(esql_parser.EXPLAIN); - this.state = 512; + this.state = 525; this.subqueryExpression(); } } @@ -2918,15 +2996,15 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public subqueryExpression(): SubqueryExpressionContext { let localctx: SubqueryExpressionContext = new SubqueryExpressionContext(this, this._ctx, this.state); - this.enterRule(localctx, 100, esql_parser.RULE_subqueryExpression); + this.enterRule(localctx, 104, esql_parser.RULE_subqueryExpression); try { this.enterOuterAlt(localctx, 1); { - this.state = 514; + this.state = 527; this.match(esql_parser.OPENING_BRACKET); - this.state = 515; + this.state = 528; this.query(0); - this.state = 516; + this.state = 529; this.match(esql_parser.CLOSING_BRACKET); } } @@ -2947,14 +3025,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public showCommand(): ShowCommandContext { let localctx: ShowCommandContext = new ShowCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 102, esql_parser.RULE_showCommand); + this.enterRule(localctx, 106, esql_parser.RULE_showCommand); try { localctx = new ShowInfoContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 518; + this.state = 531; this.match(esql_parser.SHOW); - this.state = 519; + this.state = 532; this.match(esql_parser.INFO); } } @@ -2975,14 +3053,14 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public metaCommand(): MetaCommandContext { let localctx: MetaCommandContext = new MetaCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 104, esql_parser.RULE_metaCommand); + this.enterRule(localctx, 108, esql_parser.RULE_metaCommand); try { localctx = new MetaFunctionsContext(this, localctx); this.enterOuterAlt(localctx, 1); { - this.state = 521; + this.state = 534; this.match(esql_parser.META); - this.state = 522; + this.state = 535; this.match(esql_parser.FUNCTIONS); } } @@ -3003,53 +3081,53 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public enrichCommand(): EnrichCommandContext { let localctx: EnrichCommandContext = new EnrichCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 106, esql_parser.RULE_enrichCommand); + this.enterRule(localctx, 110, esql_parser.RULE_enrichCommand); try { let _alt: number; this.enterOuterAlt(localctx, 1); { - this.state = 524; + this.state = 537; this.match(esql_parser.ENRICH); - this.state = 525; + this.state = 538; localctx._policyName = this.match(esql_parser.ENRICH_POLICY_NAME); - this.state = 528; + this.state = 541; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 49, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 50, this._ctx) ) { case 1: { - this.state = 526; + this.state = 539; this.match(esql_parser.ON); - this.state = 527; + this.state = 540; localctx._matchField = this.qualifiedNamePattern(); } break; } - this.state = 539; + this.state = 552; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 51, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 52, this._ctx) ) { case 1: { - this.state = 530; + this.state = 543; this.match(esql_parser.WITH); - this.state = 531; + this.state = 544; this.enrichWithClause(); - this.state = 536; + this.state = 549; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 51, this._ctx); while (_alt !== 2 && _alt !== ATN.INVALID_ALT_NUMBER) { if (_alt === 1) { { { - this.state = 532; + this.state = 545; this.match(esql_parser.COMMA); - this.state = 533; + this.state = 546; this.enrichWithClause(); } } } - this.state = 538; + this.state = 551; this._errHandler.sync(this); - _alt = this._interp.adaptivePredict(this._input, 50, this._ctx); + _alt = this._interp.adaptivePredict(this._input, 51, this._ctx); } } break; @@ -3073,23 +3151,23 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public enrichWithClause(): EnrichWithClauseContext { let localctx: EnrichWithClauseContext = new EnrichWithClauseContext(this, this._ctx, this.state); - this.enterRule(localctx, 108, esql_parser.RULE_enrichWithClause); + this.enterRule(localctx, 112, esql_parser.RULE_enrichWithClause); try { this.enterOuterAlt(localctx, 1); { - this.state = 544; + this.state = 557; this._errHandler.sync(this); - switch ( this._interp.adaptivePredict(this._input, 52, this._ctx) ) { + switch ( this._interp.adaptivePredict(this._input, 53, this._ctx) ) { case 1: { - this.state = 541; + this.state = 554; localctx._newName = this.qualifiedNamePattern(); - this.state = 542; + this.state = 555; this.match(esql_parser.ASSIGN); } break; } - this.state = 546; + this.state = 559; localctx._enrichField = this.qualifiedNamePattern(); } } @@ -3110,17 +3188,17 @@ export default class esql_parser extends Parser { // @RuleVersion(0) public lookupCommand(): LookupCommandContext { let localctx: LookupCommandContext = new LookupCommandContext(this, this._ctx, this.state); - this.enterRule(localctx, 110, esql_parser.RULE_lookupCommand); + this.enterRule(localctx, 114, esql_parser.RULE_lookupCommand); try { this.enterOuterAlt(localctx, 1); { - this.state = 548; + this.state = 561; this.match(esql_parser.LOOKUP); - this.state = 549; - localctx._tableName = this.match(esql_parser.INDEX_UNQUOTED_IDENTIFIER); - this.state = 550; + this.state = 562; + localctx._tableName = this.indexPattern(); + this.state = 563; this.match(esql_parser.ON); - this.state = 551; + this.state = 564; localctx._matchFields = this.qualifiedNamePatterns(); } } @@ -3185,7 +3263,7 @@ export default class esql_parser extends Parser { return true; } - public static readonly _serializedATN: number[] = [4,1,124,554,2,0,7,0, + public static readonly _serializedATN: number[] = [4,1,124,567,2,0,7,0, 2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9, 2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2, 17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24, @@ -3193,179 +3271,183 @@ export default class esql_parser extends Parser { 31,2,32,7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,52,2,53, - 7,53,2,54,7,54,2,55,7,55,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,5,1,122,8, - 1,10,1,12,1,125,9,1,1,2,1,2,1,2,1,2,1,2,1,2,3,2,133,8,2,1,3,1,3,1,3,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,149,8,3,1,4,1,4,1,4,1,5,1,5, - 1,5,1,5,1,5,1,5,1,5,3,5,161,8,5,1,5,1,5,1,5,1,5,1,5,5,5,168,8,5,10,5,12, - 5,171,9,5,1,5,1,5,1,5,1,5,1,5,3,5,178,8,5,1,5,1,5,3,5,182,8,5,1,5,1,5,1, - 5,1,5,1,5,1,5,5,5,190,8,5,10,5,12,5,193,9,5,1,6,1,6,3,6,197,8,6,1,6,1,6, - 1,6,1,6,1,6,3,6,204,8,6,1,6,1,6,1,6,3,6,209,8,6,1,7,1,7,1,7,1,7,1,7,3,7, - 216,8,7,1,8,1,8,1,8,1,8,3,8,222,8,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,230,8,8, - 10,8,12,8,233,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3,9,243,8,9,1,9,1,9,1, - 9,5,9,248,8,9,10,9,12,9,251,9,9,1,10,1,10,1,10,1,10,1,10,1,10,5,10,259, - 8,10,10,10,12,10,262,9,10,3,10,264,8,10,1,10,1,10,1,11,1,11,1,12,1,12,1, - 12,1,13,1,13,1,13,5,13,276,8,13,10,13,12,13,279,9,13,1,14,1,14,1,14,1,14, - 1,14,3,14,286,8,14,1,15,1,15,1,15,1,15,5,15,292,8,15,10,15,12,15,295,9, - 15,1,15,3,15,298,8,15,1,16,1,16,1,17,1,17,3,17,304,8,17,1,18,1,18,1,18, - 1,18,5,18,310,8,18,10,18,12,18,313,9,18,1,19,1,19,1,19,1,19,1,20,1,20,1, - 20,1,20,5,20,323,8,20,10,20,12,20,326,9,20,1,20,3,20,329,8,20,1,20,1,20, - 3,20,333,8,20,1,21,1,21,1,21,1,22,1,22,3,22,340,8,22,1,22,1,22,3,22,344, - 8,22,1,23,1,23,1,23,1,23,3,23,350,8,23,1,24,1,24,1,24,5,24,355,8,24,10, - 24,12,24,358,9,24,1,25,1,25,1,25,5,25,363,8,25,10,25,12,25,366,9,25,1,26, - 1,26,1,26,5,26,371,8,26,10,26,12,26,374,9,26,1,27,1,27,1,28,1,28,1,29,1, - 29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,393,8,29, - 10,29,12,29,396,9,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,404,8,29,10,29, - 12,29,407,9,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,415,8,29,10,29,12,29, - 418,9,29,1,29,1,29,3,29,422,8,29,1,30,1,30,3,30,426,8,30,1,31,1,31,1,31, - 1,32,1,32,1,32,1,32,5,32,435,8,32,10,32,12,32,438,9,32,1,33,1,33,3,33,442, - 8,33,1,33,1,33,3,33,446,8,33,1,34,1,34,1,34,1,35,1,35,1,35,1,36,1,36,1, - 36,1,36,5,36,458,8,36,10,36,12,36,461,9,36,1,37,1,37,1,37,1,37,1,38,1,38, - 1,38,1,38,3,38,471,8,38,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41,1, - 41,5,41,483,8,41,10,41,12,41,486,9,41,1,42,1,42,1,42,1,42,1,43,1,43,1,44, - 1,44,3,44,496,8,44,1,45,3,45,499,8,45,1,45,1,45,1,46,3,46,504,8,46,1,46, - 1,46,1,47,1,47,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,51,1,51,1, - 51,1,52,1,52,1,52,1,53,1,53,1,53,1,53,3,53,529,8,53,1,53,1,53,1,53,1,53, - 5,53,535,8,53,10,53,12,53,538,9,53,3,53,540,8,53,1,54,1,54,1,54,3,54,545, - 8,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,0,4,2,10,16,18,56,0,2,4,6, - 8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54, - 56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102, - 104,106,108,110,0,7,1,0,63,64,1,0,65,67,1,0,71,72,2,0,35,35,39,39,1,0,42, - 43,2,0,41,41,55,55,2,0,56,56,58,62,580,0,112,1,0,0,0,2,115,1,0,0,0,4,132, - 1,0,0,0,6,148,1,0,0,0,8,150,1,0,0,0,10,181,1,0,0,0,12,208,1,0,0,0,14,215, - 1,0,0,0,16,221,1,0,0,0,18,242,1,0,0,0,20,252,1,0,0,0,22,267,1,0,0,0,24, - 269,1,0,0,0,26,272,1,0,0,0,28,285,1,0,0,0,30,287,1,0,0,0,32,299,1,0,0,0, - 34,303,1,0,0,0,36,305,1,0,0,0,38,314,1,0,0,0,40,318,1,0,0,0,42,334,1,0, - 0,0,44,337,1,0,0,0,46,345,1,0,0,0,48,351,1,0,0,0,50,359,1,0,0,0,52,367, - 1,0,0,0,54,375,1,0,0,0,56,377,1,0,0,0,58,421,1,0,0,0,60,425,1,0,0,0,62, - 427,1,0,0,0,64,430,1,0,0,0,66,439,1,0,0,0,68,447,1,0,0,0,70,450,1,0,0,0, - 72,453,1,0,0,0,74,462,1,0,0,0,76,466,1,0,0,0,78,472,1,0,0,0,80,476,1,0, - 0,0,82,479,1,0,0,0,84,487,1,0,0,0,86,491,1,0,0,0,88,495,1,0,0,0,90,498, - 1,0,0,0,92,503,1,0,0,0,94,507,1,0,0,0,96,509,1,0,0,0,98,511,1,0,0,0,100, - 514,1,0,0,0,102,518,1,0,0,0,104,521,1,0,0,0,106,524,1,0,0,0,108,544,1,0, - 0,0,110,548,1,0,0,0,112,113,3,2,1,0,113,114,5,0,0,1,114,1,1,0,0,0,115,116, - 6,1,-1,0,116,117,3,4,2,0,117,123,1,0,0,0,118,119,10,1,0,0,119,120,5,29, - 0,0,120,122,3,6,3,0,121,118,1,0,0,0,122,125,1,0,0,0,123,121,1,0,0,0,123, - 124,1,0,0,0,124,3,1,0,0,0,125,123,1,0,0,0,126,133,3,98,49,0,127,133,3,30, - 15,0,128,133,3,24,12,0,129,133,3,40,20,0,130,133,3,102,51,0,131,133,3,104, - 52,0,132,126,1,0,0,0,132,127,1,0,0,0,132,128,1,0,0,0,132,129,1,0,0,0,132, - 130,1,0,0,0,132,131,1,0,0,0,133,5,1,0,0,0,134,149,3,42,21,0,135,149,3,46, - 23,0,136,149,3,62,31,0,137,149,3,110,55,0,138,149,3,68,34,0,139,149,3,64, - 32,0,140,149,3,44,22,0,141,149,3,8,4,0,142,149,3,70,35,0,143,149,3,72,36, - 0,144,149,3,76,38,0,145,149,3,78,39,0,146,149,3,106,53,0,147,149,3,80,40, - 0,148,134,1,0,0,0,148,135,1,0,0,0,148,136,1,0,0,0,148,137,1,0,0,0,148,138, - 1,0,0,0,148,139,1,0,0,0,148,140,1,0,0,0,148,141,1,0,0,0,148,142,1,0,0,0, - 148,143,1,0,0,0,148,144,1,0,0,0,148,145,1,0,0,0,148,146,1,0,0,0,148,147, - 1,0,0,0,149,7,1,0,0,0,150,151,5,20,0,0,151,152,3,10,5,0,152,9,1,0,0,0,153, - 154,6,5,-1,0,154,155,5,48,0,0,155,182,3,10,5,7,156,182,3,14,7,0,157,182, - 3,12,6,0,158,160,3,14,7,0,159,161,5,48,0,0,160,159,1,0,0,0,160,161,1,0, - 0,0,161,162,1,0,0,0,162,163,5,45,0,0,163,164,5,44,0,0,164,169,3,14,7,0, - 165,166,5,38,0,0,166,168,3,14,7,0,167,165,1,0,0,0,168,171,1,0,0,0,169,167, - 1,0,0,0,169,170,1,0,0,0,170,172,1,0,0,0,171,169,1,0,0,0,172,173,5,54,0, - 0,173,182,1,0,0,0,174,175,3,14,7,0,175,177,5,46,0,0,176,178,5,48,0,0,177, - 176,1,0,0,0,177,178,1,0,0,0,178,179,1,0,0,0,179,180,5,49,0,0,180,182,1, - 0,0,0,181,153,1,0,0,0,181,156,1,0,0,0,181,157,1,0,0,0,181,158,1,0,0,0,181, - 174,1,0,0,0,182,191,1,0,0,0,183,184,10,4,0,0,184,185,5,34,0,0,185,190,3, - 10,5,5,186,187,10,3,0,0,187,188,5,51,0,0,188,190,3,10,5,4,189,183,1,0,0, - 0,189,186,1,0,0,0,190,193,1,0,0,0,191,189,1,0,0,0,191,192,1,0,0,0,192,11, - 1,0,0,0,193,191,1,0,0,0,194,196,3,14,7,0,195,197,5,48,0,0,196,195,1,0,0, - 0,196,197,1,0,0,0,197,198,1,0,0,0,198,199,5,47,0,0,199,200,3,94,47,0,200, - 209,1,0,0,0,201,203,3,14,7,0,202,204,5,48,0,0,203,202,1,0,0,0,203,204,1, - 0,0,0,204,205,1,0,0,0,205,206,5,53,0,0,206,207,3,94,47,0,207,209,1,0,0, - 0,208,194,1,0,0,0,208,201,1,0,0,0,209,13,1,0,0,0,210,216,3,16,8,0,211,212, - 3,16,8,0,212,213,3,96,48,0,213,214,3,16,8,0,214,216,1,0,0,0,215,210,1,0, - 0,0,215,211,1,0,0,0,216,15,1,0,0,0,217,218,6,8,-1,0,218,222,3,18,9,0,219, - 220,7,0,0,0,220,222,3,16,8,3,221,217,1,0,0,0,221,219,1,0,0,0,222,231,1, - 0,0,0,223,224,10,2,0,0,224,225,7,1,0,0,225,230,3,16,8,3,226,227,10,1,0, - 0,227,228,7,0,0,0,228,230,3,16,8,2,229,223,1,0,0,0,229,226,1,0,0,0,230, - 233,1,0,0,0,231,229,1,0,0,0,231,232,1,0,0,0,232,17,1,0,0,0,233,231,1,0, - 0,0,234,235,6,9,-1,0,235,243,3,58,29,0,236,243,3,48,24,0,237,243,3,20,10, - 0,238,239,5,44,0,0,239,240,3,10,5,0,240,241,5,54,0,0,241,243,1,0,0,0,242, - 234,1,0,0,0,242,236,1,0,0,0,242,237,1,0,0,0,242,238,1,0,0,0,243,249,1,0, - 0,0,244,245,10,1,0,0,245,246,5,37,0,0,246,248,3,22,11,0,247,244,1,0,0,0, - 248,251,1,0,0,0,249,247,1,0,0,0,249,250,1,0,0,0,250,19,1,0,0,0,251,249, - 1,0,0,0,252,253,3,54,27,0,253,263,5,44,0,0,254,264,5,65,0,0,255,260,3,10, - 5,0,256,257,5,38,0,0,257,259,3,10,5,0,258,256,1,0,0,0,259,262,1,0,0,0,260, - 258,1,0,0,0,260,261,1,0,0,0,261,264,1,0,0,0,262,260,1,0,0,0,263,254,1,0, - 0,0,263,255,1,0,0,0,263,264,1,0,0,0,264,265,1,0,0,0,265,266,5,54,0,0,266, - 21,1,0,0,0,267,268,3,54,27,0,268,23,1,0,0,0,269,270,5,16,0,0,270,271,3, - 26,13,0,271,25,1,0,0,0,272,277,3,28,14,0,273,274,5,38,0,0,274,276,3,28, - 14,0,275,273,1,0,0,0,276,279,1,0,0,0,277,275,1,0,0,0,277,278,1,0,0,0,278, - 27,1,0,0,0,279,277,1,0,0,0,280,286,3,10,5,0,281,282,3,48,24,0,282,283,5, - 36,0,0,283,284,3,10,5,0,284,286,1,0,0,0,285,280,1,0,0,0,285,281,1,0,0,0, - 286,29,1,0,0,0,287,288,5,6,0,0,288,293,3,32,16,0,289,290,5,38,0,0,290,292, - 3,32,16,0,291,289,1,0,0,0,292,295,1,0,0,0,293,291,1,0,0,0,293,294,1,0,0, - 0,294,297,1,0,0,0,295,293,1,0,0,0,296,298,3,34,17,0,297,296,1,0,0,0,297, - 298,1,0,0,0,298,31,1,0,0,0,299,300,5,25,0,0,300,33,1,0,0,0,301,304,3,36, - 18,0,302,304,3,38,19,0,303,301,1,0,0,0,303,302,1,0,0,0,304,35,1,0,0,0,305, - 306,5,76,0,0,306,311,3,32,16,0,307,308,5,38,0,0,308,310,3,32,16,0,309,307, - 1,0,0,0,310,313,1,0,0,0,311,309,1,0,0,0,311,312,1,0,0,0,312,37,1,0,0,0, - 313,311,1,0,0,0,314,315,5,69,0,0,315,316,3,36,18,0,316,317,5,70,0,0,317, - 39,1,0,0,0,318,319,5,13,0,0,319,324,3,32,16,0,320,321,5,38,0,0,321,323, - 3,32,16,0,322,320,1,0,0,0,323,326,1,0,0,0,324,322,1,0,0,0,324,325,1,0,0, - 0,325,328,1,0,0,0,326,324,1,0,0,0,327,329,3,26,13,0,328,327,1,0,0,0,328, - 329,1,0,0,0,329,332,1,0,0,0,330,331,5,33,0,0,331,333,3,26,13,0,332,330, - 1,0,0,0,332,333,1,0,0,0,333,41,1,0,0,0,334,335,5,4,0,0,335,336,3,26,13, - 0,336,43,1,0,0,0,337,339,5,19,0,0,338,340,3,26,13,0,339,338,1,0,0,0,339, - 340,1,0,0,0,340,343,1,0,0,0,341,342,5,33,0,0,342,344,3,26,13,0,343,341, - 1,0,0,0,343,344,1,0,0,0,344,45,1,0,0,0,345,346,5,8,0,0,346,349,3,26,13, - 0,347,348,5,33,0,0,348,350,3,26,13,0,349,347,1,0,0,0,349,350,1,0,0,0,350, - 47,1,0,0,0,351,356,3,54,27,0,352,353,5,40,0,0,353,355,3,54,27,0,354,352, - 1,0,0,0,355,358,1,0,0,0,356,354,1,0,0,0,356,357,1,0,0,0,357,49,1,0,0,0, - 358,356,1,0,0,0,359,364,3,56,28,0,360,361,5,40,0,0,361,363,3,56,28,0,362, - 360,1,0,0,0,363,366,1,0,0,0,364,362,1,0,0,0,364,365,1,0,0,0,365,51,1,0, - 0,0,366,364,1,0,0,0,367,372,3,50,25,0,368,369,5,38,0,0,369,371,3,50,25, - 0,370,368,1,0,0,0,371,374,1,0,0,0,372,370,1,0,0,0,372,373,1,0,0,0,373,53, - 1,0,0,0,374,372,1,0,0,0,375,376,7,2,0,0,376,55,1,0,0,0,377,378,5,80,0,0, - 378,57,1,0,0,0,379,422,5,49,0,0,380,381,3,92,46,0,381,382,5,71,0,0,382, - 422,1,0,0,0,383,422,3,90,45,0,384,422,3,92,46,0,385,422,3,86,43,0,386,422, - 3,60,30,0,387,422,3,94,47,0,388,389,5,69,0,0,389,394,3,88,44,0,390,391, - 5,38,0,0,391,393,3,88,44,0,392,390,1,0,0,0,393,396,1,0,0,0,394,392,1,0, - 0,0,394,395,1,0,0,0,395,397,1,0,0,0,396,394,1,0,0,0,397,398,5,70,0,0,398, - 422,1,0,0,0,399,400,5,69,0,0,400,405,3,86,43,0,401,402,5,38,0,0,402,404, - 3,86,43,0,403,401,1,0,0,0,404,407,1,0,0,0,405,403,1,0,0,0,405,406,1,0,0, - 0,406,408,1,0,0,0,407,405,1,0,0,0,408,409,5,70,0,0,409,422,1,0,0,0,410, - 411,5,69,0,0,411,416,3,94,47,0,412,413,5,38,0,0,413,415,3,94,47,0,414,412, - 1,0,0,0,415,418,1,0,0,0,416,414,1,0,0,0,416,417,1,0,0,0,417,419,1,0,0,0, - 418,416,1,0,0,0,419,420,5,70,0,0,420,422,1,0,0,0,421,379,1,0,0,0,421,380, - 1,0,0,0,421,383,1,0,0,0,421,384,1,0,0,0,421,385,1,0,0,0,421,386,1,0,0,0, - 421,387,1,0,0,0,421,388,1,0,0,0,421,399,1,0,0,0,421,410,1,0,0,0,422,59, - 1,0,0,0,423,426,5,52,0,0,424,426,5,68,0,0,425,423,1,0,0,0,425,424,1,0,0, - 0,426,61,1,0,0,0,427,428,5,10,0,0,428,429,5,31,0,0,429,63,1,0,0,0,430,431, - 5,18,0,0,431,436,3,66,33,0,432,433,5,38,0,0,433,435,3,66,33,0,434,432,1, - 0,0,0,435,438,1,0,0,0,436,434,1,0,0,0,436,437,1,0,0,0,437,65,1,0,0,0,438, - 436,1,0,0,0,439,441,3,10,5,0,440,442,7,3,0,0,441,440,1,0,0,0,441,442,1, - 0,0,0,442,445,1,0,0,0,443,444,5,50,0,0,444,446,7,4,0,0,445,443,1,0,0,0, - 445,446,1,0,0,0,446,67,1,0,0,0,447,448,5,9,0,0,448,449,3,52,26,0,449,69, - 1,0,0,0,450,451,5,2,0,0,451,452,3,52,26,0,452,71,1,0,0,0,453,454,5,15,0, - 0,454,459,3,74,37,0,455,456,5,38,0,0,456,458,3,74,37,0,457,455,1,0,0,0, - 458,461,1,0,0,0,459,457,1,0,0,0,459,460,1,0,0,0,460,73,1,0,0,0,461,459, - 1,0,0,0,462,463,3,50,25,0,463,464,5,84,0,0,464,465,3,50,25,0,465,75,1,0, - 0,0,466,467,5,1,0,0,467,468,3,18,9,0,468,470,3,94,47,0,469,471,3,82,41, - 0,470,469,1,0,0,0,470,471,1,0,0,0,471,77,1,0,0,0,472,473,5,7,0,0,473,474, - 3,18,9,0,474,475,3,94,47,0,475,79,1,0,0,0,476,477,5,14,0,0,477,478,3,48, - 24,0,478,81,1,0,0,0,479,484,3,84,42,0,480,481,5,38,0,0,481,483,3,84,42, - 0,482,480,1,0,0,0,483,486,1,0,0,0,484,482,1,0,0,0,484,485,1,0,0,0,485,83, - 1,0,0,0,486,484,1,0,0,0,487,488,3,54,27,0,488,489,5,36,0,0,489,490,3,58, - 29,0,490,85,1,0,0,0,491,492,7,5,0,0,492,87,1,0,0,0,493,496,3,90,45,0,494, - 496,3,92,46,0,495,493,1,0,0,0,495,494,1,0,0,0,496,89,1,0,0,0,497,499,7, - 0,0,0,498,497,1,0,0,0,498,499,1,0,0,0,499,500,1,0,0,0,500,501,5,32,0,0, - 501,91,1,0,0,0,502,504,7,0,0,0,503,502,1,0,0,0,503,504,1,0,0,0,504,505, - 1,0,0,0,505,506,5,31,0,0,506,93,1,0,0,0,507,508,5,30,0,0,508,95,1,0,0,0, - 509,510,7,6,0,0,510,97,1,0,0,0,511,512,5,5,0,0,512,513,3,100,50,0,513,99, - 1,0,0,0,514,515,5,69,0,0,515,516,3,2,1,0,516,517,5,70,0,0,517,101,1,0,0, - 0,518,519,5,17,0,0,519,520,5,106,0,0,520,103,1,0,0,0,521,522,5,12,0,0,522, - 523,5,110,0,0,523,105,1,0,0,0,524,525,5,3,0,0,525,528,5,90,0,0,526,527, - 5,88,0,0,527,529,3,50,25,0,528,526,1,0,0,0,528,529,1,0,0,0,529,539,1,0, - 0,0,530,531,5,89,0,0,531,536,3,108,54,0,532,533,5,38,0,0,533,535,3,108, - 54,0,534,532,1,0,0,0,535,538,1,0,0,0,536,534,1,0,0,0,536,537,1,0,0,0,537, - 540,1,0,0,0,538,536,1,0,0,0,539,530,1,0,0,0,539,540,1,0,0,0,540,107,1,0, - 0,0,541,542,3,50,25,0,542,543,5,36,0,0,543,545,1,0,0,0,544,541,1,0,0,0, - 544,545,1,0,0,0,545,546,1,0,0,0,546,547,3,50,25,0,547,109,1,0,0,0,548,549, - 5,11,0,0,549,550,5,25,0,0,550,551,5,88,0,0,551,552,3,52,26,0,552,111,1, - 0,0,0,53,123,132,148,160,169,177,181,189,191,196,203,208,215,221,229,231, - 242,249,260,263,277,285,293,297,303,311,324,328,332,339,343,349,356,364, - 372,394,405,416,421,425,436,441,445,459,470,484,495,498,503,528,536,539, - 544]; + 7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,1,0,1,0,1,0,1,1,1,1,1,1,1, + 1,1,1,1,1,5,1,126,8,1,10,1,12,1,129,9,1,1,2,1,2,1,2,1,2,1,2,1,2,3,2,137, + 8,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,153,8,3, + 1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,165,8,5,1,5,1,5,1,5,1,5,1,5, + 5,5,172,8,5,10,5,12,5,175,9,5,1,5,1,5,1,5,1,5,1,5,3,5,182,8,5,1,5,1,5,3, + 5,186,8,5,1,5,1,5,1,5,1,5,1,5,1,5,5,5,194,8,5,10,5,12,5,197,9,5,1,6,1,6, + 3,6,201,8,6,1,6,1,6,1,6,1,6,1,6,3,6,208,8,6,1,6,1,6,1,6,3,6,213,8,6,1,7, + 1,7,1,7,1,7,1,7,3,7,220,8,7,1,8,1,8,1,8,1,8,3,8,226,8,8,1,8,1,8,1,8,1,8, + 1,8,1,8,5,8,234,8,8,10,8,12,8,237,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,3, + 9,247,8,9,1,9,1,9,1,9,5,9,252,8,9,10,9,12,9,255,9,9,1,10,1,10,1,10,1,10, + 1,10,1,10,5,10,263,8,10,10,10,12,10,266,9,10,3,10,268,8,10,1,10,1,10,1, + 11,1,11,1,12,1,12,1,12,1,13,1,13,1,13,5,13,280,8,13,10,13,12,13,283,9,13, + 1,14,1,14,1,14,1,14,1,14,3,14,290,8,14,1,15,1,15,1,15,1,15,5,15,296,8,15, + 10,15,12,15,299,9,15,1,15,3,15,302,8,15,1,16,1,16,1,16,1,16,1,16,3,16,309, + 8,16,1,17,1,17,1,18,1,18,1,19,1,19,3,19,317,8,19,1,20,1,20,1,20,1,20,5, + 20,323,8,20,10,20,12,20,326,9,20,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22, + 5,22,336,8,22,10,22,12,22,339,9,22,1,22,3,22,342,8,22,1,22,1,22,3,22,346, + 8,22,1,23,1,23,1,23,1,24,1,24,3,24,353,8,24,1,24,1,24,3,24,357,8,24,1,25, + 1,25,1,25,1,25,3,25,363,8,25,1,26,1,26,1,26,5,26,368,8,26,10,26,12,26,371, + 9,26,1,27,1,27,1,27,5,27,376,8,27,10,27,12,27,379,9,27,1,28,1,28,1,28,5, + 28,384,8,28,10,28,12,28,387,9,28,1,29,1,29,1,30,1,30,1,31,1,31,1,31,1,31, + 1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,5,31,406,8,31,10,31,12,31, + 409,9,31,1,31,1,31,1,31,1,31,1,31,1,31,5,31,417,8,31,10,31,12,31,420,9, + 31,1,31,1,31,1,31,1,31,1,31,1,31,5,31,428,8,31,10,31,12,31,431,9,31,1,31, + 1,31,3,31,435,8,31,1,32,1,32,3,32,439,8,32,1,33,1,33,1,33,1,34,1,34,1,34, + 1,34,5,34,448,8,34,10,34,12,34,451,9,34,1,35,1,35,3,35,455,8,35,1,35,1, + 35,3,35,459,8,35,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1,38,1,38,5,38, + 471,8,38,10,38,12,38,474,9,38,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,3, + 40,484,8,40,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,5,43,496, + 8,43,10,43,12,43,499,9,43,1,44,1,44,1,44,1,44,1,45,1,45,1,46,1,46,3,46, + 509,8,46,1,47,3,47,512,8,47,1,47,1,47,1,48,3,48,517,8,48,1,48,1,48,1,49, + 1,49,1,50,1,50,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,54,1, + 54,1,54,1,55,1,55,1,55,1,55,3,55,542,8,55,1,55,1,55,1,55,1,55,5,55,548, + 8,55,10,55,12,55,551,9,55,3,55,553,8,55,1,56,1,56,1,56,3,56,558,8,56,1, + 56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,0,4,2,10,16,18,58,0,2,4,6,8,10,12, + 14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60, + 62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106, + 108,110,112,114,0,8,1,0,63,64,1,0,65,67,2,0,25,25,30,30,1,0,71,72,2,0,35, + 35,39,39,1,0,42,43,2,0,41,41,55,55,2,0,56,56,58,62,592,0,116,1,0,0,0,2, + 119,1,0,0,0,4,136,1,0,0,0,6,152,1,0,0,0,8,154,1,0,0,0,10,185,1,0,0,0,12, + 212,1,0,0,0,14,219,1,0,0,0,16,225,1,0,0,0,18,246,1,0,0,0,20,256,1,0,0,0, + 22,271,1,0,0,0,24,273,1,0,0,0,26,276,1,0,0,0,28,289,1,0,0,0,30,291,1,0, + 0,0,32,308,1,0,0,0,34,310,1,0,0,0,36,312,1,0,0,0,38,316,1,0,0,0,40,318, + 1,0,0,0,42,327,1,0,0,0,44,331,1,0,0,0,46,347,1,0,0,0,48,350,1,0,0,0,50, + 358,1,0,0,0,52,364,1,0,0,0,54,372,1,0,0,0,56,380,1,0,0,0,58,388,1,0,0,0, + 60,390,1,0,0,0,62,434,1,0,0,0,64,438,1,0,0,0,66,440,1,0,0,0,68,443,1,0, + 0,0,70,452,1,0,0,0,72,460,1,0,0,0,74,463,1,0,0,0,76,466,1,0,0,0,78,475, + 1,0,0,0,80,479,1,0,0,0,82,485,1,0,0,0,84,489,1,0,0,0,86,492,1,0,0,0,88, + 500,1,0,0,0,90,504,1,0,0,0,92,508,1,0,0,0,94,511,1,0,0,0,96,516,1,0,0,0, + 98,520,1,0,0,0,100,522,1,0,0,0,102,524,1,0,0,0,104,527,1,0,0,0,106,531, + 1,0,0,0,108,534,1,0,0,0,110,537,1,0,0,0,112,557,1,0,0,0,114,561,1,0,0,0, + 116,117,3,2,1,0,117,118,5,0,0,1,118,1,1,0,0,0,119,120,6,1,-1,0,120,121, + 3,4,2,0,121,127,1,0,0,0,122,123,10,1,0,0,123,124,5,29,0,0,124,126,3,6,3, + 0,125,122,1,0,0,0,126,129,1,0,0,0,127,125,1,0,0,0,127,128,1,0,0,0,128,3, + 1,0,0,0,129,127,1,0,0,0,130,137,3,102,51,0,131,137,3,30,15,0,132,137,3, + 24,12,0,133,137,3,44,22,0,134,137,3,106,53,0,135,137,3,108,54,0,136,130, + 1,0,0,0,136,131,1,0,0,0,136,132,1,0,0,0,136,133,1,0,0,0,136,134,1,0,0,0, + 136,135,1,0,0,0,137,5,1,0,0,0,138,153,3,46,23,0,139,153,3,50,25,0,140,153, + 3,66,33,0,141,153,3,114,57,0,142,153,3,72,36,0,143,153,3,68,34,0,144,153, + 3,48,24,0,145,153,3,8,4,0,146,153,3,74,37,0,147,153,3,76,38,0,148,153,3, + 80,40,0,149,153,3,82,41,0,150,153,3,110,55,0,151,153,3,84,42,0,152,138, + 1,0,0,0,152,139,1,0,0,0,152,140,1,0,0,0,152,141,1,0,0,0,152,142,1,0,0,0, + 152,143,1,0,0,0,152,144,1,0,0,0,152,145,1,0,0,0,152,146,1,0,0,0,152,147, + 1,0,0,0,152,148,1,0,0,0,152,149,1,0,0,0,152,150,1,0,0,0,152,151,1,0,0,0, + 153,7,1,0,0,0,154,155,5,20,0,0,155,156,3,10,5,0,156,9,1,0,0,0,157,158,6, + 5,-1,0,158,159,5,48,0,0,159,186,3,10,5,7,160,186,3,14,7,0,161,186,3,12, + 6,0,162,164,3,14,7,0,163,165,5,48,0,0,164,163,1,0,0,0,164,165,1,0,0,0,165, + 166,1,0,0,0,166,167,5,45,0,0,167,168,5,44,0,0,168,173,3,14,7,0,169,170, + 5,38,0,0,170,172,3,14,7,0,171,169,1,0,0,0,172,175,1,0,0,0,173,171,1,0,0, + 0,173,174,1,0,0,0,174,176,1,0,0,0,175,173,1,0,0,0,176,177,5,54,0,0,177, + 186,1,0,0,0,178,179,3,14,7,0,179,181,5,46,0,0,180,182,5,48,0,0,181,180, + 1,0,0,0,181,182,1,0,0,0,182,183,1,0,0,0,183,184,5,49,0,0,184,186,1,0,0, + 0,185,157,1,0,0,0,185,160,1,0,0,0,185,161,1,0,0,0,185,162,1,0,0,0,185,178, + 1,0,0,0,186,195,1,0,0,0,187,188,10,4,0,0,188,189,5,34,0,0,189,194,3,10, + 5,5,190,191,10,3,0,0,191,192,5,51,0,0,192,194,3,10,5,4,193,187,1,0,0,0, + 193,190,1,0,0,0,194,197,1,0,0,0,195,193,1,0,0,0,195,196,1,0,0,0,196,11, + 1,0,0,0,197,195,1,0,0,0,198,200,3,14,7,0,199,201,5,48,0,0,200,199,1,0,0, + 0,200,201,1,0,0,0,201,202,1,0,0,0,202,203,5,47,0,0,203,204,3,98,49,0,204, + 213,1,0,0,0,205,207,3,14,7,0,206,208,5,48,0,0,207,206,1,0,0,0,207,208,1, + 0,0,0,208,209,1,0,0,0,209,210,5,53,0,0,210,211,3,98,49,0,211,213,1,0,0, + 0,212,198,1,0,0,0,212,205,1,0,0,0,213,13,1,0,0,0,214,220,3,16,8,0,215,216, + 3,16,8,0,216,217,3,100,50,0,217,218,3,16,8,0,218,220,1,0,0,0,219,214,1, + 0,0,0,219,215,1,0,0,0,220,15,1,0,0,0,221,222,6,8,-1,0,222,226,3,18,9,0, + 223,224,7,0,0,0,224,226,3,16,8,3,225,221,1,0,0,0,225,223,1,0,0,0,226,235, + 1,0,0,0,227,228,10,2,0,0,228,229,7,1,0,0,229,234,3,16,8,3,230,231,10,1, + 0,0,231,232,7,0,0,0,232,234,3,16,8,2,233,227,1,0,0,0,233,230,1,0,0,0,234, + 237,1,0,0,0,235,233,1,0,0,0,235,236,1,0,0,0,236,17,1,0,0,0,237,235,1,0, + 0,0,238,239,6,9,-1,0,239,247,3,62,31,0,240,247,3,52,26,0,241,247,3,20,10, + 0,242,243,5,44,0,0,243,244,3,10,5,0,244,245,5,54,0,0,245,247,1,0,0,0,246, + 238,1,0,0,0,246,240,1,0,0,0,246,241,1,0,0,0,246,242,1,0,0,0,247,253,1,0, + 0,0,248,249,10,1,0,0,249,250,5,37,0,0,250,252,3,22,11,0,251,248,1,0,0,0, + 252,255,1,0,0,0,253,251,1,0,0,0,253,254,1,0,0,0,254,19,1,0,0,0,255,253, + 1,0,0,0,256,257,3,58,29,0,257,267,5,44,0,0,258,268,5,65,0,0,259,264,3,10, + 5,0,260,261,5,38,0,0,261,263,3,10,5,0,262,260,1,0,0,0,263,266,1,0,0,0,264, + 262,1,0,0,0,264,265,1,0,0,0,265,268,1,0,0,0,266,264,1,0,0,0,267,258,1,0, + 0,0,267,259,1,0,0,0,267,268,1,0,0,0,268,269,1,0,0,0,269,270,5,54,0,0,270, + 21,1,0,0,0,271,272,3,58,29,0,272,23,1,0,0,0,273,274,5,16,0,0,274,275,3, + 26,13,0,275,25,1,0,0,0,276,281,3,28,14,0,277,278,5,38,0,0,278,280,3,28, + 14,0,279,277,1,0,0,0,280,283,1,0,0,0,281,279,1,0,0,0,281,282,1,0,0,0,282, + 27,1,0,0,0,283,281,1,0,0,0,284,290,3,10,5,0,285,286,3,52,26,0,286,287,5, + 36,0,0,287,288,3,10,5,0,288,290,1,0,0,0,289,284,1,0,0,0,289,285,1,0,0,0, + 290,29,1,0,0,0,291,292,5,6,0,0,292,297,3,32,16,0,293,294,5,38,0,0,294,296, + 3,32,16,0,295,293,1,0,0,0,296,299,1,0,0,0,297,295,1,0,0,0,297,298,1,0,0, + 0,298,301,1,0,0,0,299,297,1,0,0,0,300,302,3,38,19,0,301,300,1,0,0,0,301, + 302,1,0,0,0,302,31,1,0,0,0,303,304,3,34,17,0,304,305,5,114,0,0,305,306, + 3,36,18,0,306,309,1,0,0,0,307,309,3,36,18,0,308,303,1,0,0,0,308,307,1,0, + 0,0,309,33,1,0,0,0,310,311,5,25,0,0,311,35,1,0,0,0,312,313,7,2,0,0,313, + 37,1,0,0,0,314,317,3,40,20,0,315,317,3,42,21,0,316,314,1,0,0,0,316,315, + 1,0,0,0,317,39,1,0,0,0,318,319,5,76,0,0,319,324,5,25,0,0,320,321,5,38,0, + 0,321,323,5,25,0,0,322,320,1,0,0,0,323,326,1,0,0,0,324,322,1,0,0,0,324, + 325,1,0,0,0,325,41,1,0,0,0,326,324,1,0,0,0,327,328,5,69,0,0,328,329,3,40, + 20,0,329,330,5,70,0,0,330,43,1,0,0,0,331,332,5,13,0,0,332,337,3,32,16,0, + 333,334,5,38,0,0,334,336,3,32,16,0,335,333,1,0,0,0,336,339,1,0,0,0,337, + 335,1,0,0,0,337,338,1,0,0,0,338,341,1,0,0,0,339,337,1,0,0,0,340,342,3,26, + 13,0,341,340,1,0,0,0,341,342,1,0,0,0,342,345,1,0,0,0,343,344,5,33,0,0,344, + 346,3,26,13,0,345,343,1,0,0,0,345,346,1,0,0,0,346,45,1,0,0,0,347,348,5, + 4,0,0,348,349,3,26,13,0,349,47,1,0,0,0,350,352,5,19,0,0,351,353,3,26,13, + 0,352,351,1,0,0,0,352,353,1,0,0,0,353,356,1,0,0,0,354,355,5,33,0,0,355, + 357,3,26,13,0,356,354,1,0,0,0,356,357,1,0,0,0,357,49,1,0,0,0,358,359,5, + 8,0,0,359,362,3,26,13,0,360,361,5,33,0,0,361,363,3,26,13,0,362,360,1,0, + 0,0,362,363,1,0,0,0,363,51,1,0,0,0,364,369,3,58,29,0,365,366,5,40,0,0,366, + 368,3,58,29,0,367,365,1,0,0,0,368,371,1,0,0,0,369,367,1,0,0,0,369,370,1, + 0,0,0,370,53,1,0,0,0,371,369,1,0,0,0,372,377,3,60,30,0,373,374,5,40,0,0, + 374,376,3,60,30,0,375,373,1,0,0,0,376,379,1,0,0,0,377,375,1,0,0,0,377,378, + 1,0,0,0,378,55,1,0,0,0,379,377,1,0,0,0,380,385,3,54,27,0,381,382,5,38,0, + 0,382,384,3,54,27,0,383,381,1,0,0,0,384,387,1,0,0,0,385,383,1,0,0,0,385, + 386,1,0,0,0,386,57,1,0,0,0,387,385,1,0,0,0,388,389,7,3,0,0,389,59,1,0,0, + 0,390,391,5,80,0,0,391,61,1,0,0,0,392,435,5,49,0,0,393,394,3,96,48,0,394, + 395,5,71,0,0,395,435,1,0,0,0,396,435,3,94,47,0,397,435,3,96,48,0,398,435, + 3,90,45,0,399,435,3,64,32,0,400,435,3,98,49,0,401,402,5,69,0,0,402,407, + 3,92,46,0,403,404,5,38,0,0,404,406,3,92,46,0,405,403,1,0,0,0,406,409,1, + 0,0,0,407,405,1,0,0,0,407,408,1,0,0,0,408,410,1,0,0,0,409,407,1,0,0,0,410, + 411,5,70,0,0,411,435,1,0,0,0,412,413,5,69,0,0,413,418,3,90,45,0,414,415, + 5,38,0,0,415,417,3,90,45,0,416,414,1,0,0,0,417,420,1,0,0,0,418,416,1,0, + 0,0,418,419,1,0,0,0,419,421,1,0,0,0,420,418,1,0,0,0,421,422,5,70,0,0,422, + 435,1,0,0,0,423,424,5,69,0,0,424,429,3,98,49,0,425,426,5,38,0,0,426,428, + 3,98,49,0,427,425,1,0,0,0,428,431,1,0,0,0,429,427,1,0,0,0,429,430,1,0,0, + 0,430,432,1,0,0,0,431,429,1,0,0,0,432,433,5,70,0,0,433,435,1,0,0,0,434, + 392,1,0,0,0,434,393,1,0,0,0,434,396,1,0,0,0,434,397,1,0,0,0,434,398,1,0, + 0,0,434,399,1,0,0,0,434,400,1,0,0,0,434,401,1,0,0,0,434,412,1,0,0,0,434, + 423,1,0,0,0,435,63,1,0,0,0,436,439,5,52,0,0,437,439,5,68,0,0,438,436,1, + 0,0,0,438,437,1,0,0,0,439,65,1,0,0,0,440,441,5,10,0,0,441,442,5,31,0,0, + 442,67,1,0,0,0,443,444,5,18,0,0,444,449,3,70,35,0,445,446,5,38,0,0,446, + 448,3,70,35,0,447,445,1,0,0,0,448,451,1,0,0,0,449,447,1,0,0,0,449,450,1, + 0,0,0,450,69,1,0,0,0,451,449,1,0,0,0,452,454,3,10,5,0,453,455,7,4,0,0,454, + 453,1,0,0,0,454,455,1,0,0,0,455,458,1,0,0,0,456,457,5,50,0,0,457,459,7, + 5,0,0,458,456,1,0,0,0,458,459,1,0,0,0,459,71,1,0,0,0,460,461,5,9,0,0,461, + 462,3,56,28,0,462,73,1,0,0,0,463,464,5,2,0,0,464,465,3,56,28,0,465,75,1, + 0,0,0,466,467,5,15,0,0,467,472,3,78,39,0,468,469,5,38,0,0,469,471,3,78, + 39,0,470,468,1,0,0,0,471,474,1,0,0,0,472,470,1,0,0,0,472,473,1,0,0,0,473, + 77,1,0,0,0,474,472,1,0,0,0,475,476,3,54,27,0,476,477,5,84,0,0,477,478,3, + 54,27,0,478,79,1,0,0,0,479,480,5,1,0,0,480,481,3,18,9,0,481,483,3,98,49, + 0,482,484,3,86,43,0,483,482,1,0,0,0,483,484,1,0,0,0,484,81,1,0,0,0,485, + 486,5,7,0,0,486,487,3,18,9,0,487,488,3,98,49,0,488,83,1,0,0,0,489,490,5, + 14,0,0,490,491,3,52,26,0,491,85,1,0,0,0,492,497,3,88,44,0,493,494,5,38, + 0,0,494,496,3,88,44,0,495,493,1,0,0,0,496,499,1,0,0,0,497,495,1,0,0,0,497, + 498,1,0,0,0,498,87,1,0,0,0,499,497,1,0,0,0,500,501,3,58,29,0,501,502,5, + 36,0,0,502,503,3,62,31,0,503,89,1,0,0,0,504,505,7,6,0,0,505,91,1,0,0,0, + 506,509,3,94,47,0,507,509,3,96,48,0,508,506,1,0,0,0,508,507,1,0,0,0,509, + 93,1,0,0,0,510,512,7,0,0,0,511,510,1,0,0,0,511,512,1,0,0,0,512,513,1,0, + 0,0,513,514,5,32,0,0,514,95,1,0,0,0,515,517,7,0,0,0,516,515,1,0,0,0,516, + 517,1,0,0,0,517,518,1,0,0,0,518,519,5,31,0,0,519,97,1,0,0,0,520,521,5,30, + 0,0,521,99,1,0,0,0,522,523,7,7,0,0,523,101,1,0,0,0,524,525,5,5,0,0,525, + 526,3,104,52,0,526,103,1,0,0,0,527,528,5,69,0,0,528,529,3,2,1,0,529,530, + 5,70,0,0,530,105,1,0,0,0,531,532,5,17,0,0,532,533,5,106,0,0,533,107,1,0, + 0,0,534,535,5,12,0,0,535,536,5,110,0,0,536,109,1,0,0,0,537,538,5,3,0,0, + 538,541,5,90,0,0,539,540,5,88,0,0,540,542,3,54,27,0,541,539,1,0,0,0,541, + 542,1,0,0,0,542,552,1,0,0,0,543,544,5,89,0,0,544,549,3,112,56,0,545,546, + 5,38,0,0,546,548,3,112,56,0,547,545,1,0,0,0,548,551,1,0,0,0,549,547,1,0, + 0,0,549,550,1,0,0,0,550,553,1,0,0,0,551,549,1,0,0,0,552,543,1,0,0,0,552, + 553,1,0,0,0,553,111,1,0,0,0,554,555,3,54,27,0,555,556,5,36,0,0,556,558, + 1,0,0,0,557,554,1,0,0,0,557,558,1,0,0,0,558,559,1,0,0,0,559,560,3,54,27, + 0,560,113,1,0,0,0,561,562,5,11,0,0,562,563,3,32,16,0,563,564,5,88,0,0,564, + 565,3,56,28,0,565,115,1,0,0,0,54,127,136,152,164,173,181,185,193,195,200, + 207,212,219,225,233,235,246,253,264,267,281,289,297,301,308,316,324,337, + 341,345,352,356,362,369,377,385,407,418,429,434,438,449,454,458,472,483, + 497,508,511,516,541,549,552,557]; private static __ATN: ATN; public static get _ATN(): ATN { @@ -4262,11 +4344,11 @@ export class FromCommandContext extends ParserRuleContext { public FROM(): TerminalNode { return this.getToken(esql_parser.FROM, 0); } - public indexIdentifier_list(): IndexIdentifierContext[] { - return this.getTypedRuleContexts(IndexIdentifierContext) as IndexIdentifierContext[]; + public indexPattern_list(): IndexPatternContext[] { + return this.getTypedRuleContexts(IndexPatternContext) as IndexPatternContext[]; } - public indexIdentifier(i: number): IndexIdentifierContext { - return this.getTypedRuleContext(IndexIdentifierContext, i) as IndexIdentifierContext; + public indexPattern(i: number): IndexPatternContext { + return this.getTypedRuleContext(IndexPatternContext, i) as IndexPatternContext; } public COMMA_list(): TerminalNode[] { return this.getTokens(esql_parser.COMMA); @@ -4293,25 +4375,82 @@ export class FromCommandContext extends ParserRuleContext { } -export class IndexIdentifierContext extends ParserRuleContext { +export class IndexPatternContext extends ParserRuleContext { constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); this.parser = parser; } - public INDEX_UNQUOTED_IDENTIFIER(): TerminalNode { - return this.getToken(esql_parser.INDEX_UNQUOTED_IDENTIFIER, 0); + public clusterString(): ClusterStringContext { + return this.getTypedRuleContext(ClusterStringContext, 0) as ClusterStringContext; + } + public COLON(): TerminalNode { + return this.getToken(esql_parser.COLON, 0); + } + public indexString(): IndexStringContext { + return this.getTypedRuleContext(IndexStringContext, 0) as IndexStringContext; } public get ruleIndex(): number { - return esql_parser.RULE_indexIdentifier; + return esql_parser.RULE_indexPattern; } public enterRule(listener: esql_parserListener): void { - if(listener.enterIndexIdentifier) { - listener.enterIndexIdentifier(this); + if(listener.enterIndexPattern) { + listener.enterIndexPattern(this); } } public exitRule(listener: esql_parserListener): void { - if(listener.exitIndexIdentifier) { - listener.exitIndexIdentifier(this); + if(listener.exitIndexPattern) { + listener.exitIndexPattern(this); + } + } +} + + +export class ClusterStringContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public UNQUOTED_SOURCE(): TerminalNode { + return this.getToken(esql_parser.UNQUOTED_SOURCE, 0); + } + public get ruleIndex(): number { + return esql_parser.RULE_clusterString; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterClusterString) { + listener.enterClusterString(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitClusterString) { + listener.exitClusterString(this); + } + } +} + + +export class IndexStringContext extends ParserRuleContext { + constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { + super(parent, invokingState); + this.parser = parser; + } + public UNQUOTED_SOURCE(): TerminalNode { + return this.getToken(esql_parser.UNQUOTED_SOURCE, 0); + } + public QUOTED_STRING(): TerminalNode { + return this.getToken(esql_parser.QUOTED_STRING, 0); + } + public get ruleIndex(): number { + return esql_parser.RULE_indexString; + } + public enterRule(listener: esql_parserListener): void { + if(listener.enterIndexString) { + listener.enterIndexString(this); + } + } + public exitRule(listener: esql_parserListener): void { + if(listener.exitIndexString) { + listener.exitIndexString(this); } } } @@ -4352,11 +4491,11 @@ export class MetadataOptionContext extends ParserRuleContext { public METADATA(): TerminalNode { return this.getToken(esql_parser.METADATA, 0); } - public indexIdentifier_list(): IndexIdentifierContext[] { - return this.getTypedRuleContexts(IndexIdentifierContext) as IndexIdentifierContext[]; + public UNQUOTED_SOURCE_list(): TerminalNode[] { + return this.getTokens(esql_parser.UNQUOTED_SOURCE); } - public indexIdentifier(i: number): IndexIdentifierContext { - return this.getTypedRuleContext(IndexIdentifierContext, i) as IndexIdentifierContext; + public UNQUOTED_SOURCE(i: number): TerminalNode { + return this.getToken(esql_parser.UNQUOTED_SOURCE, i); } public COMMA_list(): TerminalNode[] { return this.getTokens(esql_parser.COMMA); @@ -4364,7 +4503,7 @@ export class MetadataOptionContext extends ParserRuleContext { public COMMA(i: number): TerminalNode { return this.getToken(esql_parser.COMMA, i); } - public get ruleIndex(): number { + public get ruleIndex(): number { return esql_parser.RULE_metadataOption; } public enterRule(listener: esql_parserListener): void { @@ -4420,11 +4559,11 @@ export class MetricsCommandContext extends ParserRuleContext { public METRICS(): TerminalNode { return this.getToken(esql_parser.METRICS, 0); } - public indexIdentifier_list(): IndexIdentifierContext[] { - return this.getTypedRuleContexts(IndexIdentifierContext) as IndexIdentifierContext[]; + public indexPattern_list(): IndexPatternContext[] { + return this.getTypedRuleContexts(IndexPatternContext) as IndexPatternContext[]; } - public indexIdentifier(i: number): IndexIdentifierContext { - return this.getTypedRuleContext(IndexIdentifierContext, i) as IndexIdentifierContext; + public indexPattern(i: number): IndexPatternContext { + return this.getTypedRuleContext(IndexPatternContext, i) as IndexPatternContext; } public COMMA_list(): TerminalNode[] { return this.getTokens(esql_parser.COMMA); @@ -5776,7 +5915,7 @@ export class EnrichWithClauseContext extends ParserRuleContext { export class LookupCommandContext extends ParserRuleContext { - public _tableName!: Token; + public _tableName!: IndexPatternContext; public _matchFields!: QualifiedNamePatternsContext; constructor(parser?: esql_parser, parent?: ParserRuleContext, invokingState?: number) { super(parent, invokingState); @@ -5788,8 +5927,8 @@ export class LookupCommandContext extends ParserRuleContext { public ON(): TerminalNode { return this.getToken(esql_parser.ON, 0); } - public INDEX_UNQUOTED_IDENTIFIER(): TerminalNode { - return this.getToken(esql_parser.INDEX_UNQUOTED_IDENTIFIER, 0); + public indexPattern(): IndexPatternContext { + return this.getTypedRuleContext(IndexPatternContext, 0) as IndexPatternContext; } public qualifiedNamePatterns(): QualifiedNamePatternsContext { return this.getTypedRuleContext(QualifiedNamePatternsContext, 0) as QualifiedNamePatternsContext; diff --git a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts index eee7a421a1593..e6a28c8d71828 100644 --- a/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts +++ b/packages/kbn-esql-ast/src/antlr/esql_parser_listener.ts @@ -33,7 +33,9 @@ import { RowCommandContext } from "./esql_parser"; import { FieldsContext } from "./esql_parser"; import { FieldContext } from "./esql_parser"; import { FromCommandContext } from "./esql_parser"; -import { IndexIdentifierContext } from "./esql_parser"; +import { IndexPatternContext } from "./esql_parser"; +import { ClusterStringContext } from "./esql_parser"; +import { IndexStringContext } from "./esql_parser"; import { MetadataContext } from "./esql_parser"; import { MetadataOptionContext } from "./esql_parser"; import { Deprecated_metadataContext } from "./esql_parser"; @@ -419,15 +421,35 @@ export default class esql_parserListener extends ParseTreeListener { */ exitFromCommand?: (ctx: FromCommandContext) => void; /** - * Enter a parse tree produced by `esql_parser.indexIdentifier`. + * Enter a parse tree produced by `esql_parser.indexPattern`. * @param ctx the parse tree */ - enterIndexIdentifier?: (ctx: IndexIdentifierContext) => void; + enterIndexPattern?: (ctx: IndexPatternContext) => void; /** - * Exit a parse tree produced by `esql_parser.indexIdentifier`. + * Exit a parse tree produced by `esql_parser.indexPattern`. * @param ctx the parse tree */ - exitIndexIdentifier?: (ctx: IndexIdentifierContext) => void; + exitIndexPattern?: (ctx: IndexPatternContext) => void; + /** + * Enter a parse tree produced by `esql_parser.clusterString`. + * @param ctx the parse tree + */ + enterClusterString?: (ctx: ClusterStringContext) => void; + /** + * Exit a parse tree produced by `esql_parser.clusterString`. + * @param ctx the parse tree + */ + exitClusterString?: (ctx: ClusterStringContext) => void; + /** + * Enter a parse tree produced by `esql_parser.indexString`. + * @param ctx the parse tree + */ + enterIndexString?: (ctx: IndexStringContext) => void; + /** + * Exit a parse tree produced by `esql_parser.indexString`. + * @param ctx the parse tree + */ + exitIndexString?: (ctx: IndexStringContext) => void; /** * Enter a parse tree produced by `esql_parser.metadata`. * @param ctx the parse tree diff --git a/packages/kbn-esql-ast/src/ast_factory.ts b/packages/kbn-esql-ast/src/ast_factory.ts index 9d76ff3a7cd4d..18c2a3c7ecbec 100644 --- a/packages/kbn-esql-ast/src/ast_factory.ts +++ b/packages/kbn-esql-ast/src/ast_factory.ts @@ -29,7 +29,7 @@ import { default as esql_parser, type MetaCommandContext, type MetricsCommandContext, - IndexIdentifierContext, + IndexPatternContext, } from './antlr/esql_parser'; import { default as ESQLParserListener } from './antlr/esql_parser_listener'; import { @@ -154,7 +154,7 @@ export class AstListener implements ESQLParserListener { type: 'command', args: [], sources: ctx - .getTypedRuleContexts(IndexIdentifierContext) + .getTypedRuleContexts(IndexPatternContext) .map((sourceCtx) => createSource(sourceCtx)), }; this.ast.push(node); diff --git a/packages/kbn-esql-ast/src/ast_helpers.ts b/packages/kbn-esql-ast/src/ast_helpers.ts index 76e130f233807..f3c5ad0b0df18 100644 --- a/packages/kbn-esql-ast/src/ast_helpers.ts +++ b/packages/kbn-esql-ast/src/ast_helpers.ts @@ -275,12 +275,24 @@ function safeBackticksRemoval(text: string | undefined) { return text?.replace(TICKS_REGEX, '').replace(DOUBLE_TICKS_REGEX, SINGLE_BACKTICK) || ''; } +function sanitizeSourceString(ctx: ParserRuleContext) { + const contextText = ctx.getText(); + // If wrapped by triple quote, remove + if (contextText.startsWith(`"""`) && contextText.endsWith(`"""`)) { + return contextText.replace(/\"\"\"/g, ''); + } + // If wrapped by single quote, remove + if (contextText.startsWith(`"`) && contextText.endsWith(`"`)) { + return contextText.slice(1, -1); + } + return contextText; +} + export function sanitizeIdentifierString(ctx: ParserRuleContext) { const result = getUnquotedText(ctx)?.getText() || safeBackticksRemoval(getQuotedText(ctx)?.getText()) || safeBackticksRemoval(ctx.getText()); // for some reason some quoted text is not detected correctly by the parser - // TODO - understand why is now returned as the match text for the FROM command return result === '' ? '' : result; } @@ -321,7 +333,7 @@ export function createSource( ctx: ParserRuleContext, type: 'index' | 'policy' = 'index' ): ESQLSource { - const text = sanitizeIdentifierString(ctx); + const text = sanitizeSourceString(ctx); return { type: 'source', name: text, diff --git a/packages/kbn-esql-ast/src/ast_walker.ts b/packages/kbn-esql-ast/src/ast_walker.ts index 870301b938a65..33aa91f66a2a6 100644 --- a/packages/kbn-esql-ast/src/ast_walker.ts +++ b/packages/kbn-esql-ast/src/ast_walker.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { type ParserRuleContext } from 'antlr4'; +import { ParserRuleContext, TerminalNode } from 'antlr4'; import { default as esql_parser, ArithmeticBinaryContext, @@ -57,10 +57,10 @@ import { StringLiteralContext, type ValueExpressionContext, ValueExpressionDefaultContext, - IndexIdentifierContext, InlineCastContext, InputNamedOrPositionalParamContext, InputParamContext, + IndexPatternContext, } from './antlr/esql_parser'; import { createSource, @@ -98,16 +98,27 @@ import type { } from './types'; export function collectAllSourceIdentifiers(ctx: FromCommandContext): ESQLAstItem[] { - const fromContexts = ctx.getTypedRuleContexts(IndexIdentifierContext); - + const fromContexts = ctx.getTypedRuleContexts(IndexPatternContext); return fromContexts.map((sourceCtx) => createSource(sourceCtx)); } +function terminalNodeToParserRuleContext(node: TerminalNode): ParserRuleContext { + const context = new ParserRuleContext(); + context.start = node.symbol; + context.stop = node.symbol; + context.children = [node]; + return context; +} function extractIdentifiers( ctx: KeepCommandContext | DropCommandContext | MvExpandCommandContext | MetadataOptionContext ) { if (ctx instanceof MetadataOptionContext) { - return wrapIdentifierAsArray(ctx.indexIdentifier_list()); + return ctx + .UNQUOTED_SOURCE_list() + .map((node) => { + return terminalNodeToParserRuleContext(node); + }) + .flat(); } if (ctx instanceof MvExpandCommandContext) { return wrapIdentifierAsArray(ctx.qualifiedName()); diff --git a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts index b1bafc2ce4359..ab5c1ca04ac7f 100644 --- a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts +++ b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts @@ -64,6 +64,12 @@ describe('esql query helpers', () => { 'METRICS pods load=avg(cpu), writes=max(rate(indexing_requests)) BY pod | SORT pod' ); expect(idxPattern16).toBe('pods'); + + const idxPattern17 = getIndexPatternFromESQLQuery('FROM "$foo%"'); + expect(idxPattern17).toBe('$foo%'); + + const idxPattern18 = getIndexPatternFromESQLQuery('FROM """foo-{{mm-dd_yy}}"""'); + expect(idxPattern18).toBe('foo-{{mm-dd_yy}}'); }); }); diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts index 74301ced77e63..06d23a30c441d 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.from.ts @@ -20,7 +20,7 @@ export const validationFromCommandTestSuite = (setup: helpers.Setup) => { "SyntaxError: mismatched input 'f' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}", ]); await expectErrors('from ', [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''", + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}", ]); }); @@ -30,6 +30,8 @@ export const validationFromCommandTestSuite = (setup: helpers.Setup) => { await expectErrors('from index', []); await expectErrors('FROM index', []); + await expectErrors('FROM "index"', []); + await expectErrors('FROM """index"""', []); await expectErrors('FrOm index', []); await expectErrors('from index, other_index', []); await expectErrors('from index, other_index,.secret_index', []); @@ -65,10 +67,10 @@ export const validationFromCommandTestSuite = (setup: helpers.Setup) => { const { expectErrors } = await setup(); await expectErrors('from index,', [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''", + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}", ]); await expectErrors(`FROM index\n, \tother_index\t,\n \t `, [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''", + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}", ]); await expectErrors(`from assignment = 1`, [ @@ -80,10 +82,7 @@ export const validationFromCommandTestSuite = (setup: helpers.Setup) => { test('errors on invalid syntax', async () => { const { expectErrors } = await setup(); - await expectErrors('FROM `index`', [ - "SyntaxError: token recognition error at: '`'", - "SyntaxError: token recognition error at: '`'", - ]); + await expectErrors('FROM `index`', ['Unknown index [`index`]']); await expectErrors(`from assignment = 1`, [ "SyntaxError: mismatched input '=' expecting ", 'Unknown index [assignment]', diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts index 5d1ddb0865ea5..44c15c722a1de 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/__tests__/test_suites/validation.command.metrics.ts @@ -19,7 +19,7 @@ export const validationMetricsCommandTestSuite = (setup: helpers.Setup) => { "SyntaxError: mismatched input 'm' expecting {'explain', 'from', 'meta', 'metrics', 'row', 'show'}", ]); await expectErrors('metrics ', [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''", + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}", ]); }); @@ -61,10 +61,10 @@ export const validationMetricsCommandTestSuite = (setup: helpers.Setup) => { const { expectErrors } = await setup(); await expectErrors('metrics index,', [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''", + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}", ]); await expectErrors(`metrics index\n, \tother_index\t,\n \t `, [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''", + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}", ]); }); @@ -75,10 +75,7 @@ export const validationMetricsCommandTestSuite = (setup: helpers.Setup) => { "SyntaxError: token recognition error at: '='", "SyntaxError: token recognition error at: '1'", ]); - await expectErrors('metrics `index`', [ - "SyntaxError: token recognition error at: '`'", - "SyntaxError: token recognition error at: '`'", - ]); + await expectErrors('metrics `index`', ['Unknown index [`index`]']); }); test('errors on unknown index', async () => { diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index daf8d7c6de862..c49f5c7af82df 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -8662,7 +8662,8 @@ { "query": "from a_index | enrich `this``is fine`", "error": [ - "SyntaxError: mismatched input '`this``is fine`' expecting ENRICH_POLICY_NAME" + "SyntaxError: extraneous input 'fine`' expecting ", + "Unknown policy [`this``is]" ], "warning": [] }, @@ -26377,7 +26378,7 @@ { "query": "from ", "error": [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''" + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}" ], "warning": [] }, @@ -26391,6 +26392,16 @@ "error": [], "warning": [] }, + { + "query": "FROM \"index\"", + "error": [], + "warning": [] + }, + { + "query": "FROM \"\"\"index\"\"\"", + "error": [], + "warning": [] + }, { "query": "FrOm index", "error": [], @@ -26539,14 +26550,14 @@ { "query": "from index,", "error": [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''" + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}" ], "warning": [] }, { "query": "FROM index\n, \tother_index\t,\n \t ", "error": [ - "SyntaxError: missing INDEX_UNQUOTED_IDENTIFIER at ''" + "SyntaxError: mismatched input '' expecting {UNQUOTED_SOURCE, QUOTED_STRING}" ], "warning": [] }, @@ -26561,8 +26572,7 @@ { "query": "FROM `index`", "error": [ - "SyntaxError: token recognition error at: '`'", - "SyntaxError: token recognition error at: '`'" + "Unknown index [`index`]" ], "warning": [] }, diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 6c1b66574862c..14d9c50d5c88c 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -1359,7 +1359,8 @@ describe('validation logic', () => { ]); testErrorsAndWarnings(`from a_index | enrich policy `, []); testErrorsAndWarnings('from a_index | enrich `this``is fine`', [ - "SyntaxError: mismatched input '`this``is fine`' expecting ENRICH_POLICY_NAME", + "SyntaxError: extraneous input 'fine`' expecting ", + 'Unknown policy [`this``is]', ]); testErrorsAndWarnings('from a_index | enrich this is fine', [ "SyntaxError: mismatched input 'is' expecting ", From 41ee64709f8c7ca1e0bc72ac4b5a74076d68ba26 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Tue, 9 Jul 2024 19:36:34 +0200 Subject: [PATCH 10/82] [CI] Remove kme leftovers (#187762) ## Summary These were used for testing the migration from the kibana-buildkite infra to the elastic-wide buildkite infra. Now we're done with most of the migration, we can clean these up. --- .buildkite/pipeline-utils/agent_images.ts | 17 ++++++- .../ci-stats/pick_test_group_run_order.ts | 25 ++-------- .buildkite/pipelines/flaky_tests/pipeline.ts | 38 ++------------- .buildkite/pipelines/on_merge.yml | 14 ------ .buildkite/pull_requests.json | 46 ------------------- .buildkite/scripts/common/vault_fns.sh | 14 ++---- catalog-info.yaml | 28 ----------- 7 files changed, 28 insertions(+), 154 deletions(-) diff --git a/.buildkite/pipeline-utils/agent_images.ts b/.buildkite/pipeline-utils/agent_images.ts index 0606f036b1c64..d139f7953e00f 100644 --- a/.buildkite/pipeline-utils/agent_images.ts +++ b/.buildkite/pipeline-utils/agent_images.ts @@ -52,4 +52,19 @@ function getAgentImageConfig({ returnYaml = false } = {}): string | AgentImageCo return config; } -export { getAgentImageConfig }; +const expandAgentQueue = (queueName: string = 'n2-4-spot') => { + const [kind, cores, addition] = queueName.split('-'); + const additionalProps = + { + spot: { preemptible: true }, + virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, + }[addition] || {}; + + return { + ...getAgentImageConfig(), + machineType: `${kind}-standard-${cores}`, + ...additionalProps, + }; +}; + +export { getAgentImageConfig, expandAgentQueue }; diff --git a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts index 20b2d366e6067..a24214b1e62b0 100644 --- a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts +++ b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts @@ -16,27 +16,10 @@ import { BuildkiteClient, BuildkiteStep } from '../buildkite'; import { CiStatsClient, TestGroupRunOrderResponse } from './client'; import DISABLED_JEST_CONFIGS from '../../disabled_jest_configs.json'; -import { getAgentImageConfig } from '#pipeline-utils'; +import { expandAgentQueue } from '#pipeline-utils'; type RunGroup = TestGroupRunOrderResponse['types'][0]; -// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized -/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ -const getAgentRule = (queueName: string = 'n2-4-spot') => { - if (process.env?.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld') { - const [kind, cores, spot] = queueName.split('-'); - return { - ...getAgentImageConfig(), - machineType: `${kind}-standard-${cores}`, - preemptible: spot === 'spot', - }; - } else { - return { - queue: queueName, - }; - } -}; - const getRequiredEnv = (name: string) => { const value = process.env[name]; if (typeof value !== 'string' || !value) { @@ -436,7 +419,7 @@ export async function pickTestGroupRunOrder() { parallelism: unit.count, timeout_in_minutes: 120, key: 'jest', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -454,7 +437,7 @@ export async function pickTestGroupRunOrder() { parallelism: integration.count, timeout_in_minutes: 120, key: 'jest-integration', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -488,7 +471,7 @@ export async function pickTestGroupRunOrder() { label: title, command: getRequiredEnv('FTR_CONFIGS_SCRIPT'), timeout_in_minutes: 90, - agents: getAgentRule(queue), + agents: expandAgentQueue(queue), env: { FTR_CONFIG_GROUP_KEY: key, ...FTR_EXTRA_ARGS, diff --git a/.buildkite/pipelines/flaky_tests/pipeline.ts b/.buildkite/pipelines/flaky_tests/pipeline.ts index 6a5b7da38a143..d77504deacb45 100644 --- a/.buildkite/pipelines/flaky_tests/pipeline.ts +++ b/.buildkite/pipelines/flaky_tests/pipeline.ts @@ -7,7 +7,7 @@ */ import { groups } from './groups.json'; -import { BuildkiteStep } from '#pipeline-utils'; +import { BuildkiteStep, expandAgentQueue } from '#pipeline-utils'; const configJson = process.env.KIBANA_FLAKY_TEST_RUNNER_CONFIG; if (!configJson) { @@ -32,34 +32,6 @@ if (Number.isNaN(concurrency)) { const BASE_JOBS = 1; const MAX_JOBS = 500; -// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized -/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ -const getAgentRule = (queueName: string = 'n2-4-spot') => { - if ( - process.env.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld' || - process.env.BUILDKITE_AGENT_META_DATA_PROVIDER === 'k8s' - ) { - const [kind, cores, addition] = queueName.split('-'); - const additionalProps = - { - spot: { preemptible: true }, - virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, - }[addition] || {}; - - return { - provider: 'gcp', - image: 'family/kibana-ubuntu-2004', - imageProject: 'elastic-images-prod', - machineType: `${kind}-standard-${cores}`, - ...additionalProps, - }; - } else { - return { - queue: queueName, - }; - } -}; - function getTestSuitesFromJson(json: string) { const fail = (errorMsg: string) => { console.error('+++ Invalid test config provided'); @@ -150,7 +122,7 @@ const pipeline = { steps.push({ command: '.buildkite/scripts/steps/build_kibana.sh', label: 'Build Kibana Distribution and Plugins', - agents: getAgentRule('c2-8'), + agents: expandAgentQueue('c2-8'), key: 'build', if: "build.env('KIBANA_BUILD_ID') == null || build.env('KIBANA_BUILD_ID') == ''", }); @@ -173,7 +145,7 @@ for (const testSuite of testSuites) { concurrency, concurrency_group: process.env.UUID, concurrency_method: 'eager', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), depends_on: 'build', timeout_in_minutes: 150, cancel_on_build_failing: true, @@ -197,7 +169,7 @@ for (const testSuite of testSuites) { steps.push({ command: `.buildkite/scripts/steps/functional/${suiteName}.sh`, label: group.name, - agents: getAgentRule(agentQueue), + agents: expandAgentQueue(agentQueue), key: `cypress-suite-${suiteIndex++}`, depends_on: 'build', timeout_in_minutes: 150, @@ -233,7 +205,7 @@ pipeline.steps.push({ pipeline.steps.push({ command: 'ts-node .buildkite/pipelines/flaky_tests/post_stats_on_pr.ts', label: 'Post results on Github pull request', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), timeout_in_minutes: 15, retry: { automatic: [{ exit_status: '-1', limit: 3 }], diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index ae6c05721ae84..d6f838414cff4 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -23,20 +23,6 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-2 - # TODO: this can probably be deleted after the migration https://github.com/elastic/kibana-operations/issues/15 - plugins: - - chronotc/monorepo-diff#v2.0.4: - watch: - - path: - - 'versions.json' - config: - command: 'ts-node .buildkite/scripts/steps/trigger_pipeline.ts kibana-buildkite-pipelines-deploy main' - label: 'Trigger pipeline deploy' - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-2 - command: .buildkite/scripts/steps/on_merge_build_and_metrics.sh label: Build Kibana Distribution and Plugins diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 0c6714d1c75b7..0758e0255247f 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -45,52 +45,6 @@ "/__snapshots__/", "\\.test\\.(ts|tsx|js|jsx)" ] - }, - { - "repoOwner": "elastic", - "repoName": "kibana", - "pipelineSlug": "kibana-kme-test", - - "enabled": true, - "allow_org_users": true, - "allowed_repo_permissions": ["admin", "write"], - "set_commit_status": true, - "commit_status_context": "kibana-ci-test", - "build_on_commit": true, - "build_on_comment": false, - "trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))", - "skip_ci_labels": [], - "labels": ["kme-test"], - "skip_target_branches": ["6.8", "7.11", "7.12"], - "enable_skippable_commits": true, - "skip_ci_on_only_changed": [ - "^dev_docs/", - "^docs/", - "^rfcs/", - "^\\.github/", - "\\.md$", - "\\.mdx$", - "^api_docs/.+\\.devdocs\\.json$", - "^\\.backportrc\\.json$", - "^nav-kibana-dev\\.docnav\\.json$", - "^src/dev/prs/kibana_qa_pr_list\\.json$", - "^\\.buildkite/pull_requests\\.json$", - "^\\.catalog-info\\.yaml$" - ], - "always_require_ci_on_changed": [ - "^docs/developer/plugin-list.asciidoc$", - "^\\.github/CODEOWNERS$", - "/plugins/[^/]+/readme\\.(md|asciidoc)$" - ], - "kibana_versions_check": true, - "kibana_build_reuse": true, - "kibana_build_reuse_pipeline_slugs": ["kibana-kme-test", "kibana-on-merge"], - "kibana_build_reuse_regexes": [ - "^test/", - "^x-pack/test/", - "/__snapshots__/", - "\\.test\\.(ts|tsx|js|jsx)" - ] } ] } diff --git a/.buildkite/scripts/common/vault_fns.sh b/.buildkite/scripts/common/vault_fns.sh index c9c51b2c7bb92..fa99b214c1be6 100644 --- a/.buildkite/scripts/common/vault_fns.sh +++ b/.buildkite/scripts/common/vault_fns.sh @@ -1,17 +1,9 @@ #!/bin/bash -# TODO: rewrite after https://github.com/elastic/kibana-operations/issues/15 is done export LEGACY_VAULT_ADDR="https://secrets.elastic.co:8200" -if [[ "${VAULT_ADDR:-}" == "$LEGACY_VAULT_ADDR" ]]; then - VAULT_PATH_PREFIX="secret/kibana-issues/dev" - VAULT_KV_PREFIX="secret/kibana-issues/dev" - IS_LEGACY_VAULT_ADDR=true -else - VAULT_PATH_PREFIX="secret/ci/elastic-kibana" - VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" - IS_LEGACY_VAULT_ADDR=false -fi -export IS_LEGACY_VAULT_ADDR +export VAULT_PATH_PREFIX="secret/ci/elastic-kibana" +export VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" +export IS_LEGACY_VAULT_ADDR=false retry() { local retries=$1; shift diff --git a/catalog-info.yaml b/catalog-info.yaml index aae8fc1af81d8..4af2698ca6cca 100644 --- a/catalog-info.yaml +++ b/catalog-info.yaml @@ -97,34 +97,6 @@ spec: # yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json apiVersion: backstage.io/v1alpha1 kind: Resource -metadata: - name: buildkite-pipeline-kibana-kme-test -spec: - implementation: - apiVersion: buildkite.elastic.dev/v1 - kind: Pipeline - metadata: - description: Temporary pipeline for testing Kibana KME work - name: kibana-kme-test - spec: - pipeline_file: .buildkite/scripts/pipelines/pull_request/pipeline.sh - provider_settings: - build_branches: false - build_pull_requests: true - publish_commit_status: false - trigger_mode: none - repository: elastic/kibana - teams: - kibana-operations: - access_level: MANAGE_BUILD_AND_READ - everyone: - access_level: READ_ONLY - owner: group:kibana-operations - type: buildkite-pipeline ---- -# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json -apiVersion: backstage.io/v1alpha1 -kind: Resource metadata: name: buildkite-pipeline-kibana-sonarqube description: Run a SonarQube scan From 75f9377dd4f2b5d8bc0689e58058dde347568f7f Mon Sep 17 00:00:00 2001 From: Elastic Machine Date: Wed, 10 Jul 2024 03:51:19 +1000 Subject: [PATCH 11/82] Update kubernetes templates for elastic-agent (#187881) Automated by https://buildkite.com/elastic/elastic-agent/builds/10272 --- x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts index 4b7068336bbc5..6eff632c06abb 100644 --- a/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts +++ b/x-pack/plugins/fleet/server/services/elastic_agent_manifest.ts @@ -42,7 +42,7 @@ spec: # - -c # - >- # mkdir -p /usr/share/elastic-agent/state/inputs.d && - # curl -sL https://github.com/elastic/elastic-agent/archive/8.15.tar.gz | tar xz -C /usr/share/elastic-agent/state/inputs.d --strip=5 "elastic-agent-8.15/deploy/kubernetes/elastic-agent/templates.d" + # curl -sL https://github.com/elastic/elastic-agent/archive/8.16.tar.gz | tar xz -C /usr/share/elastic-agent/state/inputs.d --strip=5 "elastic-agent-8.16/deploy/kubernetes/elastic-agent/templates.d" # securityContext: # runAsUser: 0 # volumeMounts: From 4f8d54a75427537d3a4bcca11e160c97fcd895e1 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Tue, 9 Jul 2024 20:59:01 +0300 Subject: [PATCH 12/82] [ResponseOps][Cases] Make custom fields and the cases webhook GA (#187880) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR makes the custom fields and the cases web hook GA. Screenshot 2024-07-09 at 6 51 24 PM Screenshot 2024-07-09 at 6 51 15 PM ## Release notes Cases custom fields and the cases webhook are now GA. ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../plugins/cases/docs/openapi/bundled.yaml | 12 -------- .../case_configure_response_properties.yaml | 29 +++++++++---------- .../schemas/case_response_properties.yaml | 17 +++++------ .../schemas/create_case_request.yaml | 1 - .../set_case_configuration_request.yaml | 1 - .../update_case_configuration_request.yaml | 5 ++-- .../schemas/update_case_request.yaml | 1 - .../public/components/custom_fields/index.tsx | 10 +------ .../connector_types/cases_webhook/webhook.tsx | 1 - 9 files changed, 25 insertions(+), 52 deletions(-) diff --git a/x-pack/plugins/cases/docs/openapi/bundled.yaml b/x-pack/plugins/cases/docs/openapi/bundled.yaml index 08032c30e7f50..7aeea6de8e052 100644 --- a/x-pack/plugins/cases/docs/openapi/bundled.yaml +++ b/x-pack/plugins/cases/docs/openapi/bundled.yaml @@ -281,7 +281,6 @@ paths: - elastic customFields: type: array - x-technical-preview: true description: Custom fields configuration details. items: type: object @@ -478,7 +477,6 @@ paths: - elastic customFields: type: array - x-technical-preview: true description: Custom fields configuration details. items: type: object @@ -677,7 +675,6 @@ paths: - elastic customFields: type: array - x-technical-preview: true description: Custom fields configuration details. items: type: object @@ -1548,7 +1545,6 @@ paths: - elastic customFields: type: array - x-technical-preview: true description: Custom fields configuration details. items: type: object @@ -1746,7 +1742,6 @@ paths: - elastic customFields: type: array - x-technical-preview: true description: Custom fields configuration details. items: type: object @@ -1946,7 +1941,6 @@ paths: - elastic customFields: type: array - x-technical-preview: true description: Custom fields configuration details. items: type: object @@ -3305,7 +3299,6 @@ components: type: array description: | Custom field values for a case. Any optional custom fields that are not specified in the request are set to null. - x-technical-preview: true minItems: 0 maxItems: 10 items: @@ -3804,7 +3797,6 @@ components: customFields: type: array description: Custom field values for the case. - x-technical-preview: true items: type: object properties: @@ -3933,7 +3925,6 @@ components: type: array description: | Custom field values for a case. Any optional custom fields that are not specified in the request are set to null. - x-technical-preview: true minItems: 0 maxItems: 10 items: @@ -4053,7 +4044,6 @@ components: $ref: '#/components/schemas/connector_types' customFields: type: array - x-technical-preview: true description: Custom field values in the template. items: type: object @@ -4135,7 +4125,6 @@ components: customFields: type: array description: Custom fields case configuration. - x-technical-preview: true minItems: 0 maxItems: 10 items: @@ -4216,7 +4205,6 @@ components: customFields: type: array description: Custom fields case configuration. - x-technical-preview: true items: type: object required: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml index 26a7ed41685a1..1085e1f8ef974 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_configure_response_properties.yaml @@ -1,6 +1,6 @@ closure_type: $ref: 'closure_types.yaml' -connector: +connector: type: object properties: $ref: 'case_configure_connector_properties.yaml' @@ -12,14 +12,13 @@ created_at: created_by: type: object required: - - email - - full_name - - username + - email + - full_name + - username properties: $ref: 'user_properties.yaml' customFields: type: array - x-technical-preview: true description: Custom fields configuration details. items: type: object @@ -27,8 +26,8 @@ customFields: $ref: 'case_configure_customfields.yaml' error: type: - - "string" - - "null" + - 'string' + - 'null' examples: - null id: @@ -58,22 +57,22 @@ templates: $ref: 'templates.yaml' updated_at: type: - - "string" - - "null" + - 'string' + - 'null' format: date-time examples: - 2022-06-01T19:58:48.169Z updated_by: type: - - "object" - - "null" + - 'object' + - 'null' required: - - email - - full_name - - username + - email + - full_name + - username properties: $ref: 'user_properties.yaml' version: type: string examples: - - WzIwNzMsMV0= \ No newline at end of file + - WzIwNzMsMV0= diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml index 5aaa73416bacd..a0ef24983502f 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/case_response_properties.yaml @@ -27,13 +27,13 @@ properties: $ref: 'assignees.yaml' category: type: - - "string" - - "null" + - 'string' + - 'null' description: The case category. closed_at: type: - - "string" - - "null" + - 'string' + - 'null' format: date-time closed_by: $ref: 'case_response_closed_by_properties.yaml' @@ -81,7 +81,6 @@ properties: customFields: type: array description: Custom field values for the case. - x-technical-preview: true items: type: object properties: @@ -92,8 +91,8 @@ properties: - A case description. duration: type: - - "integer" - - "null" + - 'integer' + - 'null' description: > The elapsed time from the creation of the case to its closure (in seconds). If the case has not been closed, the duration is set to null. If the case @@ -135,8 +134,8 @@ properties: - 0 updated_at: type: - - "string" - - "null" + - 'string' + - 'null' format: date-time updated_by: $ref: 'case_response_updated_by_properties.yaml' diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml index d58dea6472c21..94e9ecae9254d 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/create_case_request.yaml @@ -40,7 +40,6 @@ properties: description: > Custom field values for a case. Any optional custom fields that are not specified in the request are set to null. - x-technical-preview: true minItems: 0 maxItems: 10 items: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml index 6bcfad6a736c1..dd275406264b5 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/set_case_configuration_request.yaml @@ -21,7 +21,6 @@ properties: customFields: type: array description: Custom fields case configuration. - x-technical-preview: true minItems: 0 maxItems: 10 items: diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml index 56db4597f8b95..e359eea8e1030 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_configuration_request.yaml @@ -2,7 +2,7 @@ title: Update case configuration request description: > You can update settings such as the closure type, custom fields, templates, and the default connector for cases. type: object -required: +required: - version properties: closure_type: @@ -20,7 +20,6 @@ properties: customFields: type: array description: Custom fields case configuration. - x-technical-preview: true items: type: object required: @@ -38,4 +37,4 @@ properties: To retrieve the version value, use the get configuration API. type: string examples: - - WzIwMiwxXQ== \ No newline at end of file + - WzIwMiwxXQ== diff --git a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml index 3288f5a9476c0..8062128c03450 100644 --- a/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml +++ b/x-pack/plugins/cases/docs/openapi/components/schemas/update_case_request.yaml @@ -34,7 +34,6 @@ properties: description: > Custom field values for a case. Any optional custom fields that are not specified in the request are set to null. - x-technical-preview: true minItems: 0 maxItems: 10 items: diff --git a/x-pack/plugins/cases/public/components/custom_fields/index.tsx b/x-pack/plugins/cases/public/components/custom_fields/index.tsx index a5068df682ad1..afe3a4ad04b32 100644 --- a/x-pack/plugins/cases/public/components/custom_fields/index.tsx +++ b/x-pack/plugins/cases/public/components/custom_fields/index.tsx @@ -21,7 +21,6 @@ import { useCasesContext } from '../cases_context/use_cases_context'; import type { CustomFieldsConfiguration } from '../../../common/types/domain'; import { MAX_CUSTOM_FIELDS_PER_CASE } from '../../../common/constants'; import { CustomFieldsList } from './custom_fields_list'; -import { ExperimentalBadge } from '../experimental_badge/experimental_badge'; export interface Props { customFields: CustomFieldsConfiguration; @@ -68,14 +67,7 @@ const CustomFieldsComponent: React.FC = ({ return canAddCustomFields ? ( - {i18n.TITLE} - - - - - } + title={

{i18n.TITLE}

} description={

{i18n.DESCRIPTION}

} data-test-subj="custom-fields-form-group" > diff --git a/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/webhook.tsx b/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/webhook.tsx index 6e86df15c09c7..c547553260813 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/webhook.tsx +++ b/x-pack/plugins/stack_connectors/public/connector_types/cases_webhook/webhook.tsx @@ -27,7 +27,6 @@ export function getConnectorType(): ConnectorTypeModel< defaultMessage: 'Send a request to a Case Management web service.', } ), - isExperimental: true, actionTypeTitle: i18n.translate( 'xpack.stackConnectors.components.casesWebhookxpack.stackConnectors.components.casesWebhook.connectorTypeTitle', { From 369277fcbcc9ad7af322e56460532b675e19e775 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Tue, 9 Jul 2024 13:05:08 -0500 Subject: [PATCH 13/82] Revert "[CI] Remove kme leftovers (#187762)" This reverts commit 41ee64709f8c7ca1e0bc72ac4b5a74076d68ba26. --- .buildkite/pipeline-utils/agent_images.ts | 17 +------ .../ci-stats/pick_test_group_run_order.ts | 25 ++++++++-- .buildkite/pipelines/flaky_tests/pipeline.ts | 38 +++++++++++++-- .buildkite/pipelines/on_merge.yml | 14 ++++++ .buildkite/pull_requests.json | 46 +++++++++++++++++++ .buildkite/scripts/common/vault_fns.sh | 14 ++++-- catalog-info.yaml | 28 +++++++++++ 7 files changed, 154 insertions(+), 28 deletions(-) diff --git a/.buildkite/pipeline-utils/agent_images.ts b/.buildkite/pipeline-utils/agent_images.ts index d139f7953e00f..0606f036b1c64 100644 --- a/.buildkite/pipeline-utils/agent_images.ts +++ b/.buildkite/pipeline-utils/agent_images.ts @@ -52,19 +52,4 @@ function getAgentImageConfig({ returnYaml = false } = {}): string | AgentImageCo return config; } -const expandAgentQueue = (queueName: string = 'n2-4-spot') => { - const [kind, cores, addition] = queueName.split('-'); - const additionalProps = - { - spot: { preemptible: true }, - virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, - }[addition] || {}; - - return { - ...getAgentImageConfig(), - machineType: `${kind}-standard-${cores}`, - ...additionalProps, - }; -}; - -export { getAgentImageConfig, expandAgentQueue }; +export { getAgentImageConfig }; diff --git a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts index a24214b1e62b0..20b2d366e6067 100644 --- a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts +++ b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts @@ -16,10 +16,27 @@ import { BuildkiteClient, BuildkiteStep } from '../buildkite'; import { CiStatsClient, TestGroupRunOrderResponse } from './client'; import DISABLED_JEST_CONFIGS from '../../disabled_jest_configs.json'; -import { expandAgentQueue } from '#pipeline-utils'; +import { getAgentImageConfig } from '#pipeline-utils'; type RunGroup = TestGroupRunOrderResponse['types'][0]; +// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized +/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ +const getAgentRule = (queueName: string = 'n2-4-spot') => { + if (process.env?.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld') { + const [kind, cores, spot] = queueName.split('-'); + return { + ...getAgentImageConfig(), + machineType: `${kind}-standard-${cores}`, + preemptible: spot === 'spot', + }; + } else { + return { + queue: queueName, + }; + } +}; + const getRequiredEnv = (name: string) => { const value = process.env[name]; if (typeof value !== 'string' || !value) { @@ -419,7 +436,7 @@ export async function pickTestGroupRunOrder() { parallelism: unit.count, timeout_in_minutes: 120, key: 'jest', - agents: expandAgentQueue('n2-4-spot'), + agents: getAgentRule('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -437,7 +454,7 @@ export async function pickTestGroupRunOrder() { parallelism: integration.count, timeout_in_minutes: 120, key: 'jest-integration', - agents: expandAgentQueue('n2-4-spot'), + agents: getAgentRule('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -471,7 +488,7 @@ export async function pickTestGroupRunOrder() { label: title, command: getRequiredEnv('FTR_CONFIGS_SCRIPT'), timeout_in_minutes: 90, - agents: expandAgentQueue(queue), + agents: getAgentRule(queue), env: { FTR_CONFIG_GROUP_KEY: key, ...FTR_EXTRA_ARGS, diff --git a/.buildkite/pipelines/flaky_tests/pipeline.ts b/.buildkite/pipelines/flaky_tests/pipeline.ts index d77504deacb45..6a5b7da38a143 100644 --- a/.buildkite/pipelines/flaky_tests/pipeline.ts +++ b/.buildkite/pipelines/flaky_tests/pipeline.ts @@ -7,7 +7,7 @@ */ import { groups } from './groups.json'; -import { BuildkiteStep, expandAgentQueue } from '#pipeline-utils'; +import { BuildkiteStep } from '#pipeline-utils'; const configJson = process.env.KIBANA_FLAKY_TEST_RUNNER_CONFIG; if (!configJson) { @@ -32,6 +32,34 @@ if (Number.isNaN(concurrency)) { const BASE_JOBS = 1; const MAX_JOBS = 500; +// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized +/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ +const getAgentRule = (queueName: string = 'n2-4-spot') => { + if ( + process.env.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld' || + process.env.BUILDKITE_AGENT_META_DATA_PROVIDER === 'k8s' + ) { + const [kind, cores, addition] = queueName.split('-'); + const additionalProps = + { + spot: { preemptible: true }, + virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, + }[addition] || {}; + + return { + provider: 'gcp', + image: 'family/kibana-ubuntu-2004', + imageProject: 'elastic-images-prod', + machineType: `${kind}-standard-${cores}`, + ...additionalProps, + }; + } else { + return { + queue: queueName, + }; + } +}; + function getTestSuitesFromJson(json: string) { const fail = (errorMsg: string) => { console.error('+++ Invalid test config provided'); @@ -122,7 +150,7 @@ const pipeline = { steps.push({ command: '.buildkite/scripts/steps/build_kibana.sh', label: 'Build Kibana Distribution and Plugins', - agents: expandAgentQueue('c2-8'), + agents: getAgentRule('c2-8'), key: 'build', if: "build.env('KIBANA_BUILD_ID') == null || build.env('KIBANA_BUILD_ID') == ''", }); @@ -145,7 +173,7 @@ for (const testSuite of testSuites) { concurrency, concurrency_group: process.env.UUID, concurrency_method: 'eager', - agents: expandAgentQueue('n2-4-spot'), + agents: getAgentRule('n2-4-spot'), depends_on: 'build', timeout_in_minutes: 150, cancel_on_build_failing: true, @@ -169,7 +197,7 @@ for (const testSuite of testSuites) { steps.push({ command: `.buildkite/scripts/steps/functional/${suiteName}.sh`, label: group.name, - agents: expandAgentQueue(agentQueue), + agents: getAgentRule(agentQueue), key: `cypress-suite-${suiteIndex++}`, depends_on: 'build', timeout_in_minutes: 150, @@ -205,7 +233,7 @@ pipeline.steps.push({ pipeline.steps.push({ command: 'ts-node .buildkite/pipelines/flaky_tests/post_stats_on_pr.ts', label: 'Post results on Github pull request', - agents: expandAgentQueue('n2-4-spot'), + agents: getAgentRule('n2-4-spot'), timeout_in_minutes: 15, retry: { automatic: [{ exit_status: '-1', limit: 3 }], diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index d6f838414cff4..ae6c05721ae84 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -23,6 +23,20 @@ steps: imageProject: elastic-images-prod provider: gcp machineType: n2-standard-2 + # TODO: this can probably be deleted after the migration https://github.com/elastic/kibana-operations/issues/15 + plugins: + - chronotc/monorepo-diff#v2.0.4: + watch: + - path: + - 'versions.json' + config: + command: 'ts-node .buildkite/scripts/steps/trigger_pipeline.ts kibana-buildkite-pipelines-deploy main' + label: 'Trigger pipeline deploy' + agents: + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-prod + provider: gcp + machineType: n2-standard-2 - command: .buildkite/scripts/steps/on_merge_build_and_metrics.sh label: Build Kibana Distribution and Plugins diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 0758e0255247f..0c6714d1c75b7 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -45,6 +45,52 @@ "/__snapshots__/", "\\.test\\.(ts|tsx|js|jsx)" ] + }, + { + "repoOwner": "elastic", + "repoName": "kibana", + "pipelineSlug": "kibana-kme-test", + + "enabled": true, + "allow_org_users": true, + "allowed_repo_permissions": ["admin", "write"], + "set_commit_status": true, + "commit_status_context": "kibana-ci-test", + "build_on_commit": true, + "build_on_comment": false, + "trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))", + "skip_ci_labels": [], + "labels": ["kme-test"], + "skip_target_branches": ["6.8", "7.11", "7.12"], + "enable_skippable_commits": true, + "skip_ci_on_only_changed": [ + "^dev_docs/", + "^docs/", + "^rfcs/", + "^\\.github/", + "\\.md$", + "\\.mdx$", + "^api_docs/.+\\.devdocs\\.json$", + "^\\.backportrc\\.json$", + "^nav-kibana-dev\\.docnav\\.json$", + "^src/dev/prs/kibana_qa_pr_list\\.json$", + "^\\.buildkite/pull_requests\\.json$", + "^\\.catalog-info\\.yaml$" + ], + "always_require_ci_on_changed": [ + "^docs/developer/plugin-list.asciidoc$", + "^\\.github/CODEOWNERS$", + "/plugins/[^/]+/readme\\.(md|asciidoc)$" + ], + "kibana_versions_check": true, + "kibana_build_reuse": true, + "kibana_build_reuse_pipeline_slugs": ["kibana-kme-test", "kibana-on-merge"], + "kibana_build_reuse_regexes": [ + "^test/", + "^x-pack/test/", + "/__snapshots__/", + "\\.test\\.(ts|tsx|js|jsx)" + ] } ] } diff --git a/.buildkite/scripts/common/vault_fns.sh b/.buildkite/scripts/common/vault_fns.sh index fa99b214c1be6..c9c51b2c7bb92 100644 --- a/.buildkite/scripts/common/vault_fns.sh +++ b/.buildkite/scripts/common/vault_fns.sh @@ -1,9 +1,17 @@ #!/bin/bash +# TODO: rewrite after https://github.com/elastic/kibana-operations/issues/15 is done export LEGACY_VAULT_ADDR="https://secrets.elastic.co:8200" -export VAULT_PATH_PREFIX="secret/ci/elastic-kibana" -export VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" -export IS_LEGACY_VAULT_ADDR=false +if [[ "${VAULT_ADDR:-}" == "$LEGACY_VAULT_ADDR" ]]; then + VAULT_PATH_PREFIX="secret/kibana-issues/dev" + VAULT_KV_PREFIX="secret/kibana-issues/dev" + IS_LEGACY_VAULT_ADDR=true +else + VAULT_PATH_PREFIX="secret/ci/elastic-kibana" + VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" + IS_LEGACY_VAULT_ADDR=false +fi +export IS_LEGACY_VAULT_ADDR retry() { local retries=$1; shift diff --git a/catalog-info.yaml b/catalog-info.yaml index 4af2698ca6cca..aae8fc1af81d8 100644 --- a/catalog-info.yaml +++ b/catalog-info.yaml @@ -97,6 +97,34 @@ spec: # yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json apiVersion: backstage.io/v1alpha1 kind: Resource +metadata: + name: buildkite-pipeline-kibana-kme-test +spec: + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + description: Temporary pipeline for testing Kibana KME work + name: kibana-kme-test + spec: + pipeline_file: .buildkite/scripts/pipelines/pull_request/pipeline.sh + provider_settings: + build_branches: false + build_pull_requests: true + publish_commit_status: false + trigger_mode: none + repository: elastic/kibana + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: READ_ONLY + owner: group:kibana-operations + type: buildkite-pipeline +--- +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource metadata: name: buildkite-pipeline-kibana-sonarqube description: Run a SonarQube scan From 4b38ffde3e472dcba8d4c6d254ceea9b3e4dfbe0 Mon Sep 17 00:00:00 2001 From: DeDe Morton Date: Tue, 9 Jul 2024 11:24:33 -0700 Subject: [PATCH 14/82] [docs] Add note about accessing Azure OpenAI through a proxy (#186436) ## Summary Closes https://github.com/elastic/observability-docs/issues/4005. ### Checklist n/a --- .../connectors/action-types/openai.asciidoc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/docs/management/connectors/action-types/openai.asciidoc b/docs/management/connectors/action-types/openai.asciidoc index 49033b92cd740..968f5a1e30f3a 100644 --- a/docs/management/connectors/action-types/openai.asciidoc +++ b/docs/management/connectors/action-types/openai.asciidoc @@ -4,8 +4,8 @@ OpenAI ++++ :frontmatter-description: Add a connector that can send requests to an OpenAI provider. -:frontmatter-tags-products: [kibana] -:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] :frontmatter-tags-user-goals: [configure] @@ -21,6 +21,17 @@ You can create connectors in *{stack-manage-app} > {connectors-ui}*. For exampl image::management/connectors/images/gen-ai-connector.png[OpenAI connector] // NOTE: This is an autogenerated screenshot. Do not edit it directly. +[IMPORTANT] +==== +Elastic provides no official support for connecting to the Azure OpenAI service through a proxy. +However if you must use a proxy, +ensure that the proxy supports streaming and is SSE-compatible. +Elastic will only parse streamed responses. + +To validate that your connectivity problems are caused by using a proxy, +you can attempt to set up the connector and access the Azure OpenAI service without using a proxy. +==== + [float] [[openai-connector-configuration]] ==== Connector configuration @@ -46,7 +57,7 @@ image::management/connectors/images/gen-ai-params-test.png[OpenAI params test] The OpenAI actions have the following configuration properties. -Body:: A JSON payload sent to the OpenAI API URL. For example: +Body:: A JSON payload sent to the OpenAI API URL. For example: + [source,text] -- From d8947189680a1c50dd3595af080bd770d49be0be Mon Sep 17 00:00:00 2001 From: Brad White Date: Tue, 9 Jul 2024 12:30:12 -0600 Subject: [PATCH 15/82] [FIPS / Build] Move OpenSSL compile to builder step (#187814) ## Summary This moves the OpenSSL compilation and it's dependencies into the builder step for the FIPS Docker image. This reduces (582MB to 445MB) the FIPS image to ~15MB larger than the Kibana image ### Testing 1. `docker pull docker.elastic.co/kibana-ci/kibana-ubi-fips:8.16.0-SNAPSHOT-5d7290bf1c8af263aedd6d617279ff15cef7de03` 2. `docker run --rm -it -p 5601:5601/tcp docker.elastic.co/kibana-ci/kibana-ubi-fips:8.16.0-SNAPSHOT-5d7290bf1c8af263aedd6d617279ff15cef7de03` 3. `docker exec -it bash` 4. `node/glibc-217/bin/node --enable-fips --openssl-config="$HOME/config/nodejs.cnf" -p 'crypto.getFips()'` 5. Output should be `1` indicating FIPS is working successfully. --- .../templates/base/Dockerfile | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index ecb93cfd50792..a8daba08d37b4 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -12,7 +12,7 @@ FROM {{{baseImageName}}} AS builder {{#ubi}} -RUN microdnf install -y findutils tar gzip +RUN microdnf install -y findutils tar gzip{{#fips}} perl make gcc{{/fips}} {{/ubi}} {{#ubuntu}} RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y curl @@ -37,6 +37,30 @@ WORKDIR /usr/share/kibana RUN tar \ --strip-components=1 \ -zxf /tmp/kibana.tar.gz + +{{#fips}} +# OpenSSL requires specific versions that are FIPS certified. +# +# See: +# https://github.com/openssl/openssl/blob/openssl-3.0/README-FIPS.md +# https://www.openssl.org/docs/man3.0/man7/fips_module.html +RUN set -e ; \ + OPENSSL_VERSION='3.0.8'; \ + OPENSSL_PATH=/usr/share/kibana/openssl ; \ + mkdir "${OPENSSL_PATH}"; \ + curl --retry 8 -S -L -O "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" ; \ + curl --retry 8 -S -L -O "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz.sha256" ; \ + echo "$(cat openssl-${OPENSSL_VERSION}.tar.gz.sha256) openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c ; \ + tar -zxf "openssl-${OPENSSL_VERSION}.tar.gz" ; \ + rm -rf openssl-${OPENSSL_VERSION}.tar* ; \ + cd "/usr/share/kibana/openssl-${OPENSSL_VERSION}" ; \ + ./Configure --prefix="${OPENSSL_PATH}" --openssldir="${OPENSSL_PATH}/ssl" --libdir="${OPENSSL_PATH}/lib" enable-fips; \ + make -j $(nproc) > /dev/null ; \ + make install > /dev/null ; \ + rm -rf "/usr/share/kibana/openssl-${OPENSSL_VERSION}" ; \ + chown -R 1000:0 "${OPENSSL_PATH}"; + +{{/fips}} # Ensure that group permissions are the same as user permissions. # This will help when relying on GID-0 to run Kibana, rather than UID-1000. # OpenShift does this, for example. @@ -90,7 +114,7 @@ EXPOSE 5601 RUN for iter in {1..10}; do \ microdnf update --setopt=tsflags=nodocs -y && \ microdnf install --setopt=tsflags=nodocs -y \ - fontconfig freetype shadow-utils nss findutils {{#fips}}perl make gcc tar {{/fips}}&& \ + fontconfig freetype shadow-utils nss findutils && \ microdnf clean all && exit_code=0 && break || exit_code=$? && echo "microdnf error: retry $iter in 10s" && \ sleep 10; \ done; \ @@ -127,30 +151,6 @@ RUN fc-cache -v WORKDIR /usr/share/kibana {{#fips}} -# OpenSSL requires specific versions that are FIPS certified. Further, the FIPS modules -# need to be compiled on the machine to pass its own self validation on startup. -# -# See: -# https://github.com/openssl/openssl/blob/openssl-3.0/README-FIPS.md -# https://www.openssl.org/docs/man3.0/man7/fips_module.html - -# Ideally we would handle this in the builder step, but OpenSSL requires linking of many submodules. -RUN set -e ; \ - OPENSSL_VERSION='3.0.8'; \ - OPENSSL_PATH=/usr/share/kibana/openssl ; \ - mkdir "${OPENSSL_PATH}"; \ - curl --retry 8 -S -L -O "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz" ; \ - curl --retry 8 -S -L -O "https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz.sha256" ; \ - echo "$(cat openssl-${OPENSSL_VERSION}.tar.gz.sha256) openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c ; \ - tar -zxf "openssl-${OPENSSL_VERSION}.tar.gz" ; \ - rm -rf openssl-${OPENSSL_VERSION}.tar* ; \ - cd "/usr/share/kibana/openssl-${OPENSSL_VERSION}" ; \ - ./Configure --prefix="${OPENSSL_PATH}" --openssldir="${OPENSSL_PATH}/ssl" --libdir="${OPENSSL_PATH}/lib" enable-fips; \ - make -j $(nproc) > /dev/null ; \ - make install > /dev/null ; \ - rm -rf "/usr/share/kibana/openssl-${OPENSSL_VERSION}" ; \ - chown -R 1000:0 "${OPENSSL_PATH}"; - # Enable FIPS for Kibana only. In the future we can override OS wide with ENV OPENSSL_CONF RUN /usr/bin/echo -e '\n--enable-fips' >> config/node.options RUN /usr/bin/echo '--openssl-config=/usr/share/kibana/config/nodejs.cnf' >> config/node.options From 799800d26d2edfaef5e424813d9f597774a95c25 Mon Sep 17 00:00:00 2001 From: Saarika Bhasi <55930906+saarikabhasi@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:41:27 -0400 Subject: [PATCH 16/82] [Index management] Enable semantic_text feature (#187792) This PR enables semantic_text feature by default. How to test: 1. Spin up Serverless or stack instance locally 2. Navigate to index management-> index overview page-> index mappings 3. Click add new field 4. Ensure semantic_text field type is shown in Field type form by default Tested in ESS and Serverless locally ### Checklist Delete any items that are not applicable to this PR. - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../__jest__/client_integration/helpers/setup_environment.tsx | 2 +- .../index_details_page/index_details_page.test.tsx | 1 - x-pack/plugins/index_management/public/plugin.ts | 2 +- x-pack/plugins/index_management/server/config.ts | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx index 19490125e8840..633ed96ec8225 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx @@ -86,7 +86,7 @@ const appDependencies = { editableIndexSettings: 'all', enableMappingsSourceFieldSection: true, enableTogglingDataRetention: true, - enableSemanticText: false, + enableSemanticText: true, }, overlays: { openConfirm: jest.fn(), diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index c79efbbf53f53..9998dbf0e9874 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -671,7 +671,6 @@ describe('', () => { testBed = await setup({ httpSetup, dependencies: { - config: { enableSemanticText: true }, docLinks: { links: { ml: '', diff --git a/x-pack/plugins/index_management/public/plugin.ts b/x-pack/plugins/index_management/public/plugin.ts index f6ae66d8e52bc..136174dfac165 100644 --- a/x-pack/plugins/index_management/public/plugin.ts +++ b/x-pack/plugins/index_management/public/plugin.ts @@ -74,7 +74,7 @@ export class IndexMgmtUIPlugin editableIndexSettings: editableIndexSettings ?? 'all', enableMappingsSourceFieldSection: enableMappingsSourceFieldSection ?? true, enableTogglingDataRetention: enableTogglingDataRetention ?? true, - enableSemanticText: enableSemanticText ?? false, + enableSemanticText: enableSemanticText ?? true, }; } diff --git a/x-pack/plugins/index_management/server/config.ts b/x-pack/plugins/index_management/server/config.ts index 8625274e31d2a..f2d1808a44286 100644 --- a/x-pack/plugins/index_management/server/config.ts +++ b/x-pack/plugins/index_management/server/config.ts @@ -36,7 +36,7 @@ const schemaLatest = schema.object( // deprecated as unused after index details page has been implemented enableIndexDetailsPage: schema.boolean({ defaultValue: false }), // deprecate as unused after semantic text is enabled everywhere - enableSemanticText: schema.boolean({ defaultValue: false }), + enableSemanticText: schema.boolean({ defaultValue: true }), }), enableIndexStats: offeringBasedSchema({ // Index stats information is disabled in serverless; refer to the serverless.yml file as the source of truth From 4b8ba30dd429131a280ec7df9bf21a02480063a4 Mon Sep 17 00:00:00 2001 From: Lola Date: Tue, 9 Jul 2024 15:21:19 -0400 Subject: [PATCH 17/82] [Cloud Security] fix vulnerability dashboard ftr flaky test (#187790) ## Summary Summarize your PR. If it involves visual changes include a screenshot or gif. Fix Flaky Vulnerability Dashboard Test --- .../routes/vulnerabilities_dashboard.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts b/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts index aa2887a04da21..8f2a2fa2693d4 100644 --- a/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts +++ b/x-pack/test/cloud_security_posture_api/routes/vulnerabilities_dashboard.ts @@ -186,16 +186,13 @@ export default function ({ getService }: FtrProviderContext) { describe('Vulnerability Dashboard API', async () => { beforeEach(async () => { + await index.removeFindings(); + await index.removeScores(); await waitForPluginInitialized(); await index.addScores(scoresVulnerabilitiesMock); await index.addFindings(vulnerabilitiesLatestMock); }); - afterEach(async () => { - await index.removeFindings(); - await index.removeScores(); - }); - it('responds with a 200 status code and matching data mock', async () => { const { body } = await supertest .get(`/internal/cloud_security_posture/vulnerabilities_dashboard`) From 45b0c251913b6978195291a5d317972fe8c83ddb Mon Sep 17 00:00:00 2001 From: Rickyanto Ang Date: Tue, 9 Jul 2024 13:01:00 -0700 Subject: [PATCH 18/82] [Cloud Security]Fix for flaky FTRs caused by duplicate names (#187784) ## Summary This PR is to address the following flaky FTRs https://github.com/elastic/kibana/issues/186302 https://github.com/elastic/kibana/issues/186315 https://github.com/elastic/kibana/issues/186387 https://github.com/elastic/kibana/issues/186389 The flakiness are being caused by having duplicate names for the integration when adding them. We tried adding wait before clicking on the Save button however that doesn't seem to work as it starts failing in the flaky test runner This PR gives the Integration a specific name (not relying on auto naming) --- .../add_cis_integration_form_page.ts | 8 ++++ .../cnvm/cis_integration_cnvm.ts | 11 ++++-- .../cspm/cis_integration_aws.ts | 36 ++++++++--------- .../cspm/cis_integration_azure.ts | 24 ++++++------ .../cspm/cis_integration_gcp.ts | 26 ++++++------- .../kspm/cis_integration_eks.ts | 39 ++++++++++--------- .../kspm/cis_integration_k8s.ts | 2 +- .../pages/findings.ts | 12 +++--- 8 files changed, 86 insertions(+), 72 deletions(-) diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts index 1b2eda553dba2..bf555e7fe72e4 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { v4 as uuidv4 } from 'uuid'; import type { FtrProviderContext } from '../ftr_provider_context'; export function AddCisIntegrationFormPageProvider({ @@ -282,6 +283,12 @@ export function AddCisIntegrationFormPageProvider({ return await testSubjects.find(`button-replace-${secretField}`); }; + const inputUniqueIntegrationName = async () => { + const flyout = await testSubjects.find('createPackagePolicy_page'); + const nameField = await flyout.findAllByCssSelector('input[id="name"]'); + await nameField[0].type(uuidv4()); + }; + return { cisAzure, cisAws, @@ -316,5 +323,6 @@ export function AddCisIntegrationFormPageProvider({ isOptionChecked, checkIntegrationPliAuthBlockExists, getReplaceSecretButton, + inputUniqueIntegrationName, }; } diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts index 1b57e9a65d41e..a91d35ea668be 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts @@ -23,12 +23,13 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.navigateToAddIntegrationCspmPage(); }); - // FLAKY: https://github.com/elastic/kibana/issues/186302 - describe.skip('CNVM AWS', () => { + describe('CNVM AWS', () => { it('Hyperlink on PostInstallation Modal should have the correct URL', async () => { await cisIntegration.navigateToAddIntegrationCnvmPage(); + await cisIntegration.inputUniqueIntegrationName(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( (await cisIntegration.getUrlOnPostInstallModal()) === 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html' @@ -50,8 +51,10 @@ export default function (providerContext: FtrProviderContext) { it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => { await cisIntegration.navigateToAddIntegrationCnvmPage(); + await cisIntegration.inputUniqueIntegrationName(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( ( await cisIntegration.clickLaunchAndGetCurrentUrl( diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts index 5523e05120912..10c2f0560237c 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_aws.ts @@ -48,11 +48,11 @@ export default function (providerContext: FtrProviderContext) { it('Hyperlink on PostInstallation Modal should have the correct URL', async () => { await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegrationAws.getPostInstallCloudFormationModal()) !== undefined).to.be( true ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( (await cisIntegration.getUrlOnPostInstallModal()) === 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html' @@ -73,7 +73,7 @@ export default function (providerContext: FtrProviderContext) { it('Clicking on Launch CloudFormation on post intall modal should lead user to Cloud Formation page', async () => { await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( ( await cisIntegration.clickLaunchAndGetCurrentUrl( @@ -92,7 +92,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(ROLE_ARN_TEST_ID, roleArn); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect((await cisIntegration.getFieldValueInEditPage(ROLE_ARN_TEST_ID)) === roleArn).to.be( @@ -109,7 +109,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR); await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'direct_access_keys'); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(DIRECT_ACCESS_KEY_ID_TEST_ID, directAccessKeyId); await cisIntegration.fillInTextField( @@ -117,7 +117,7 @@ export default function (providerContext: FtrProviderContext) { directAccessSecretKey ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect( @@ -137,7 +137,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR); await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'temporary_keys'); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(TEMP_ACCESS_KEY_ID_TEST_ID, accessKeyId); await cisIntegration.fillInTextField( @@ -149,7 +149,7 @@ export default function (providerContext: FtrProviderContext) { tempAccessSessionToken ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); @@ -172,7 +172,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR); await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'shared_credentials'); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(SHARED_CREDENTIALS_FILE_TEST_ID, sharedCredentialFile); await cisIntegration.fillInTextField( @@ -180,7 +180,7 @@ export default function (providerContext: FtrProviderContext) { sharedCredentialProfileName ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); @@ -200,7 +200,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(CIS_AWS_OPTION_TEST_ID); await cisIntegration.clickOptionButton(AWS_SINGLE_ACCOUNT_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( (await cisIntegration.getUrlOnPostInstallModal()) === 'https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-whatis-howdoesitwork.html' @@ -216,7 +216,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(ROLE_ARN_TEST_ID, roleArn); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect((await cisIntegration.getFieldValueInEditPage(ROLE_ARN_TEST_ID)) === roleArn).to.be( @@ -234,7 +234,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR); await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'direct_access_keys'); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(DIRECT_ACCESS_KEY_ID_TEST_ID, directAccessKeyId); await cisIntegration.fillInTextField( @@ -242,7 +242,7 @@ export default function (providerContext: FtrProviderContext) { directAccessSecretKey ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect( @@ -263,7 +263,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR); await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'temporary_keys'); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(TEMP_ACCESS_KEY_ID_TEST_ID, accessKeyId); await cisIntegration.fillInTextField( @@ -275,7 +275,7 @@ export default function (providerContext: FtrProviderContext) { tempAccessSessionToken ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); @@ -299,7 +299,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.clickOptionButton(AWS_CREDENTIAL_SELECTOR); await cisIntegration.selectValue(AWS_CREDENTIAL_SELECTOR, 'shared_credentials'); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(AWS_MANUAL_TEST_ID); await cisIntegration.fillInTextField(SHARED_CREDENTIALS_FILE_TEST_ID, sharedCredentialFile); await cisIntegration.fillInTextField( @@ -307,7 +307,7 @@ export default function (providerContext: FtrProviderContext) { sharedCredentialProfileName ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts index 99cc57905d46e..4415ec5a34160 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_azure.ts @@ -53,7 +53,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID); await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.ARM_TEMPLATE); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegrationAzure.getPostInstallArmTemplateModal()) !== undefined).to.be( true ); @@ -70,7 +70,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL); await cisIntegration.selectValue(AZURE_CREDENTIAL_SELECTOR, 'managed_identity'); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); }); }); @@ -83,7 +83,7 @@ export default function (providerContext: FtrProviderContext) { AZURE_CREDENTIAL_SELECTOR, 'service_principal_with_client_secret' ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.fillInTextField( CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID, clientId @@ -97,7 +97,7 @@ export default function (providerContext: FtrProviderContext) { clientSecret ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); @@ -123,7 +123,7 @@ export default function (providerContext: FtrProviderContext) { AZURE_CREDENTIAL_SELECTOR, 'service_principal_with_client_certificate' ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.fillInTextField( CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID, clientId @@ -137,7 +137,7 @@ export default function (providerContext: FtrProviderContext) { clientCertificatePath ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); @@ -164,7 +164,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(CIS_AZURE_OPTION_TEST_ID); await cisIntegration.clickOptionButton(CIS_AZURE_SINGLE_SUB_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegrationAzure.getPostInstallArmTemplateModal()) !== undefined).to.be( true ); @@ -182,7 +182,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(CIS_AZURE_SETUP_FORMAT_TEST_SUBJECTS.MANUAL); await cisIntegration.selectValue(AZURE_CREDENTIAL_SELECTOR, 'managed_identity'); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); }); }); @@ -195,7 +195,7 @@ export default function (providerContext: FtrProviderContext) { AZURE_CREDENTIAL_SELECTOR, 'service_principal_with_client_secret' ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.fillInTextField( CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID, clientId @@ -209,7 +209,7 @@ export default function (providerContext: FtrProviderContext) { clientSecret ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); @@ -235,7 +235,7 @@ export default function (providerContext: FtrProviderContext) { AZURE_CREDENTIAL_SELECTOR, 'service_principal_with_client_certificate' ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.fillInTextField( CIS_AZURE_INPUT_FIELDS_TEST_SUBJECTS.CLIENT_ID, clientId @@ -249,7 +249,7 @@ export default function (providerContext: FtrProviderContext) { clientCertificatePath ); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts index 121bf7cc2e574..6ce0c8fed5749 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts @@ -63,7 +63,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(GCP_ORGANIZATION_TEST_ID); await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(true)) === true).to.be( true ); @@ -79,7 +79,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.fillInTextField('organization_id_test_id', organizationName); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( (await cisIntegrationGcp.isPostInstallGoogleCloudShellModal( true, @@ -102,7 +102,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(false)) === true).to.be( true ); @@ -111,7 +111,7 @@ export default function (providerContext: FtrProviderContext) { it('Hyperlink on PostInstallation Modal should have the correct URL', async () => { await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( (await cisIntegration.getUrlOnPostInstallModal()) === 'https://cloud.google.com/shell/docs' @@ -121,7 +121,7 @@ export default function (providerContext: FtrProviderContext) { it('Clicking on Launch CloudShell on post intall modal should lead user to CloudShell page', async () => { await cisIntegration.clickOptionButton(CIS_GCP_OPTION_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( ( await cisIntegration.clickLaunchAndGetCurrentUrl( @@ -143,7 +143,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.fillInTextField(PRJ_ID_TEST_ID, projectName); await cisIntegration.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect( @@ -167,7 +167,7 @@ export default function (providerContext: FtrProviderContext) { ); await cisIntegration.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect( @@ -183,7 +183,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(GCP_SINGLE_ACCOUNT_TEST_ID); await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(false)) === true).to.be( true ); @@ -195,7 +195,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.clickOptionButton(GCP_CLOUD_SHELL_TEST_ID); await cisIntegration.fillInTextField('project_id_test_id', projectName); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect( (await cisIntegrationGcp.isPostInstallGoogleCloudShellModal(false, '', projectName)) === true @@ -230,7 +230,7 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.fillInTextField(PRJ_ID_TEST_ID, projectName); await cisIntegration.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect( @@ -248,7 +248,7 @@ export default function (providerContext: FtrProviderContext) { ); await cisIntegration.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName); await cisIntegration.clickSaveIntegrationButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.navigateToIntegrationCspList(); expect( (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) === @@ -268,7 +268,7 @@ export default function (providerContext: FtrProviderContext) { ); await cisIntegration.fillInTextField(CREDENTIALS_JSON_TEST_ID, credentialJsonName); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect( @@ -286,7 +286,7 @@ export default function (providerContext: FtrProviderContext) { ); await cisIntegration.fillInTextField(CREDENTIALS_FILE_TEST_ID, credentialFileName); await cisIntegration.clickSaveIntegrationButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.navigateToIntegrationCspList(); expect( (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_FILE_TEST_ID)) === diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts index db567d335b0ff..f8d7736938f92 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_eks.ts @@ -35,14 +35,14 @@ export default function (providerContext: FtrProviderContext) { await cisIntegration.navigateToAddIntegrationKspmPage(); }); - // FLAKY: https://github.com/elastic/kibana/issues/186306 - describe.skip('KSPM EKS Assume Role', async () => { + describe('KSPM EKS Assume Role', async () => { it('KSPM EKS Assume Role workflow', async () => { const roleArn = 'RoleArnTestValue'; await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID); + await cisIntegration.inputUniqueIntegrationName(); await cisIntegration.fillInTextField(ROLE_ARN_TEST_ID, roleArn); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect((await cisIntegration.getFieldValueInEditPage(ROLE_ARN_TEST_ID)) === roleArn).to.be( @@ -51,22 +51,23 @@ export default function (providerContext: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/186315 - describe.skip('KSPM EKS Direct Access', async () => { + describe('KSPM EKS Direct Access', async () => { it('KSPM EKS Direct Access Workflow', async () => { const directAccessKeyId = 'directAccessKeyIdTest'; const directAccessSecretKey = 'directAccessSecretKeyTest'; await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(EKS_DIRECT_ACCESS_TEST_ID); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); + await cisIntegration.inputUniqueIntegrationName(); await cisIntegration.fillInTextField(DIRECT_ACCESS_KEY_ID_TEST_ID, directAccessKeyId); await cisIntegration.fillInTextField( DIRECT_ACCESS_SECRET_KEY_TEST_ID, directAccessSecretKey ); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); expect( @@ -77,16 +78,16 @@ export default function (providerContext: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/186389 - describe.skip('KSPM EKS Temporary Keys', () => { + describe('KSPM EKS Temporary Keys', () => { it('KSPM EKS Temporary Keys Workflow', async () => { const accessKeyId = 'accessKeyIdTest'; const accessKeySecretKey = 'accessKeySecretKeyTest'; const tempAccessSessionToken = 'tempAccessSessionTokenTest'; await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(EKS_TEMPORARY_KEYS_TEST_ID); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); + await cisIntegration.inputUniqueIntegrationName(); await cisIntegration.fillInTextField(TEMP_ACCESS_KEY_ID_TEST_ID, accessKeyId); await cisIntegration.fillInTextField( TEMP_ACCESS_KEY_SECRET_KEY_TEST_ID, @@ -96,8 +97,9 @@ export default function (providerContext: FtrProviderContext) { TEMP_ACCESS_SESSION_TOKEN_TEST_ID, tempAccessSessionToken ); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); @@ -112,22 +114,23 @@ export default function (providerContext: FtrProviderContext) { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/186387 - describe.skip('KSPM EKS Shared Credentials', () => { + describe('KSPM EKS Shared Credentials', () => { it('KSPM EKS Shared Credentials Workflow', async () => { const sharedCredentialFile = 'sharedCredentialFileTest'; const sharedCredentialProfileName = 'sharedCredentialProfileNameTest'; await cisIntegration.clickOptionButton(CIS_EKS_OPTION_TEST_ID); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickOptionButton(EKS_SHARED_CREDENTIAL_TEST_ID); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); + await cisIntegration.inputUniqueIntegrationName(); await cisIntegration.fillInTextField(SHARED_CREDENTIALS_FILE_TEST_ID, sharedCredentialFile); await cisIntegration.fillInTextField( SHARED_CREDETIALS_PROFILE_NAME_TEST_ID, sharedCredentialProfileName ); + await pageObjects.header.waitUntilLoadingHasFinished(); await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts index ae2ede4046d11..872c786e3ce28 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/kspm/cis_integration_k8s.ts @@ -25,7 +25,7 @@ export default function (providerContext: FtrProviderContext) { describe('KSPM K8S', () => { it('KSPM K8S Workflow', async () => { await cisIntegration.clickSaveButton(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); await cisIntegration.clickFirstElementOnIntegrationTable(); diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings.ts b/x-pack/test/cloud_security_posture_functional/pages/findings.ts index 16e63fac3491e..3ea3475b85763 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings.ts @@ -139,7 +139,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'Findings table to be loaded', async () => (await latestFindingsTable.getRowsCount()) === data.length ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); }); afterEach(async () => { @@ -172,7 +172,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { for (const [columnName, dir, sortingMethod] of testCases) { await latestFindingsTable.toggleColumnSort(columnName, dir); /* This sleep or delay is added to allow some time for the column to settle down before we get the value and to prevent the test from getting the wrong value*/ - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); const values = (await latestFindingsTable.getColumnValues(columnName)).filter(Boolean); expect(values).to.not.be.empty(); const sorted = values @@ -297,7 +297,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'Findings table to be loaded', async () => (await latestFindingsTable.getRowsCount()) === data.length + 1 ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await distributionBar.filterBy('passed'); @@ -328,7 +328,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'Findings table to be loaded', async () => (await latestFindingsTable.getRowsCount()) === data.length ); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); await distributionBar.filterBy('passed'); @@ -346,7 +346,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await cspSecurity.logout(); await cspSecurity.login('csp_read_user'); await findings.navigateToLatestFindingsPage(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect(await latestFindingsTable.getRowsCount()).to.be.greaterThan(0); }); @@ -356,7 +356,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await findings.navigateToLatestFindingsPage(); - pageObjects.header.waitUntilLoadingHasFinished(); + await pageObjects.header.waitUntilLoadingHasFinished(); expect(await findings.getUnprivilegedPrompt()); }); }); From 7b29dccc088f709667bd976f523ef64aec841ea2 Mon Sep 17 00:00:00 2001 From: Ido Cohen <90558359+CohenIdo@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:35:15 +0300 Subject: [PATCH 19/82] [Cloud Security] Metering integration tests --- package.json | 1 + .../defend_for_containers_metering.ts | 3 +- .../services/usage_reporting_service.ts | 4 +- .../server/config.ts | 8 +- .../server/plugin.ts | 2 +- .../apis/cloud_security_posture/helper.ts | 70 ++++ .../security/cloud_security_posture/index.ts | 1 + .../cloud_security_metering.ts | 363 ++++++++++++++++++ .../serverless_metering/mock_data.ts | 110 ++++++ .../serverless_metering/mock_usage_server.ts | 62 +++ .../test_suites/security/config.ts | 2 + yarn.lock | 10 +- 12 files changed, 631 insertions(+), 5 deletions(-) create mode 100644 x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts create mode 100644 x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_usage_server.ts diff --git a/package.json b/package.json index 1370f8012f3f3..845c3432a2dec 100644 --- a/package.json +++ b/package.json @@ -948,6 +948,7 @@ "@mapbox/mapbox-gl-rtl-text": "0.2.3", "@mapbox/mapbox-gl-supported": "2.0.1", "@mapbox/vector-tile": "1.3.1", + "@mswjs/http-middleware": "^0.10.1", "@opentelemetry/api": "^1.1.0", "@opentelemetry/api-metrics": "^0.31.0", "@opentelemetry/exporter-metrics-otlp-grpc": "^0.34.0", diff --git a/x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts b/x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts index 949eb709ec3a5..61240df94f9b2 100644 --- a/x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts +++ b/x-pack/plugins/security_solution_serverless/server/cloud_security/defend_for_containers_metering.ts @@ -76,7 +76,8 @@ export const getUsageRecords = async ( { range: { 'event.ingested': { - gt: searchFrom.toISOString(), + // gt: searchFrom.toISOString(), Tech debt: https://github.com/elastic/security-team/issues/9895 + gte: `now-30m`, }, }, }, diff --git a/x-pack/plugins/security_solution_serverless/server/common/services/usage_reporting_service.ts b/x-pack/plugins/security_solution_serverless/server/common/services/usage_reporting_service.ts index 994cbfe273304..0e47b982e692e 100644 --- a/x-pack/plugins/security_solution_serverless/server/common/services/usage_reporting_service.ts +++ b/x-pack/plugins/security_solution_serverless/server/common/services/usage_reporting_service.ts @@ -19,11 +19,13 @@ export class UsageReportingService { records: UsageRecord[], url = USAGE_SERVICE_USAGE_URL ): Promise { + const isHttps = url.includes('https'); + return fetch(url, { method: 'post', body: JSON.stringify(records), headers: { 'Content-Type': 'application/json' }, - agent, + agent: isHttps ? agent : undefined, // Conditionally add agent if URL is HTTPS for supporting integration tests. }); } } diff --git a/x-pack/plugins/security_solution_serverless/server/config.ts b/x-pack/plugins/security_solution_serverless/server/config.ts index 60336c6f6e5f3..4b9700aaca6b2 100644 --- a/x-pack/plugins/security_solution_serverless/server/config.ts +++ b/x-pack/plugins/security_solution_serverless/server/config.ts @@ -17,11 +17,17 @@ export const configSchema = schema.object({ enabled: schema.boolean({ defaultValue: false }), productTypes, /** - * Usage Reporting: the interval between runs of the task + * Usage Reporting: the interval between runs of the endpoint task */ usageReportingTaskInterval: schema.string({ defaultValue: '5m' }), + /** + * Usage Reporting: the interval between runs of the cloud security task + */ + + cloudSecurityUsageReportingTaskInterval: schema.string({ defaultValue: '30m' }), + /** * Usage Reporting: timeout value for how long the task should run. */ diff --git a/x-pack/plugins/security_solution_serverless/server/plugin.ts b/x-pack/plugins/security_solution_serverless/server/plugin.ts index d63152f169490..f81a8e013e290 100644 --- a/x-pack/plugins/security_solution_serverless/server/plugin.ts +++ b/x-pack/plugins/security_solution_serverless/server/plugin.ts @@ -113,7 +113,7 @@ export class SecuritySolutionServerlessPlugin this.cloudSecurityUsageReportingTask ?.start({ taskManager: pluginsSetup.taskManager, - interval: cloudSecurityMetringTaskProperties.interval, + interval: this.config.cloudSecurityUsageReportingTaskInterval, }) .catch(() => {}); diff --git a/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts b/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts index 00bcffd553af1..77dd859bed4d9 100644 --- a/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts +++ b/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts @@ -145,6 +145,76 @@ export async function createPackagePolicy( return postPackageResponse.item; } +export async function createCloudDefendPackagePolicy( + supertest: SuperTestAgent, + agentPolicyId: string, + roleAuthc?: RoleCredentials, + internalRequestHeader?: { 'x-elastic-internal-origin': string; 'kbn-xsrf': string } +) { + const version = '1.2.5'; + const installationPayload = { + policy_id: agentPolicyId, + package: { + name: 'cloud_defend', + version, + }, + name: 'cloud_defend-1', + description: '', + namespace: 'default', + inputs: { + 'cloud_defend-cloud_defend/control': { + enabled: true, + vars: { + configuration: + 'process:\n selectors:\n - name: allProcesses\n operation: [fork, exec]\n responses:\n - match: [allProcesses]\n actions: [log]\nfile:\n selectors:\n - name: executableChanges\n operation: [createExecutable, modifyExecutable]\n responses:\n - match: [executableChanges]\n actions: [alert]\n', + }, + streams: { + 'cloud_defend.alerts': { + enabled: true, + }, + 'cloud_defend.file': { + enabled: true, + }, + 'cloud_defend.heartbeat': { + enabled: true, + vars: { + period: '30m', + }, + }, + 'cloud_defend.metrics': { + enabled: true, + vars: { + period: '24h', + }, + }, + 'cloud_defend.process': { + enabled: true, + }, + }, + }, + }, + force: true, + }; + + const { body: postPackageResponse } = + roleAuthc && internalRequestHeader + ? await supertest + .post(`/api/fleet/package_policies`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set(internalRequestHeader) + .set(roleAuthc.apiKeyHeader) + .send(installationPayload) + .expect(200) + : await supertest + .post(`/api/fleet/package_policies`) + .set(ELASTIC_HTTP_VERSION_HEADER, '2023-10-31') + .set('kbn-xsrf', 'xxxx') + .send(installationPayload) + .expect(200); + + return postPackageResponse.item; +} + export const createUser = async (security: SecurityService, userName: string, roleName: string) => { await security.user.create(userName, { password: 'changeme', diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts index 460f4ac43bb43..f3bc56e16a5ae 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts @@ -17,6 +17,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./benchmark/v2')); loadTestFile(require.resolve('./find_csp_benchmark_rule')); loadTestFile(require.resolve('./telemetry')); + loadTestFile(require.resolve('./serverless_metering/cloud_security_metering')); // TODO: migrate status_unprivileged tests from stateful, if it feasible in serverless with the new security model // loadTestFile(require.resolve('./status/status_unprivileged')); diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts new file mode 100644 index 0000000000000..78f7ae579d318 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/cloud_security_metering.ts @@ -0,0 +1,363 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { + LATEST_FINDINGS_INDEX_DEFAULT_NS, + LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, +} from '@kbn/cloud-security-posture-plugin/common/constants'; +import * as http from 'http'; +import { RoleCredentials } from '../../../../../shared/services'; +import { getMockFindings, getMockDefendForContainersHeartbeats } from './mock_data'; // eslint-disable-line @kbn/imports/no_boundary_crossing +import type { FtrProviderContext } from '../../../../ftr_provider_context'; +import { + deleteIndex, + addIndex, + createPackagePolicy, + createCloudDefendPackagePolicy, +} from '../../../../../../test/api_integration/apis/cloud_security_posture/helper'; // eslint-disable-line @kbn/imports/no_boundary_crossing +import { UsageRecord, getInterceptedRequestPayload, setupMockServer } from './mock_usage_server'; // eslint-disable-line @kbn/imports/no_boundary_crossing + +const CLOUD_DEFEND_HEARTBEAT_INDEX_DEFAULT_NS = 'metrics-cloud_defend.heartbeat-default'; + +export default function (providerContext: FtrProviderContext) { + const mockUsageApiApp = setupMockServer(); + const { getService } = providerContext; + const retry = getService('retry'); + const kibanaServer = getService('kibanaServer'); + const esArchiver = getService('esArchiver'); + const es = getService('es'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + + /* + This test aims to intercept the usage API request sent by the metering background task manager. + The task manager is running by default in security serverless project in the background and sending usage API requests to the usage API. + This test mocks the usage API server and intercepts the usage API request sent by the metering background task manager. + */ + describe('Intercept the usage API request sent by the metering background task manager', function () { + this.tags(['skipMKI']); + + let mockUsageApiServer: http.Server; + let agentPolicyId: string; + let roleAuthc: RoleCredentials; + let internalRequestHeader: { 'x-elastic-internal-origin': string; 'kbn-xsrf': string }; + before(async () => { + mockUsageApiServer = mockUsageApiApp.listen(8081); // Start the usage api mock server on port 8081 + }); + + beforeEach(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalRequestHeader = svlCommonApi.getInternalRequestHeader(); + + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + + const { body: agentPolicyResponse } = await supertestWithoutAuth + .post(`/api/fleet/agent_policies`) + .set(internalRequestHeader) + .set(roleAuthc.apiKeyHeader) + .send({ + name: 'Test policy', + namespace: 'default', + }); + + agentPolicyId = agentPolicyResponse.item.id; + + await deleteIndex(es, [ + LATEST_FINDINGS_INDEX_DEFAULT_NS, + LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, + CLOUD_DEFEND_HEARTBEAT_INDEX_DEFAULT_NS, + ]); + }); + + afterEach(async () => { + await deleteIndex(es, [ + LATEST_FINDINGS_INDEX_DEFAULT_NS, + LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, + ]); + await kibanaServer.savedObjects.cleanStandardList(); + await esArchiver.unload('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); + await deleteIndex(es, [ + LATEST_FINDINGS_INDEX_DEFAULT_NS, + LATEST_VULNERABILITIES_INDEX_DEFAULT_NS, + CLOUD_DEFEND_HEARTBEAT_INDEX_DEFAULT_NS, + ]); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + mockUsageApiServer.close(); + }); + + it('Should intercept usage API request for CSPM', async () => { + await createPackagePolicy( + supertestWithoutAuth, + agentPolicyId, + 'cspm', + 'cloudbeat/cis_aws', + 'aws', + 'cspm', + 'CSPM-1', + roleAuthc, + internalRequestHeader + ); + const billableFindings = getMockFindings({ + postureType: 'cspm', + isBillableAsset: true, + numberOfFindings: 5, + }); + + const notBillableFindings = getMockFindings({ + postureType: 'cspm', + isBillableAsset: false, + numberOfFindings: 10, + }); + + await addIndex( + es, + [...billableFindings, ...notBillableFindings], + LATEST_FINDINGS_INDEX_DEFAULT_NS + ); + + let interceptedRequestBody: UsageRecord[] = []; + await retry.try(async () => { + interceptedRequestBody = getInterceptedRequestPayload(); + expect(interceptedRequestBody.length).to.greaterThan(0); + if (interceptedRequestBody.length > 0) { + const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); + expect(usageSubTypes).to.contain('cspm'); + } + }); + + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); + expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); + }); + + it('Should intercept usage API request for KSPM', async () => { + await createPackagePolicy( + supertestWithoutAuth, + agentPolicyId, + 'kspm', + 'cloudbeat/cis_k8s', + 'vanilla', + 'kspm', + 'KSPM-1', + roleAuthc, + internalRequestHeader + ); + const billableFindings = getMockFindings({ + postureType: 'kspm', + isBillableAsset: true, + numberOfFindings: 3, + }); + + const notBillableFindings = getMockFindings({ + postureType: 'kspm', + isBillableAsset: false, + numberOfFindings: 11, + }); + + await addIndex( + es, + [...billableFindings, ...notBillableFindings], + LATEST_FINDINGS_INDEX_DEFAULT_NS + ); + + let interceptedRequestBody: UsageRecord[] = []; + + await retry.try(async () => { + interceptedRequestBody = getInterceptedRequestPayload(); + expect(interceptedRequestBody.length).to.greaterThan(0); + if (interceptedRequestBody.length > 0) { + const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); + expect(usageSubTypes).to.contain('kspm'); + } + }); + + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); + expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); + }); + + it('Should intercept usage API request for CNVM', async () => { + await createPackagePolicy( + supertestWithoutAuth, + agentPolicyId, + 'vuln_mgmt', + 'cloudbeat/vuln_mgmt_aws', + 'aws', + 'vuln_mgmt', + 'CNVM-1', + roleAuthc, + internalRequestHeader + ); + + const billableFindings = getMockFindings({ + postureType: 'cnvm', + numberOfFindings: 2, + }); + + await addIndex(es, billableFindings, LATEST_VULNERABILITIES_INDEX_DEFAULT_NS); + + let interceptedRequestBody: UsageRecord[] = []; + + await retry.try(async () => { + interceptedRequestBody = getInterceptedRequestPayload(); + expect(interceptedRequestBody.length).to.greaterThan(0); + if (interceptedRequestBody.length > 0) { + const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); + expect(usageSubTypes).to.contain('cnvm'); + } + }); + + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); + expect(interceptedRequestBody[0].usage.quantity).to.be(billableFindings.length); + }); + + it('Should intercept usage API request for Defend for Containers', async () => { + await createCloudDefendPackagePolicy( + supertestWithoutAuth, + agentPolicyId, + roleAuthc, + internalRequestHeader + ); + + const blockActionEnabledHeartbeats = getMockDefendForContainersHeartbeats({ + isBlockActionEnables: true, + numberOfHearbeats: 2, + }); + + const blockActionDisabledHeartbeats = getMockDefendForContainersHeartbeats({ + isBlockActionEnables: false, + numberOfHearbeats: 2, + }); + await addIndex( + es, + [...blockActionEnabledHeartbeats, ...blockActionDisabledHeartbeats], + CLOUD_DEFEND_HEARTBEAT_INDEX_DEFAULT_NS + ); + + let interceptedRequestBody: UsageRecord[] = []; + + await retry.try(async () => { + interceptedRequestBody = getInterceptedRequestPayload(); + expect(interceptedRequestBody.length).to.greaterThan(0); + if (interceptedRequestBody.length > 0) { + const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); + expect(usageSubTypes).to.contain('cloud_defend'); + } + }); + + expect(interceptedRequestBody.length).to.be(blockActionEnabledHeartbeats.length); + expect(interceptedRequestBody[0].usage.type).to.be('cloud_security'); + }); + + it('Should intercept usage API request with all integrations usage records', async () => { + // Create one package policy - it takes care forCSPM, KSMP and CNVM + await createPackagePolicy( + supertestWithoutAuth, + agentPolicyId, + 'cspm', + 'cloudbeat/cis_aws', + 'aws', + 'cspm', + 'CSPM-1', + roleAuthc, + internalRequestHeader + ); + + // Create Defend for Containers package policy + await createCloudDefendPackagePolicy( + supertestWithoutAuth, + agentPolicyId, + roleAuthc, + internalRequestHeader + ); + const billableFindingsCSPM = getMockFindings({ + postureType: 'cspm', + isBillableAsset: true, + numberOfFindings: 5, + }); + + const notBillableFindingsCSPM = getMockFindings({ + postureType: 'cspm', + isBillableAsset: false, + numberOfFindings: 10, + }); + + const billableFindingsKSPM = getMockFindings({ + postureType: 'kspm', + isBillableAsset: true, + numberOfFindings: 3, + }); + + const billableFindingsCNVM = getMockFindings({ + postureType: 'cnvm', + numberOfFindings: 2, + }); + + const notBillableFindingsKSPM = getMockFindings({ + postureType: 'kspm', + isBillableAsset: false, + numberOfFindings: 11, + }); + + const blockActionEnabledHeartbeats = getMockDefendForContainersHeartbeats({ + isBlockActionEnables: true, + numberOfHearbeats: 2, + }); + + const blockActionDisabledHeartbeats = getMockDefendForContainersHeartbeats({ + isBlockActionEnables: false, + numberOfHearbeats: 2, + }); + + await Promise.all([ + addIndex( + es, + [ + ...billableFindingsCSPM, + ...notBillableFindingsCSPM, + ...billableFindingsKSPM, + ...notBillableFindingsKSPM, + ], + LATEST_FINDINGS_INDEX_DEFAULT_NS + ), + addIndex(es, [...billableFindingsCNVM], LATEST_VULNERABILITIES_INDEX_DEFAULT_NS), + addIndex( + es, + [...blockActionEnabledHeartbeats, ...blockActionDisabledHeartbeats], + CLOUD_DEFEND_HEARTBEAT_INDEX_DEFAULT_NS + ), + ]); + + // Intercept and verify usage API request + let interceptedRequestBody: UsageRecord[] = []; + + await retry.try(async () => { + interceptedRequestBody = getInterceptedRequestPayload(); + const usageSubTypes = interceptedRequestBody.map((record) => record.usage.sub_type); + + expect(usageSubTypes).to.contain('cspm'); + expect(usageSubTypes).to.contain('kspm'); + expect(usageSubTypes).to.contain('cnvm'); + expect(usageSubTypes).to.contain('cloud_defend'); + }); + + const totalUsageQuantity = interceptedRequestBody.reduce( + (acc, record) => acc + record.usage.quantity, + 0 + ); + expect(totalUsageQuantity).to.be( + billableFindingsCSPM.length + + billableFindingsKSPM.length + + billableFindingsCNVM.length + + blockActionEnabledHeartbeats.length + ); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts new file mode 100644 index 0000000000000..2455c8e1762cc --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_data.ts @@ -0,0 +1,110 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import Chance from 'chance'; + +const chance = new Chance(); + +// see https://github.com/elastic/security-team/issues/8970 for billable asset definition +export const BILLABLE_ASSETS_CONFIG = { + cspm: [ + // 'aws-ebs', we can't include EBS volumes until https://github.com/elastic/security-team/issues/9283 is resolved + // 'aws-ec2', we can't include EC2 instances until https://github.com/elastic/security-team/issues/9254 is resolved + 'aws-s3', + 'aws-rds', + 'azure-disk', + 'azure-document-db-database-account', + 'azure-flexible-mysql-server-db', + 'azure-flexible-postgresql-server-db', + 'azure-mysql-server-db', + 'azure-postgresql-server-db', + 'azure-sql-server', + 'azure-storage-account', + 'azure-vm', + 'gcp-bigquery-dataset', + 'gcp-compute-disk', + 'gcp-compute-instance', + 'gcp-sqladmin-instance', + 'gcp-storage-bucket', + ], + kspm: ['Node', 'node'], +}; +export const getMockFindings = ({ + postureType, + isBillableAsset, + numberOfFindings, +}: { + postureType: string; + isBillableAsset?: boolean; + numberOfFindings: number; +}) => { + return Array.from({ length: numberOfFindings }, () => mockFiniding(postureType, isBillableAsset)); +}; + +const mockFiniding = (postureType: string, isBillableAsset?: boolean) => { + if (postureType === 'cspm') { + const randomAsset = isBillableAsset + ? chance.pickone(BILLABLE_ASSETS_CONFIG.cspm) + : 'not-billable-asset'; + return { + resource: { id: chance.guid(), sub_type: randomAsset }, + rule: { + benchmark: { + posture_type: 'cspm', + }, + }, + }; + } + if (postureType === 'kspm') { + const randomAsset = isBillableAsset + ? chance.pickone(BILLABLE_ASSETS_CONFIG.kspm) + : 'not-billable-asset'; + + return { + resource: { id: chance.guid(), sub_type: randomAsset }, + rule: { + benchmark: { + posture_type: 'kspm', + }, + }, + agent: { id: chance.guid() }, + }; + } + if (postureType === 'cnvm') { + return { + cloud: { + instance: { + id: chance.guid(), + }, + }, + }; + } +}; + +export const getMockDefendForContainersHeartbeats = ({ + isBlockActionEnables, + numberOfHearbeats, +}: { + isBlockActionEnables: boolean; + numberOfHearbeats: number; +}) => { + return Array.from({ length: numberOfHearbeats }, () => + mockDefendForContainersHeartbeats(isBlockActionEnables) + ); +}; +const mockDefendForContainersHeartbeats = (isBlockActionEnables: boolean) => { + return { + agent: { + id: chance.guid(), + }, + cloud_defend: { + block_action_enabled: isBlockActionEnables, + }, + event: { + ingested: new Date().toISOString(), + }, + }; +}; diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_usage_server.ts b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_usage_server.ts new file mode 100644 index 0000000000000..1ed5e8d7ff09e --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/serverless_metering/mock_usage_server.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createServer } from '@mswjs/http-middleware'; + +import { http, HttpResponse, StrictResponse } from 'msw'; + +export const setupMockServer = () => { + const server = createServer(usageAPIHandler); + + return server; +}; +export interface UsageRecord { + id: string; + usage_timestamp: string; + creation_timestamp: string; + usage: UsageMetrics; + source: UsageSource; +} + +export interface UsageMetrics { + type: string; + sub_type?: string; + quantity: number; + period_seconds?: number; + cause?: string; + metadata?: unknown; +} + +export interface UsageSource { + id: string; + instance_group_id: string; + metadata?: UsageSourceMetadata; +} + +export interface UsageSourceMetadata { + tier?: string; +} + +interface UsageResponse { + response: UsageRecord[]; +} + +let interceptedRequestPayload: UsageRecord[] = []; + +const usageAPIHandler = http.post( + 'api/v1/usage', + async ({ request }): Promise> => { + const payload = (await request.clone().json()) as UsageRecord[]; + interceptedRequestPayload = payload; + + return HttpResponse.json({ + response: payload, + }); + } +); + +export const getInterceptedRequestPayload = (): UsageRecord[] => interceptedRequestPayload; diff --git a/x-pack/test_serverless/api_integration/test_suites/security/config.ts b/x-pack/test_serverless/api_integration/test_suites/security/config.ts index 4de07d59ea56a..b97ed38960561 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/config.ts @@ -23,5 +23,7 @@ export default createTestConfig({ `--xpack.task_manager.unsafe.exclude_task_types=${JSON.stringify(['Fleet-Metrics-Task'])}`, // useful for testing (also enabled in MKI QA) '--coreApp.allowDynamicConfigOverrides=true', + `--xpack.securitySolutionServerless.cloudSecurityUsageReportingTaskInterval=5s`, + `--xpack.securitySolutionServerless.usageReportingApiUrl=http://localhost:8081/api/v1/usage`, ], }); diff --git a/yarn.lock b/yarn.lock index cad73b99f3c3e..6b704845c2b85 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7406,6 +7406,14 @@ resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-1.1.0.tgz#1528eb43630caf83a1d75d5332b30e75e9bb1b5b" integrity sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw== +"@mswjs/http-middleware@^0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@mswjs/http-middleware/-/http-middleware-0.10.1.tgz#7ff38c5398ba01efe98e16a0da24d612ffd69ccc" + integrity sha512-I58RDHXzwKjMjaSO7aV7X0zUzbAvUEEDYsL9+I6Ro0zF5LgjnNdpZoMufG/WoYEenhDCgv7K+HMpLxGuhlfjKA== + dependencies: + express "^4.18.2" + strict-event-emitter "^0.5.1" + "@mswjs/interceptors@^0.29.0": version "0.29.1" resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.29.1.tgz#e77fc58b5188569041d0440b25c9e9ebb1ccd60a" @@ -17512,7 +17520,7 @@ expr-eval@^2.0.2: resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== -express@^4.17.1, express@^4.17.3: +express@^4.17.1, express@^4.17.3, express@^4.18.2: version "4.19.2" resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== From 62a62a2a7f7eb8721bee70fd02aa147a4d47d1c8 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 10 Jul 2024 06:59:37 +0200 Subject: [PATCH 20/82] [api-docs] 2024-07-10 Daily api_docs build (#187931) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/764 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/assets_data_access.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.devdocs.json | 63 +- api_docs/data_quality.mdx | 7 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.devdocs.json | 8 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 6 +- api_docs/deprecations_by_plugin.mdx | 5 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.devdocs.json | 547 ++++ api_docs/esql.mdx | 33 + api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 4 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.devdocs.json | 112 + api_docs/expression_metric_vis.mdx | 4 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...nt_management_table_list_view.devdocs.json | 6 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...agement_table_list_view_table.devdocs.json | 24 +- ...ntent_management_table_list_view_table.mdx | 4 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.devdocs.json | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 72 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- .../kbn_core_security_server.devdocs.json | 2841 ++++++++++++++--- api_docs/kbn_core_security_server.mdx | 7 +- .../kbn_core_security_server_internal.mdx | 2 +- ...bn_core_security_server_mocks.devdocs.json | 38 + api_docs/kbn_core_security_server_mocks.mdx | 4 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.devdocs.json | 56 + api_docs/kbn_data_view_utils.mdx | 4 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- .../kbn_deeplinks_observability.devdocs.json | 30 +- api_docs/kbn_deeplinks_observability.mdx | 4 +- api_docs/kbn_deeplinks_search.devdocs.json | 8 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.devdocs.json | 23 +- api_docs/kbn_entities_schema.mdx | 4 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.devdocs.json | 98 +- api_docs/kbn_esql_ast.mdx | 4 +- api_docs/kbn_esql_utils.mdx | 2 +- ..._esql_validation_autocomplete.devdocs.json | 32 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_grouping.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_index_management.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_recently_accessed.devdocs.json | 269 ++ api_docs/kbn_recently_accessed.mdx | 33 + api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- ...n_security_api_key_management.devdocs.json | 108 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- ..._security_plugin_types_server.devdocs.json | 2336 ++++++++++---- api_docs/kbn_security_plugin_types_server.mdx | 4 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.devdocs.json | 167 +- api_docs/kbn_test_eui_helpers.mdx | 4 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.devdocs.json | 11 + api_docs/kbn_ui_shared_deps_src.mdx | 4 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_unsaved_changes_prompt.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 71 + api_docs/lens.mdx | 4 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 43 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.devdocs.json | 885 +++-- api_docs/security.mdx | 4 +- api_docs/security_solution.devdocs.json | 12 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 4 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 727 files changed, 7059 insertions(+), 2314 deletions(-) create mode 100644 api_docs/esql.devdocs.json create mode 100644 api_docs/esql.mdx create mode 100644 api_docs/kbn_recently_accessed.devdocs.json create mode 100644 api_docs/kbn_recently_accessed.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 096066e0ce5bd..4ab36f970a763 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 56e1e3c05dc9c..ae76364c4ec72 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 59d2a88975220..f858eb52a31b0 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 6c0a62c9c1341..b531df2cf8a7b 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 39480138681d2..7dc9cabc2a413 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index c3150722d0adb..f5f06b8e74070 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 9f794fe86c6b7..8f86fdb36cd2a 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index f82175b8f2b38..6ba79a185aef3 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 5614bdf511a31..244eb9bae85c0 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 5eb1c8f800a49..3ca9e70563e6f 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index a85993e163b53..97fda29eaa639 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index e4106724469ca..7f35d571cec41 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index e34208dde9c2d..406b5aa2fda76 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 803baa19d1b0d..b57f89c35c137 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 688d775419638..3674bbfd1c5b3 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index fb38869a0e18a..791d46b97f470 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 8c6deb3977330..158ee1ce6978f 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 4ed908f53f278..4cf82bac4f4f4 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 02950d752e811..05af1aff6e9fb 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index d60d0a1fbb45b..2336fc498da8f 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index f8470abe439d0..23d9b1b0f3db5 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index e57c81077c45e..a249305bca74b 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 8f8ca8f4e7700..59e0235903c55 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 1bcb7f25a63c5..734405a4a261b 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index a9cef4ffe9dce..7481ab2d2ab76 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.devdocs.json b/api_docs/data_quality.devdocs.json index 9ed104a5f220d..1abc27872df38 100644 --- a/api_docs/data_quality.devdocs.json +++ b/api_docs/data_quality.devdocs.json @@ -47,70 +47,9 @@ "common": { "classes": [], "functions": [], - "interfaces": [ - { - "parentPluginId": "dataQuality", - "id": "def-common.DataQualityLocatorParams", - "type": "Interface", - "tags": [], - "label": "DataQualityLocatorParams", - "description": [], - "signature": [ - { - "pluginId": "dataQuality", - "scope": "common", - "docId": "kibDataQualityPluginApi", - "section": "def-common.DataQualityLocatorParams", - "text": "DataQualityLocatorParams" - }, - " extends ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.SerializableRecord", - "text": "SerializableRecord" - } - ], - "path": "x-pack/plugins/data_quality/common/locators/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "dataQuality", - "id": "def-common.DataQualityLocatorParams.filters", - "type": "Object", - "tags": [], - "label": "filters", - "description": [], - "signature": [ - "Filters | undefined" - ], - "path": "x-pack/plugins/data_quality/common/locators/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - } - ], + "interfaces": [], "enums": [], "misc": [ - { - "parentPluginId": "dataQuality", - "id": "def-common.DATA_QUALITY_LOCATOR_ID", - "type": "string", - "tags": [], - "label": "DATA_QUALITY_LOCATOR_ID", - "description": [], - "signature": [ - "\"DATA_QUALITY_LOCATOR\"" - ], - "path": "x-pack/plugins/data_quality/common/locators/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "dataQuality", "id": "def-common.DATA_QUALITY_URL_STATE_KEY", diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 7b4ccf434823e..9f5495e0c79d1 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 8 | 0 | 8 | 0 | +| 5 | 0 | 5 | 0 | ## Client @@ -33,9 +33,6 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux ## Common -### Interfaces - - ### Consts, variables and types diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 8de4d0592f7ea..3c71d748fa9cd 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 37f8ceb15cc78..70e71ee5aa5c4 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index f3807615bcee7..8984de2773bb7 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index dd4529822585a..f78c44f596264 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index d0b434a81c508..3e1e9f293c482 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index 0b0e2fb4147bb..611d75c419502 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -12992,6 +12992,10 @@ "plugin": "controls", "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" }, + { + "plugin": "@kbn/lens-embeddable-utils", + "path": "packages/kbn-lens-embeddable-utils/config_builder/columns/breakdown.ts" + }, { "plugin": "triggersActionsUi", "path": "x-pack/plugins/triggers_actions_ui/public/common/lib/data_apis.ts" @@ -13116,10 +13120,6 @@ "plugin": "ml", "path": "x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/source_selection/source_selection.tsx" }, - { - "plugin": "@kbn/lens-embeddable-utils", - "path": "packages/kbn-lens-embeddable-utils/config_builder/columns/breakdown.ts" - }, { "plugin": "@kbn/ml-data-view-utils", "path": "x-pack/packages/ml/data_view_utils/actions/data_view_handler.ts" diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index f70820a6b113c..db20d4edea797 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 05b840fe8c3d3..56cf47d4c4aa3 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index be1082197b1d3..fe5acec36e932 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index f2079fd416fad..338694c6a2a55 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,7 +17,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, lens, controls, triggersActionsUi, dataVisualizer, canvas, presentationUtil, logsShared, fleet, ml, @kbn/lens-embeddable-utils, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, infra, securitySolution, timelines, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | +| | data, @kbn/search-errors, savedObjectsManagement, unifiedSearch, @kbn/unified-field-list, lens, controls, @kbn/lens-embeddable-utils, triggersActionsUi, dataVisualizer, canvas, presentationUtil, logsShared, fleet, ml, @kbn/ml-data-view-utils, enterpriseSearch, graph, visTypeTimeseries, exploratoryView, stackAlerts, infra, securitySolution, timelines, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | | | ml, securitySolution | - | | | actions, savedObjectsTagging, ml, enterpriseSearch | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, aiops, dataVisualizer, ml, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | @@ -39,7 +39,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | cloudDefend, osquery, securitySolution, synthetics | - | | | cloudDefend, osquery, securitySolution, synthetics | - | -| | alerting, observabilityAIAssistant, fleet, cloudSecurityPosture, enterpriseSearch, securitySolution, serverlessSearch, transform, upgradeAssistant, apm, entityManager, observabilityOnboarding, synthetics, security | - | | | cases, securitySolution, security | - | | | @kbn/securitysolution-data-table, securitySolution | - | | | @kbn/securitysolution-data-table, securitySolution | - | @@ -66,6 +65,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | @kbn/monaco, securitySolution | - | | | fleet, cloudSecurityPosture, exploratoryView, osquery, synthetics | - | +| | alerting, observabilityAIAssistant, fleet, cloudSecurityPosture, enterpriseSearch, serverlessSearch, transform, upgradeAssistant, apm, entityManager, observabilityOnboarding, synthetics, security | - | | | actions, alerting | - | | | visualizations, lens, controls, dashboard, discover | - | | | discover, @kbn/reporting-public | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 3d6bec3acdf4b..850dc5df41ba7 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1328,8 +1328,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | | | [get_is_alert_suppression_active.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.ts#:~:text=license%24), [create_threat_signals.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts#:~:text=license%24), [query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts#:~:text=license%24), [threshold.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24) | 8.8.0 | -| | [request_context_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/request_context_factory.ts#:~:text=authc), [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=authc), [create_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts#:~:text=authc), [delete_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts#:~:text=authc), [finalize_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts#:~:text=authc), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts#:~:text=authc) | - | -| | [endpoint_app_context_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts#:~:text=authc), [open_close_signals_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts#:~:text=authc), [open_close_signals_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts#:~:text=authc), [file_info_handler.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/file_info_handler.ts#:~:text=authc), [file_download_handler.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/file_download_handler.ts#:~:text=authc), [response_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts#:~:text=authc), [list.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/list.test.ts#:~:text=authc), [response_actions.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts#:~:text=authc), [state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/state.test.ts#:~:text=authc), [index.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.test.ts#:~:text=authc)+ 14 more | - | +| | [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=authc) | - | | | [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles), [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index ba8f747f2b66b..995499eb7b72d 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index e19d6a9775354..c4cec9086a33b 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index c8feab13c40f0..a41a75aa111de 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index aeb8137f43e93..38b90b7b8cf23 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index f68e0f66f9d2d..5825686178960 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index ee89b9fcaa377..8dcfb6b5e7e6f 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index b9f54e85c98a3..a1059962f6c5a 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 33b17b1b3e084..3bc3433fb2d12 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index a9019137412ae..452beb639c4d6 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index cf1cb411d4e83..fb85d36c29136 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 38f98bde1d9b5..4ae1a33d050c8 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index f85d2feea348f..65803da229e88 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index ad72afddd7a28..59bdc7a01f925 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.devdocs.json b/api_docs/esql.devdocs.json new file mode 100644 index 0000000000000..f3d9e7db3931c --- /dev/null +++ b/api_docs/esql.devdocs.json @@ -0,0 +1,547 @@ +{ + "id": "esql", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLangEditor", + "type": "Function", + "tags": [], + "label": "TextBasedLangEditor", + "description": [], + "signature": [ + "(props: ", + { + "pluginId": "@kbn/text-based-editor", + "scope": "public", + "docId": "kibKbnTextBasedEditorPluginApi", + "section": "def-public.TextBasedLanguagesEditorProps", + "text": "TextBasedLanguagesEditorProps" + }, + ") => JSX.Element" + ], + "path": "src/plugins/esql/public/create_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLangEditor.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + { + "pluginId": "@kbn/text-based-editor", + "scope": "public", + "docId": "kibKbnTextBasedEditorPluginApi", + "section": "def-public.TextBasedLanguagesEditorProps", + "text": "TextBasedLanguagesEditorProps" + } + ], + "path": "src/plugins/esql/public/create_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "esql", + "id": "def-public.EsqlPluginStart", + "type": "Interface", + "tags": [], + "label": "EsqlPluginStart", + "description": [], + "path": "src/plugins/esql/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esql", + "id": "def-public.EsqlPluginStart.Editor", + "type": "CompoundType", + "tags": [], + "label": "Editor", + "description": [], + "signature": [ + "React.ComponentClass<", + { + "pluginId": "@kbn/text-based-editor", + "scope": "public", + "docId": "kibKbnTextBasedEditorPluginApi", + "section": "def-public.TextBasedLanguagesEditorProps", + "text": "TextBasedLanguagesEditorProps" + }, + ", any> | React.FunctionComponent<", + { + "pluginId": "@kbn/text-based-editor", + "scope": "public", + "docId": "kibKbnTextBasedEditorPluginApi", + "section": "def-public.TextBasedLanguagesEditorProps", + "text": "TextBasedLanguagesEditorProps" + }, + ">" + ], + "path": "src/plugins/esql/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps", + "type": "Interface", + "tags": [], + "label": "TextBasedLanguagesEditorProps", + "description": [], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [ + "The aggregate type query" + ], + "signature": [ + "{ esql: string; }" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQueryChange", + "type": "Function", + "tags": [], + "label": "onTextLangQueryChange", + "description": [ + "Callback running everytime the query changes" + ], + "signature": [ + "(query: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + ") => void" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQueryChange.$1", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + } + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit", + "type": "Function", + "tags": [], + "label": "onTextLangQuerySubmit", + "description": [ + "Callback running when the user submits the query" + ], + "signature": [ + "(query?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined, abortController?: AbortController | undefined) => Promise" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit.$1", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit.$2", + "type": "Object", + "tags": [], + "label": "abortController", + "description": [], + "signature": [ + "AbortController | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.expandCodeEditor", + "type": "Function", + "tags": [], + "label": "expandCodeEditor", + "description": [ + "Can be used to expand/minimize the editor" + ], + "signature": [ + "(status: boolean) => void" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.expandCodeEditor.$1", + "type": "boolean", + "tags": [], + "label": "status", + "description": [], + "signature": [ + "boolean" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.isCodeEditorExpanded", + "type": "boolean", + "tags": [], + "label": "isCodeEditorExpanded", + "description": [ + "If it is true, the editor initializes with height EDITOR_INITIAL_HEIGHT_EXPANDED" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.detectTimestamp", + "type": "CompoundType", + "tags": [], + "label": "detectTimestamp", + "description": [ + "If it is true, the editor displays the message @timestamp found\nThe text based queries are relying on adhoc dataviews which\ncan have an @timestamp timefield or nothing" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.errors", + "type": "Array", + "tags": [], + "label": "errors", + "description": [ + "Array of errors" + ], + "signature": [ + "Error[] | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.warning", + "type": "string", + "tags": [], + "label": "warning", + "description": [ + "Warning string as it comes from ES" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.isLoading", + "type": "CompoundType", + "tags": [], + "label": "isLoading", + "description": [ + "Disables the editor and displays loading icon in run button\nIt is also used for hiding the history component if it is not defined" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.isDisabled", + "type": "CompoundType", + "tags": [], + "label": "isDisabled", + "description": [ + "Disables the editor" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.isDarkMode", + "type": "CompoundType", + "tags": [], + "label": "isDarkMode", + "description": [ + "Indicator if the editor is on dark mode" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.dataTestSubj", + "type": "string", + "tags": [], + "label": "dataTestSubj", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.hideMinimizeButton", + "type": "CompoundType", + "tags": [], + "label": "hideMinimizeButton", + "description": [ + "If true it hides the minimize button and the user can't return to the minimized version\nUseful when the application doesn't want to give this capability" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [ + "Hide the Run query information which appears on the footer" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.editorIsInline", + "type": "CompoundType", + "tags": [], + "label": "editorIsInline", + "description": [ + "This is used for applications (such as the inline editing flyout in dashboards)\nwhich want to add the editor without being part of the Unified search component\nIt renders a submit query button inside the editor" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.disableSubmitAction", + "type": "CompoundType", + "tags": [], + "label": "disableSubmitAction", + "description": [ + "Disables the submit query action" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.allowQueryCancellation", + "type": "CompoundType", + "tags": [], + "label": "allowQueryCancellation", + "description": [ + "when set to true enables query cancellation" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.hideTimeFilterInfo", + "type": "CompoundType", + "tags": [], + "label": "hideTimeFilterInfo", + "description": [ + "hide @timestamp info" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.hideQueryHistory", + "type": "CompoundType", + "tags": [], + "label": "hideQueryHistory", + "description": [ + "hide query history" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "esql", + "id": "def-public.TextBasedLanguagesEditorProps.hideHeaderWhenExpanded", + "type": "CompoundType", + "tags": [], + "label": "hideHeaderWhenExpanded", + "description": [ + "hide header buttons when editor is expanded" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx new file mode 100644 index 0000000000000..447a914e099b7 --- /dev/null +++ b/api_docs/esql.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibEsqlPluginApi +slug: /kibana-dev-docs/api/esql +title: "esql" +image: https://source.unsplash.com/400x175/?github +description: API docs for the esql plugin +date: 2024-07-10 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] +--- +import esqlObj from './esql.devdocs.json'; + + + +Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 29 | 0 | 10 | 0 | + +## Client + +### Functions + + +### Interfaces + + diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 3f2c0a4d9c670..7c87152fde9f7 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 8b68077abbcc7..8fb24e06e9416 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 2e26b580d7ab1..c73d5f0e92f68 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 5dceb029dd291..bc1e9181691d2 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index 6ace7f03b7e98..cab6253f89206 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; -Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) for questions regarding this plugin. +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index ae10832e86007..95e5b3c81624b 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 60112b987fa25..58efbcc948417 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 8d28641ef9110..a295c8a8243e7 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 24380d9cb7a28..cd4aef9931b14 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 8c2aa4cbee4bf..49ef48ead111d 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 55f8f70299ab9..2ff72cba1fb0a 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.devdocs.json b/api_docs/expression_metric_vis.devdocs.json index 3212eb93a18fe..920c0a7b141d0 100644 --- a/api_docs/expression_metric_vis.devdocs.json +++ b/api_docs/expression_metric_vis.devdocs.json @@ -449,6 +449,62 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricArguments.titlesTextAlign", + "type": "CompoundType", + "tags": [], + "label": "titlesTextAlign", + "description": [], + "signature": [ + "\"right\" | \"left\" | \"center\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricArguments.valuesTextAlign", + "type": "CompoundType", + "tags": [], + "label": "valuesTextAlign", + "description": [], + "signature": [ + "\"right\" | \"left\" | \"center\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricArguments.iconAlign", + "type": "CompoundType", + "tags": [], + "label": "iconAlign", + "description": [], + "signature": [ + "\"right\" | \"left\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricArguments.valueFontSize", + "type": "CompoundType", + "tags": [], + "label": "valueFontSize", + "description": [], + "signature": [ + "number | \"default\" | \"fit\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_functions.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "expressionMetricVis", "id": "def-common.MetricArguments.color", @@ -745,6 +801,62 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricVisParam.titlesTextAlign", + "type": "CompoundType", + "tags": [], + "label": "titlesTextAlign", + "description": [], + "signature": [ + "\"right\" | \"left\" | \"center\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricVisParam.valuesTextAlign", + "type": "CompoundType", + "tags": [], + "label": "valuesTextAlign", + "description": [], + "signature": [ + "\"right\" | \"left\" | \"center\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricVisParam.iconAlign", + "type": "CompoundType", + "tags": [], + "label": "iconAlign", + "description": [], + "signature": [ + "\"right\" | \"left\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "expressionMetricVis", + "id": "def-common.MetricVisParam.valueFontSize", + "type": "CompoundType", + "tags": [], + "label": "valueFontSize", + "description": [], + "signature": [ + "number | \"default\" | \"fit\"" + ], + "path": "src/plugins/chart_expressions/expression_metric/common/types/expression_renderers.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "expressionMetricVis", "id": "def-common.MetricVisParam.maxCols", diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 81a907caa006e..5bc7e3f71791b 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 67 | 0 | 67 | 2 | +| 75 | 0 | 75 | 2 | ## Client diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index a3321202f8de6..9a13222ea8881 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index cb0416e763aab..e66da6d59b9e5 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index cf12bc2eb835f..cb683edbaae50 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 8425f9b438d21..74c9fbe913ab7 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 6229db242f0b1..baf2e18810dc4 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 5c5befc88992e..9ba2df560cd90 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 33e5dcb1c9e29..bcf331fcaea87 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 3623e4b738163..98d623a0718dc 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 4aa09771437ed..315f282888a62 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index 07e9cc7955981..f1f73851b4e03 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index d7bb8672d1bbb..3e7c2f343df8a 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 336c7b989982d..2ce43154bd901 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 08229e66440de..319a8d826876e 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index cf34eb3c65364..dae9096e93491 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index f673e4f74ddef..4deccbece2ccb 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 0f0f71be5ab1f..4ce7402a8af27 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 39f790b134299..c36206ccfa0db 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 7d008c8cda146..2a2aea8bbd167 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 2198168f7de1e..b94c808b00a1c 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 6897a3353fc85..2b9c65a69a762 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 46eb5f1b08eea..dd9cea8435c0c 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 7bda5d0e3d79a..888aeb53975b9 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index e17918db58afc..19aeeacae8fb7 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index e508673b99e2e..f854290a8e46d 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 706fd017d0bd1..bfed005615951 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 3564bad1539b1..1297a4e4a49c3 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 59e2e0458b0f1..4e19d3760cbe7 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 5cf407eec0949..eed3dae813b41 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 026905a20e422..f0fe73b3dc7c3 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index cfd1a74d55049..10ec613aaa584 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index cf1d55a4eba09..3cb4e7842beb2 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 7229c00805c46..8b77837af86e9 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index c15e5c9d98814..df854a85297b1 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index c9f4894e32a84..f1fa88189271d 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index a85c7f65b836a..0b00923d69f53 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 536f700643823..8258b4fb967f3 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index 046fba053c096..50d4f1bd7cede 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 8fbd9e6f4c10d..ce145ff3877d1 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 20a3a8dc84667..736cd4795a2ba 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 61471dadcc39a..1f5b0b1a14c5d 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index b03700b40d54c..607b5dc80ad40 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 679a62fc5ac1f..1569c9f838b35 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 9cb8d8f1f5ab8..40a798b29cb84 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 171175c92c49a..2217f8afe67fa 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index efd66334ac7ba..2f6c745245849 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index d873cf82d0148..e9d0d7b94a811 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 8cf1337712acc..57a414c2e6a96 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 91299eadcdb61..cee6fda7b11f2 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 79b85cddb8cd8..aa375bc54d8ce 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 1760c4e447c04..dd2d4cc67ff9c 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 32bf933999b25..8b9f911f3c2e4 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index ad00bf1686940..ab062d7aacab6 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 0d093b4155ebd..6c2278cc5c26c 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index e81db5b2eec23..b59a2000ddd5e 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 03fdbac88bfd9..dca01b8e5534e 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 0211a48eb90f8..c7e7d48d42953 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 9b81e1457bda7..1735337e2d9a4 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 4fbefc50ea6fe..e7e3677c0f03c 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index ed17d8c6a8df6..bd271acb335cc 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 324b3553b7773..6d9a8f8321992 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 90ce92ea8f905..1c25a10314995 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 514409c17604b..42a189cc36723 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 6e9b16e4631a6..12456f1ab6a0f 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index e4dd77810aa0c..81633a93e69ba 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 879b27192725d..6dec8394e0727 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 0722f7032796a..fd9ae186bc217 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.devdocs.json b/api_docs/kbn_content_management_table_list_view.devdocs.json index f3827b9ca8123..2768884c3da7a 100644 --- a/api_docs/kbn_content_management_table_list_view.devdocs.json +++ b/api_docs/kbn_content_management_table_list_view.devdocs.json @@ -19,7 +19,7 @@ "section": "def-common.UserContentCommonSchema", "text": "UserContentCommonSchema" }, - ">({ title, description, entityName, entityNamePlural, initialFilter, headingId, initialPageSize, listingLimit, urlStateEnabled, customTableColumn, emptyPrompt, findItems, createItem, editItem, deleteItems, getDetailViewLink, getOnClickTitle, rowItemActions, id: listingId, contentEditor, children, titleColumnName, additionalRightSideActions, withoutPageTemplateWrapper, createdByEnabled, }: ", + ">({ title, description, entityName, entityNamePlural, initialFilter, headingId, initialPageSize, listingLimit, urlStateEnabled, customTableColumn, emptyPrompt, findItems, createItem, editItem, deleteItems, getDetailViewLink, getOnClickTitle, rowItemActions, id: listingId, contentEditor, children, titleColumnName, additionalRightSideActions, withoutPageTemplateWrapper, createdByEnabled, recentlyAccessed, }: ", { "pluginId": "@kbn/content-management-table-list-view", "scope": "public", @@ -38,7 +38,7 @@ "id": "def-public.TableListView.$1", "type": "CompoundType", "tags": [], - "label": "{\n title,\n description,\n entityName,\n entityNamePlural,\n initialFilter,\n headingId,\n initialPageSize,\n listingLimit,\n urlStateEnabled = true,\n customTableColumn,\n emptyPrompt,\n findItems,\n createItem,\n editItem,\n deleteItems,\n getDetailViewLink,\n getOnClickTitle,\n rowItemActions,\n id: listingId,\n contentEditor,\n children,\n titleColumnName,\n additionalRightSideActions,\n withoutPageTemplateWrapper,\n createdByEnabled,\n}", + "label": "{\n title,\n description,\n entityName,\n entityNamePlural,\n initialFilter,\n headingId,\n initialPageSize,\n listingLimit,\n urlStateEnabled = true,\n customTableColumn,\n emptyPrompt,\n findItems,\n createItem,\n editItem,\n deleteItems,\n getDetailViewLink,\n getOnClickTitle,\n rowItemActions,\n id: listingId,\n contentEditor,\n children,\n titleColumnName,\n additionalRightSideActions,\n withoutPageTemplateWrapper,\n createdByEnabled,\n recentlyAccessed,\n}", "description": [], "signature": [ { @@ -79,7 +79,7 @@ "section": "def-public.TableListViewTableProps", "text": "TableListViewTableProps" }, - ", \"id\" | \"entityName\" | \"entityNamePlural\" | \"initialFilter\" | \"headingId\" | \"initialPageSize\" | \"listingLimit\" | \"urlStateEnabled\" | \"customTableColumn\" | \"emptyPrompt\" | \"findItems\" | \"createItem\" | \"editItem\" | \"deleteItems\" | \"getDetailViewLink\" | \"getOnClickTitle\" | \"rowItemActions\" | \"contentEditor\" | \"titleColumnName\" | \"withoutPageTemplateWrapper\" | \"createdByEnabled\"> & { title: string; description?: string | undefined; additionalRightSideActions?: React.ReactNode[] | undefined; children?: React.ReactNode; }" + ", \"id\" | \"entityName\" | \"entityNamePlural\" | \"initialFilter\" | \"headingId\" | \"initialPageSize\" | \"listingLimit\" | \"urlStateEnabled\" | \"customTableColumn\" | \"emptyPrompt\" | \"findItems\" | \"createItem\" | \"editItem\" | \"deleteItems\" | \"getDetailViewLink\" | \"getOnClickTitle\" | \"rowItemActions\" | \"contentEditor\" | \"titleColumnName\" | \"withoutPageTemplateWrapper\" | \"createdByEnabled\" | \"recentlyAccessed\"> & { title: string; description?: string | undefined; additionalRightSideActions?: React.ReactNode[] | undefined; children?: React.ReactNode; }" ], "path": "packages/content-management/table_list_view/src/table_list_view.tsx", "deprecated": false, diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 939f6d5092f0d..1be41f9b757d7 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 31e619f9852bc..704cbfbb1c73d 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.devdocs.json b/api_docs/kbn_content_management_table_list_view_table.devdocs.json index da65a4c927242..2cd0fa155534b 100644 --- a/api_docs/kbn_content_management_table_list_view_table.devdocs.json +++ b/api_docs/kbn_content_management_table_list_view_table.devdocs.json @@ -109,7 +109,7 @@ "section": "def-common.UserContentCommonSchema", "text": "UserContentCommonSchema" }, - ">({ tableCaption, entityName, entityNamePlural, initialFilter: initialQuery, headingId, initialPageSize, listingLimit, urlStateEnabled, customTableColumn, emptyPrompt, rowItemActions, findItems, createItem, editItem, deleteItems, getDetailViewLink, getOnClickTitle, id: listingId, contentEditor, titleColumnName, withoutPageTemplateWrapper, onFetchSuccess, refreshListBouncer, setPageDataTestSubject, createdByEnabled, }: ", + ">({ tableCaption, entityName, entityNamePlural, initialFilter: initialQuery, headingId, initialPageSize, listingLimit, urlStateEnabled, customTableColumn, emptyPrompt, rowItemActions, findItems, createItem, editItem, deleteItems, getDetailViewLink, getOnClickTitle, id: listingId, contentEditor, titleColumnName, withoutPageTemplateWrapper, onFetchSuccess, refreshListBouncer, setPageDataTestSubject, createdByEnabled, recentlyAccessed, }: ", { "pluginId": "@kbn/content-management-table-list-view-table", "scope": "public", @@ -833,6 +833,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/content-management-table-list-view-table", + "id": "def-public.TableListViewTableProps.recentlyAccessed", + "type": "Object", + "tags": [], + "label": "recentlyAccessed", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "@kbn/recently-accessed", + "scope": "common", + "docId": "kibKbnRecentlyAccessedPluginApi", + "section": "def-common.RecentlyAccessed", + "text": "RecentlyAccessed" + }, + ", \"get\"> | undefined" + ], + "path": "packages/content-management/table_list_view_table/src/table_list_view_table.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/content-management-table-list-view-table", "id": "def-public.TableListViewTableProps.tableCaption", diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 74be3983e76db..ebb114e7b287d 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 48 | 0 | 32 | 3 | +| 49 | 0 | 33 | 3 | ## Client diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 2b81c3ba9cb2f..9125238ffbf9a 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 35e16d09a66e9..5e93e81da185a 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index fcde91201ab8d..74d8ac8a69aaa 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 0b42f6c90100e..31198a58c5d29 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index f9e3cc6381c29..dd32608997acc 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 150ee1257fee8..e3918cdf78c32 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 04d6ad1681d20..64817a1ced0bb 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index b8916d269cc1e..ba48c0d6d912b 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index da66c9c3b30fa..d22cc4c43127d 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index f1faad6e0067e..2b815d6b94832 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 7f963bdf82777..34fee76ee5c36 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 3d95f71017298..ee76f51d569bf 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 4cf5f768f4995..5656d0d02eb52 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 25549d6384f10..1762ed09c72b9 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 78b83d613ebeb..2b4aa6e4593f4 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 0556f0f0e9f16..a34ef4d8ceb9e 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index fec3cff347d84..e4580bbb89dcb 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index a98ef6914e73c..2d5ef1cbda0e9 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 4c3adbf26bc60..fa7602c4113c1 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index bb3dc3876d0b4..aad00c5dd3247 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index b43ac1eb3aaea..755cc577569bb 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index f495847303fc9..8e66c47f78879 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 8a60d6e77ed4d..5ae4c0b4a07ba 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index 21ff311b60832..2a76c438cc5ef 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -3716,7 +3716,7 @@ "label": "AppDeepLinkId", "description": [], "signature": [ - "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"ux\" | \"apm\" | \"logs\" | \"profiling\" | \"dashboards\" | \"observabilityAIAssistant\" | \"home\" | \"canvas\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchInferenceEndpoints\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"profiling:functions\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"securitySolutionUI:notes-management\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\"" + "\"fleet\" | \"graph\" | \"ml\" | \"monitoring\" | \"metrics\" | \"management\" | \"synthetics\" | \"ux\" | \"apm\" | \"logs\" | \"profiling\" | \"dashboards\" | \"observabilityAIAssistant\" | \"home\" | \"canvas\" | \"integrations\" | \"discover\" | \"observability-overview\" | \"appSearch\" | \"dev_tools\" | \"maps\" | \"visualize\" | \"dev_tools:console\" | \"dev_tools:searchprofiler\" | \"dev_tools:painless_lab\" | \"dev_tools:grokdebugger\" | \"ml:notifications\" | \"ml:nodes\" | \"ml:overview\" | \"ml:memoryUsage\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:esqlDataVisualizer\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\" | \"osquery\" | \"management:transform\" | \"management:watcher\" | \"management:cases\" | \"management:tags\" | \"management:maintenanceWindows\" | \"management:dataViews\" | \"management:spaces\" | \"management:settings\" | \"management:users\" | \"management:migrate_data\" | \"management:search_sessions\" | \"management:data_quality\" | \"management:filesManagement\" | \"management:roles\" | \"management:reporting\" | \"management:aiAssistantManagementSelection\" | \"management:securityAiAssistantManagement\" | \"management:observabilityAiAssistantManagement\" | \"management:api_keys\" | \"management:cross_cluster_replication\" | \"management:license_management\" | \"management:index_lifecycle_management\" | \"management:index_management\" | \"management:ingest_pipelines\" | \"management:jobsListLink\" | \"management:objects\" | \"management:pipelines\" | \"management:remote_clusters\" | \"management:role_mappings\" | \"management:rollup_jobs\" | \"management:snapshot_restore\" | \"management:triggersActions\" | \"management:triggersActionsConnectors\" | \"management:upgrade_assistant\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchRelevance\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchInferenceEndpoints\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"enterpriseSearchRelevance:inferenceEndpoints\" | \"observability-logs-explorer\" | \"observabilityOnboarding\" | \"slo\" | \"logs:settings\" | \"logs:stream\" | \"logs:log-categories\" | \"logs:anomalies\" | \"observability-overview:cases\" | \"observability-overview:alerts\" | \"observability-overview:rules\" | \"observability-overview:cases_create\" | \"observability-overview:cases_configure\" | \"metrics:settings\" | \"metrics:hosts\" | \"metrics:inventory\" | \"metrics:metrics-explorer\" | \"metrics:assetDetails\" | \"apm:traces\" | \"apm:dependencies\" | \"apm:service-map\" | \"apm:settings\" | \"apm:services\" | \"apm:service-groups-list\" | \"apm:storage-explorer\" | \"synthetics:overview\" | \"synthetics:certificates\" | \"profiling:stacktraces\" | \"profiling:flamegraphs\" | \"profiling:functions\" | \"securitySolutionUI\" | \"securitySolutionUI:\" | \"securitySolutionUI:cases\" | \"securitySolutionUI:alerts\" | \"securitySolutionUI:rules\" | \"securitySolutionUI:policy\" | \"securitySolutionUI:overview\" | \"securitySolutionUI:dashboards\" | \"securitySolutionUI:cases_create\" | \"securitySolutionUI:cases_configure\" | \"securitySolutionUI:hosts\" | \"securitySolutionUI:users\" | \"securitySolutionUI:cloud_defend-policies\" | \"securitySolutionUI:cloud_security_posture-dashboard\" | \"securitySolutionUI:cloud_security_posture-findings\" | \"securitySolutionUI:cloud_security_posture-benchmarks\" | \"securitySolutionUI:kubernetes\" | \"securitySolutionUI:network\" | \"securitySolutionUI:data_quality\" | \"securitySolutionUI:explore\" | \"securitySolutionUI:assets\" | \"securitySolutionUI:cloud_defend\" | \"securitySolutionUI:administration\" | \"securitySolutionUI:attack_discovery\" | \"securitySolutionUI:blocklist\" | \"securitySolutionUI:cloud_security_posture-rules\" | \"securitySolutionUI:detections\" | \"securitySolutionUI:detection_response\" | \"securitySolutionUI:endpoints\" | \"securitySolutionUI:event_filters\" | \"securitySolutionUI:exceptions\" | \"securitySolutionUI:host_isolation_exceptions\" | \"securitySolutionUI:hosts-all\" | \"securitySolutionUI:hosts-anomalies\" | \"securitySolutionUI:hosts-risk\" | \"securitySolutionUI:hosts-events\" | \"securitySolutionUI:hosts-sessions\" | \"securitySolutionUI:hosts-uncommon_processes\" | \"securitySolutionUI:investigations\" | \"securitySolutionUI:get_started\" | \"securitySolutionUI:machine_learning-landing\" | \"securitySolutionUI:network-anomalies\" | \"securitySolutionUI:network-dns\" | \"securitySolutionUI:network-events\" | \"securitySolutionUI:network-flows\" | \"securitySolutionUI:network-http\" | \"securitySolutionUI:network-tls\" | \"securitySolutionUI:response_actions_history\" | \"securitySolutionUI:rules-add\" | \"securitySolutionUI:rules-create\" | \"securitySolutionUI:rules-landing\" | \"securitySolutionUI:threat_intelligence\" | \"securitySolutionUI:timelines\" | \"securitySolutionUI:timelines-templates\" | \"securitySolutionUI:trusted_apps\" | \"securitySolutionUI:users-all\" | \"securitySolutionUI:users-anomalies\" | \"securitySolutionUI:users-authentications\" | \"securitySolutionUI:users-events\" | \"securitySolutionUI:users-risk\" | \"securitySolutionUI:entity_analytics\" | \"securitySolutionUI:entity_analytics-management\" | \"securitySolutionUI:entity_analytics-asset-classification\" | \"securitySolutionUI:coverage-overview\" | \"securitySolutionUI:notes-management\" | \"fleet:settings\" | \"fleet:policies\" | \"fleet:data_streams\" | \"fleet:enrollment_tokens\" | \"fleet:uninstall_tokens\" | \"fleet:agents\"" ], "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", "deprecated": false, diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 1086abae2b215..493424c84b150 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 62f7b570e4eca..e88d9096178e4 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index e1bde0474cae7..8cbbd7d26095e 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index e5468ddc4919c..70ea4b5dc374a 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 8096f4620c7ce..078a23e6efa3f 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index dda9d9b03975c..3d9e1988958e3 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index efb3d8c9ed2a3..aac7b29574900 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 8407c18d9dbcc..863b10f8b7b9d 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 17f9c83d7b6d8..ecbbc9243ae4e 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index 5a4bbd836d77e..b71725ff3b2ae 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 459e0abfecb15..dd01ec2331d2d 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index fbb92ae3c4927..4edbb3c64da34 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index db58daa3dc4c2..11b836687315c 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 6341af0909c1f..b92429db69761 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index fea078a886534..d5e1e17da2f2b 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 9e35638fe8485..0a185cfe29232 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index c128ca473df8b..7576650985823 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 4831dce8dd2a0..bf18087d74d2c 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 664f1d96ac2d0..c615e730a495b 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index f6d9eb3e892a3..5e4434442a073 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index bee1dcfa6a53e..853b804f99a55 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index e7d76027875e6..acb40a74aa0fc 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 5378b1943c94c..dd28589a8219c 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 0f29505f85d22..468df05588325 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index f10aca9ec1995..31c6d9abee8b9 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index cf45779818e76..61f74a13f0e68 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 8b742ef47ea4d..a99628a5feb28 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 22dc6d6fd2e28..139c7d6f533ca 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 898bb2ab07218..b7f710f7e048d 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 785761fd8670f..a04dabf41596d 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index f52bc3b6dd3e0..7300d7f4befad 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index c86e95d8e7c09..cd45ea1a09ee3 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index cb8b66a4c5859..024a8076e810c 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 50c8cd918d317..3acd65471f5f3 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index c642fcbc62241..042a1ca06100d 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 323642c224ac4..a3731a178b671 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 56b67697fabc8..0b7dbf9b8af59 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index f76ca30b74ea7..10b55c9a7963e 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index d74fa065174a6..62df39457ebbf 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 85d753f6ccda0..aa625c1430ef5 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 67aff7366d4b5..c712c870c39ed 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 11abb16b7388e..e9702014d9cb4 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index b28bb841aea21..d472cafb7def1 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index a7f5197d057e3..301bf37a89c5a 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 80ba56edce2f9..d677d7278ee77 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 5bd4269119990..e751633cab599 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 7a78f6a7b7732..fc96eb6839be2 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 12b67e02c9cf0..8e56ceb6a2d67 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index f0d1328317f97..6a882bc634e54 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -9638,6 +9638,10 @@ "plugin": "reporting", "path": "x-pack/plugins/reporting/server/test_helpers/create_mock_reportingplugin.ts" }, + { + "plugin": "searchInferenceEndpoints", + "path": "x-pack/plugins/search_inference_endpoints/server/routes.ts" + }, { "plugin": "serverlessSearch", "path": "x-pack/plugins/serverless_search/server/routes/connectors_routes.ts" @@ -14638,6 +14642,22 @@ "plugin": "infra", "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_cluster_health/get_cluster_health_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_space_health/get_space_health_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/rule_execution_logs/get_rule_execution_events/get_rule_execution_events_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/rule_execution_logs/get_rule_execution_results/get_rule_execution_results_route.ts" + }, { "plugin": "osquery", "path": "x-pack/plugins/osquery/server/routes/live_query/get_live_query_details_route.ts" @@ -14710,22 +14730,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_status/get_prebuilt_rules_status_route.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_cluster_health/get_cluster_health_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_space_health/get_space_health_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/rule_execution_logs/get_rule_execution_events/get_rule_execution_events_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/rule_execution_logs/get_rule_execution_results/get_rule_execution_results_route.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/find_rules/route.ts" @@ -15317,10 +15321,6 @@ "plugin": "infra", "path": "x-pack/plugins/observability_solution/infra/server/lib/adapters/framework/kibana_framework_adapter.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts" - }, { "plugin": "osquery", "path": "x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts" @@ -15329,6 +15329,10 @@ "plugin": "osquery", "path": "x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_update_rules/route.ts" @@ -16078,15 +16082,19 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts" + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_cluster_health/get_cluster_health_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts" + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_rule_health/get_rule_health_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/index.ts" + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_space_health/get_space_health_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/setup/setup_health_route.ts" }, { "plugin": "osquery", @@ -16106,35 +16114,31 @@ }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_installation/review_rule_installation_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/index.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_installation/perform_rule_installation_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/import_timelines/index.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/perform_rule_upgrade_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/timeline/routes/prepackaged_timelines/install_prepackaged_timelines/index.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_cluster_health/get_cluster_health_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_installation/review_rule_installation_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_rule_health/get_rule_health_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_space_health/get_space_health_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_installation/perform_rule_installation_route.ts" }, { "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/setup/setup_health_route.ts" + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/perform_rule_upgrade_route.ts" }, { "plugin": "securitySolution", diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 5596729a19e5b..c931520b056aa 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 6c60c5f95888d..9759c12e3d375 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 8df92ed2ed404..52194d1e3ba22 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 6550a4170a723..35b2cca10f626 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 306b32ec55c1a..2644102b52276 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index f849d6e5cead0..b2f26ad7f762a 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index cdddc0eb5e5e4..e49c256c48da4 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index b5e51e530e50d..29622e5b8cfce 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index de9f97d537e42..80c612eed5595 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index bed7da38edbb4..c92d1b62d82f9 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 9976d4b739156..b173cfa0a04ce 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 7534a66110496..43c2679734327 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 576be6a048077..7da2b4413e8dc 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 7d3abe3f0c9dc..7ba907b57a4e0 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 0f501a5406456..da470e8c5d703 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 677ea84bfa21a..00fb9dd2ebcec 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index d066406eb194e..42a0e8343c5f6 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index e36cdb66b8bdb..910f2873610ad 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 87f35c880d486..8590695194b42 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 03c8d13082f19..d512ae1f0b003 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 0ff44ccb2e726..81edad85cffac 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index b5131595599a6..fefa72fd3b666 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index a7631cf8c39bc..9d6f8be46e00b 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index b3bc256921f77..2daf307ef4f4f 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index c0c3c776bfa33..64a7b50c47608 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 623d9f05fd146..46374089703e0 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 07b5c87f8e1a6..152930feda411 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 0af8a380b8986..12522b90f06f2 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 8733bac0f473d..8c8c3b805224a 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 34ad00eaeb7a7..d232bafe0fa82 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index ac75d8f1910b9..3c30b302f76f9 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 906a5258c3415..5dc7556ad8bf9 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index b1a65946aacee..a19c448fcc345 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index f58effd94bdd3..ad9a4f45df10d 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index d23b118d23003..66c479cb3a4c2 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index cafedc5b681ba..dc6502ea5f1fe 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 921d52cf93af5..309d207ba9c51 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index db3657b741db6..aea6137d6b2f6 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index e76953060daa7..0138ec8685492 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 91ff579000f9e..45e7b983181e7 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 046427404d626..fb8e18373612a 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 1da976fb44be4..4c8f4bedf0b62 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 480c70239ab38..3b1283d55ff63 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 23c9a3263b297..63648a80c8df2 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 511c802b6d141..85402f60a8cd4 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index e9dc751143066..bd24e8b6521de 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index 57f88ea5c51df..dc8ed6970a5a3 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 8fe186570a126..2be2c17cd383d 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 694f4eb097689..02238a9b75685 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index e5c4b705bd85f..e22c55d5cbd2d 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index d37ce6bcdc6e1..1f9e3651952af 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index a6611bbed76db..1705bf294d5dd 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index eba8f921ec522..71c5bd3827440 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 8778e778c0fe5..e778e345e2eef 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index 56e8c07c0f0da..cc080a849348a 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 554b28e4d8a6b..f749372d27e69 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index db08f52c6122d..e4e89e985e55a 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 2dd11ab51188f..18ab4d127f094 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 7645e5be4a95a..adefadd41522a 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 5eebde469fa1d..bef401cec68d0 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 654bb0d9a30ca..aa02f2c204c33 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index a3b05a0a497fb..365461b782a27 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 74d85c41a162b..864cfb892c1e5 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index f1089272a33c0..0b0b7e49ce06a 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index c1cb8444bc83b..d501f71665274 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index f55fdf09091ff..60a4bfc184ead 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 718c42829ed7e..08455631e32c6 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 371aaf08307d5..0ee6a3841131f 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.devdocs.json b/api_docs/kbn_core_security_server.devdocs.json index fb144f1f8e2d8..ca536ef16c482 100644 --- a/api_docs/kbn_core_security_server.devdocs.json +++ b/api_docs/kbn_core_security_server.devdocs.json @@ -18,94 +18,1708 @@ }, "common": { "classes": [], - "functions": [], + "functions": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.isCreateRestAPIKeyParams", + "type": "Function", + "tags": [], + "label": "isCreateRestAPIKeyParams", + "description": [], + "signature": [ + "(params: any) => boolean" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.isCreateRestAPIKeyParams.$1", + "type": "Any", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], "interfaces": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditEvent", + "id": "def-common.APIKeys", + "type": "Interface", + "tags": [], + "label": "APIKeys", + "description": [ + "\nInterface for managing API keys in Elasticsearch, including creation,\nvalidation, and invalidation of API keys,\nas well as checking the status of API key features." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.areAPIKeysEnabled", + "type": "Function", + "tags": [], + "label": "areAPIKeysEnabled", + "description": [ + "\nDetermines if API Keys are enabled in Elasticsearch." + ], + "signature": [ + "() => Promise" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.areCrossClusterAPIKeysEnabled", + "type": "Function", + "tags": [], + "label": "areCrossClusterAPIKeysEnabled", + "description": [ + "\nDetermines if Cross-Cluster API Keys are enabled in Elasticsearch." + ], + "signature": [ + "() => Promise" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [ + "\nTries to create an API key for the current user.\n\nReturns newly created API key or `null` if API keys are disabled.\n\nUser needs `manage_api_key` privilege to create REST API keys and `manage_security` for Cross-Cluster API keys.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", createParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + }, + ") => Promise<", + "SecurityCreateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.create.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.create.$2", + "type": "CompoundType", + "tags": [], + "label": "createParams", + "description": [ + "The params to create an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.update", + "type": "Function", + "tags": [], + "label": "update", + "description": [ + "\nAttempts update an API key with the provided 'role_descriptors' and 'metadata'\n\nReturns `updated`, `true` if the update was successful, `false` if there was nothing to update\n\nUser needs `manage_api_key` privilege to update REST API keys and `manage_security` for cross-cluster API keys.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", updateParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + }, + ") => Promise<", + "SecurityUpdateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.update.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.update.$2", + "type": "CompoundType", + "tags": [], + "label": "updateParams", + "description": [ + "The params to edit an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.grantAsInternalUser", + "type": "Function", + "tags": [], + "label": "grantAsInternalUser", + "description": [ + "\nTries to grant an API key for the current user." + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", createParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.GrantAPIKeyResult", + "text": "GrantAPIKeyResult" + }, + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.grantAsInternalUser.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.grantAsInternalUser.$2", + "type": "CompoundType", + "tags": [], + "label": "createParams", + "description": [ + "Create operation parameters." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.validate", + "type": "Function", + "tags": [], + "label": "validate", + "description": [ + "\nTries to validate an API key." + ], + "signature": [ + "(apiKeyPrams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", + "text": "ValidateAPIKeyParams" + }, + ") => Promise" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.validate.$1", + "type": "Object", + "tags": [], + "label": "apiKeyPrams", + "description": [ + "ValidateAPIKeyParams." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", + "text": "ValidateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.invalidate", + "type": "Function", + "tags": [], + "label": "invalidate", + "description": [ + "\nTries to invalidate an API keys." + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", params: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", + "text": "InvalidateAPIKeyResult" + }, + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.invalidate.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.invalidate.$2", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "The params to invalidate an API keys." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.invalidateAsInternalUser", + "type": "Function", + "tags": [], + "label": "invalidateAsInternalUser", + "description": [ + "\nTries to invalidate the API keys by using the internal user." + ], + "signature": [ + "(params: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", + "text": "InvalidateAPIKeyResult" + }, + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeys.invalidateAsInternalUser.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "The params to invalidate the API keys." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext", + "type": "Interface", + "tags": [], + "label": "APIKeysServiceWithContext", + "description": [ + "\nPublic API Keys service exposed through core context to manage\nAPI keys in Elasticsearch, including creation,\nvalidation, and invalidation of API keys,\nas well as checking the status of API key features." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.areAPIKeysEnabled", + "type": "Function", + "tags": [], + "label": "areAPIKeysEnabled", + "description": [ + "\nDetermines if API Keys are enabled in Elasticsearch." + ], + "signature": [ + "() => Promise" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [ + "\nTries to create an API key for the current user.\n\nReturns newly created API key or `null` if API keys are disabled.\n\nUser needs `manage_api_key` privilege to create REST API keys and `manage_security` for Cross-Cluster API keys.\n" + ], + "signature": [ + "(createParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + }, + ") => Promise<", + "SecurityCreateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.create.$1", + "type": "CompoundType", + "tags": [], + "label": "createParams", + "description": [ + "The params to create an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.update", + "type": "Function", + "tags": [], + "label": "update", + "description": [ + "\nAttempts update an API key with the provided 'role_descriptors' and 'metadata'\n\nReturns `updated`, `true` if the update was successful, `false` if there was nothing to update\n\nUser needs `manage_api_key` privilege to update REST API keys and `manage_security` for cross-cluster API keys.\n" + ], + "signature": [ + "(updateParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + }, + ") => Promise<", + "SecurityUpdateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.update.$1", + "type": "CompoundType", + "tags": [], + "label": "updateParams", + "description": [ + "The params to edit an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.validate", + "type": "Function", + "tags": [], + "label": "validate", + "description": [ + "\nTries to validate an API key." + ], + "signature": [ + "(apiKeyPrams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", + "text": "ValidateAPIKeyParams" + }, + ") => Promise" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.validate.$1", + "type": "Object", + "tags": [], + "label": "apiKeyPrams", + "description": [ + "ValidateAPIKeyParams." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", + "text": "ValidateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.invalidate", + "type": "Function", + "tags": [], + "label": "invalidate", + "description": [ + "\nTries to invalidate an API keys." + ], + "signature": [ + "(params: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", + "text": "InvalidateAPIKeyResult" + }, + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.APIKeysServiceWithContext.invalidate.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "The params to invalidate an API keys." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys_context.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditEvent", + "type": "Interface", + "tags": [], + "label": "AuditEvent", + "description": [ + "\nAudit event schema using ECS format: https://www.elastic.co/guide/en/ecs/1.12/index.html\n\nIf you add additional fields to the schema ensure you update the Kibana Filebeat module:\nhttps://github.com/elastic/beats/tree/master/filebeat/module/kibana\n" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditEvent", + "text": "AuditEvent" + }, + " extends ", + { + "pluginId": "@kbn/logging", + "scope": "common", + "docId": "kibKbnLoggingPluginApi", + "section": "def-common.LogMeta", + "text": "LogMeta" + } + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditEvent.message", + "type": "string", + "tags": [], + "label": "message", + "description": [ + "\nLog message" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditEvent.kibana", + "type": "Object", + "tags": [], + "label": "kibana", + "description": [ + "\nKibana specific fields" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditKibana", + "text": "AuditKibana" + }, + " | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditEvent.http", + "type": "Object", + "tags": [], + "label": "http", + "description": [ + "\nFields describing an HTTP request" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditHttp", + "text": "AuditHttp" + }, + " | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditHttp", + "type": "Interface", + "tags": [], + "label": "AuditHttp", + "description": [ + "\nAudit http schema using ECS format" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditHttp", + "text": "AuditHttp" + }, + " extends ", + "EcsHttp" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditHttp.request", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "\nHTTP request details" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditRequest", + "text": "AuditRequest" + }, + " | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana", + "type": "Interface", + "tags": [], + "label": "AuditKibana", + "description": [ + "\nAudit kibana schema using ECS format" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.space_id", + "type": "string", + "tags": [], + "label": "space_id", + "description": [ + "\nThe ID of the space associated with this event." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.session_id", + "type": "string", + "tags": [], + "label": "session_id", + "description": [ + "\nThe ID of the user session associated with this event. Each login attempt\nresults in a unique session id." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.saved_object", + "type": "Object", + "tags": [], + "label": "saved_object", + "description": [ + "\nSaved object that was created, changed, deleted or accessed as part of this event." + ], + "signature": [ + "{ type: string; id: string; name?: string | undefined; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.authentication_provider", + "type": "string", + "tags": [], + "label": "authentication_provider", + "description": [ + "\nName of authentication provider associated with a login event." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.authentication_type", + "type": "string", + "tags": [], + "label": "authentication_type", + "description": [ + "\nType of authentication provider associated with a login event." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.authentication_realm", + "type": "string", + "tags": [], + "label": "authentication_realm", + "description": [ + "\nName of Elasticsearch realm that has authenticated the user." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.lookup_realm", + "type": "string", + "tags": [], + "label": "lookup_realm", + "description": [ + "\nName of Elasticsearch realm where the user details were retrieved from." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.add_to_spaces", + "type": "Object", + "tags": [], + "label": "add_to_spaces", + "description": [ + "\nSet of space IDs that a saved object was shared to." + ], + "signature": [ + "readonly string[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.delete_from_spaces", + "type": "Object", + "tags": [], + "label": "delete_from_spaces", + "description": [ + "\nSet of space IDs that a saved object was removed from." + ], + "signature": [ + "readonly string[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.unauthorized_spaces", + "type": "Object", + "tags": [], + "label": "unauthorized_spaces", + "description": [ + "\nSet of space IDs that are not authorized for an action." + ], + "signature": [ + "readonly string[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditKibana.unauthorized_types", + "type": "Object", + "tags": [], + "label": "unauthorized_types", + "description": [ + "\nSet of types that are not authorized for an action." + ], + "signature": [ + "readonly string[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditLogger", + "type": "Interface", + "tags": [], + "label": "AuditLogger", + "description": [], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditLogger.log", + "type": "Function", + "tags": [], + "label": "log", + "description": [ + "\nLogs an {@link AuditEvent} and automatically adds meta data about the\ncurrent user, space and correlation id.\n\nGuidelines around what events should be logged and how they should be\nstructured can be found in: `/x-pack/plugins/security/README.md`\n" + ], + "signature": [ + "(event: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditEvent", + "text": "AuditEvent" + }, + " | undefined) => void" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditLogger.log.$1", + "type": "Object", + "tags": [], + "label": "event", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditEvent", + "text": "AuditEvent" + }, + " | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditLogger.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [ + "\nIndicates whether audit logging is enabled or not.\n\nUseful for skipping resource-intense operations that don't need to be performed when audit\nlogging is disabled." + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditRequest", + "type": "Interface", + "tags": [], + "label": "AuditRequest", + "description": [ + "\nAudit request schema using ECS format" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditRequest", + "text": "AuditRequest" + }, + " extends { body?: { bytes?: number | undefined; content?: string | undefined; } | undefined; bytes?: number | undefined; id?: string | undefined; method?: string | undefined; mime_type?: string | undefined; referrer?: string | undefined; }" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditRequest.headers", + "type": "Object", + "tags": [], + "label": "headers", + "description": [ + "\nHTTP request headers" + ], + "signature": [ + "{ 'x-forwarded-for'?: string | undefined; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditRequestHandlerContext", + "type": "Interface", + "tags": [], + "label": "AuditRequestHandlerContext", + "description": [], + "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuditRequestHandlerContext.logger", + "type": "Object", + "tags": [], + "label": "logger", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditLogger", + "text": "AuditLogger" + } + ], + "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuthcRequestHandlerContext", + "type": "Interface", + "tags": [], + "label": "AuthcRequestHandlerContext", + "description": [], + "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuthcRequestHandlerContext.getCurrentUser", + "type": "Function", + "tags": [], + "label": "getCurrentUser", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "@kbn/core-security-common", + "scope": "common", + "docId": "kibKbnCoreSecurityCommonPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | null" + ], + "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.AuthcRequestHandlerContext.apiKeys", + "type": "Object", + "tags": [], + "label": "apiKeys", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.APIKeysServiceWithContext", + "text": "APIKeysServiceWithContext" + } + ], + "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuditService", + "type": "Interface", + "tags": [], + "label": "CoreAuditService", + "description": [], + "path": "packages/core/security/core-security-server/src/audit.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuditService.asScoped", + "type": "Function", + "tags": [], + "label": "asScoped", + "description": [ + "\nCreates an {@link AuditLogger} scoped to the current request.\n\nThis audit logger logs events with all required user and session info and should be used for\nall user-initiated actions.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ") => ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditLogger", + "text": "AuditLogger" + } + ], + "path": "packages/core/security/core-security-server/src/audit.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuditService.asScoped.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/audit.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuditService.withoutRequest", + "type": "Object", + "tags": [], + "label": "withoutRequest", + "description": [ + "\n{@link AuditLogger} for background tasks only.\n\nThis audit logger logs events without any user or session info and should never be used to log\nuser-initiated actions.\n" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditLogger", + "text": "AuditLogger" + } + ], + "path": "packages/core/security/core-security-server/src/audit.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuthenticationService", + "type": "Interface", + "tags": [], + "label": "CoreAuthenticationService", + "description": [ + "\nCore's authentication service\n" + ], + "path": "packages/core/security/core-security-server/src/authc.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuthenticationService.getCurrentUser", + "type": "Function", + "tags": [], + "label": "getCurrentUser", + "description": [ + "\nRetrieve the user bound to the provided request, or null if\nno user is authenticated.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ") => ", + { + "pluginId": "@kbn/core-security-common", + "scope": "common", + "docId": "kibKbnCoreSecurityCommonPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | null" + ], + "path": "packages/core/security/core-security-server/src/authc.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuthenticationService.getCurrentUser.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "The request to retrieve the authenticated user for." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authc.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreAuthenticationService.apiKeys", + "type": "Object", + "tags": [], + "label": "apiKeys", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.APIKeys", + "text": "APIKeys" + } + ], + "path": "packages/core/security/core-security-server/src/authc.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreFipsService", + "type": "Interface", + "tags": [], + "label": "CoreFipsService", + "description": [ + "\nCore's FIPS service\n" + ], + "path": "packages/core/security/core-security-server/src/fips.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreFipsService.isEnabled", + "type": "Function", + "tags": [], + "label": "isEnabled", + "description": [ + "\nCheck if Kibana is configured to run in FIPS mode" + ], + "signature": [ + "() => boolean" + ], + "path": "packages/core/security/core-security-server/src/fips.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreSecurityDelegateContract", "type": "Interface", "tags": [], - "label": "AuditEvent", + "label": "CoreSecurityDelegateContract", "description": [ - "\nAudit event schema using ECS format: https://www.elastic.co/guide/en/ecs/1.12/index.html\n\nIf you add additional fields to the schema ensure you update the Kibana Filebeat module:\nhttps://github.com/elastic/beats/tree/master/filebeat/module/kibana\n" + "\nThe contract exposed by the security provider for Core to\nconsume and re-expose via its security service.\n" ], - "signature": [ + "path": "packages/core/security/core-security-server/src/api_provider.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditEvent", - "text": "AuditEvent" + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreSecurityDelegateContract.authc", + "type": "Object", + "tags": [], + "label": "authc", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CoreAuthenticationService", + "text": "CoreAuthenticationService" + } + ], + "path": "packages/core/security/core-security-server/src/api_provider.ts", + "deprecated": false, + "trackAdoption": false }, - " extends ", { - "pluginId": "@kbn/logging", - "scope": "common", - "docId": "kibKbnLoggingPluginApi", - "section": "def-common.LogMeta", - "text": "LogMeta" + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CoreSecurityDelegateContract.audit", + "type": "Object", + "tags": [], + "label": "audit", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CoreAuditService", + "text": "CoreAuditService" + } + ], + "path": "packages/core/security/core-security-server/src/api_provider.ts", + "deprecated": false, + "trackAdoption": false } ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateCrossClusterAPIKeyParams", + "type": "Interface", + "tags": [], + "label": "CreateCrossClusterAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditEvent.message", + "id": "def-common.CreateCrossClusterAPIKeyParams.type", "type": "string", "tags": [], - "label": "message", - "description": [ - "\nLog message" + "label": "type", + "description": [], + "signature": [ + "\"cross_cluster\"" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditEvent.kibana", - "type": "Object", + "id": "def-common.CreateCrossClusterAPIKeyParams.expiration", + "type": "string", "tags": [], - "label": "kibana", - "description": [ - "\nKibana specific fields" - ], + "label": "expiration", + "description": [], "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditKibana", - "text": "AuditKibana" - }, - " | undefined" + "string | undefined" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditEvent.http", + "id": "def-common.CreateCrossClusterAPIKeyParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateCrossClusterAPIKeyParams.metadata", "type": "Object", "tags": [], - "label": "http", - "description": [ - "\nFields describing an HTTP request" + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateCrossClusterAPIKeyParams.access", + "type": "Object", + "tags": [], + "label": "access", + "description": [], "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditHttp", - "text": "AuditHttp" - }, - " | undefined" + "{ search?: { names: string[]; query?: unknown; field_security?: unknown; allow_restricted_indices?: boolean | undefined; }[] | undefined; replication?: { names: string[]; }[] | undefined; }" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -114,48 +1728,176 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditHttp", + "id": "def-common.CreateRestAPIKeyParams", "type": "Interface", "tags": [], - "label": "AuditHttp", - "description": [ - "\nAudit http schema using ECS format" - ], - "signature": [ + "label": "CreateRestAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditHttp", - "text": "AuditHttp" + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false }, - " extends ", - "EcsHttp" + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyParams.role_descriptors", + "type": "Object", + "tags": [], + "label": "role_descriptors", + "description": [], + "signature": [ + "{ [x: string]: { [key: string]: any; }; }" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "type": "Interface", + "tags": [], + "label": "CreateRestAPIKeyWithKibanaPrivilegesParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditHttp.request", + "id": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams.metadata", "type": "Object", "tags": [], - "label": "request", - "description": [ - "\nHTTP request details" + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams.kibana_role_descriptors", + "type": "Object", + "tags": [], + "label": "kibana_role_descriptors", + "description": [], "signature": [ + "{ [x: string]: { elasticsearch: ", { "pluginId": "@kbn/core-security-server", "scope": "common", "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditRequest", - "text": "AuditRequest" + "section": "def-common.ElasticsearchPrivilegesType", + "text": "ElasticsearchPrivilegesType" }, - " | undefined" + " & { [key: string]: unknown; }; kibana: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.KibanaPrivilegesType", + "text": "KibanaPrivilegesType" + }, + "; }; }" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -164,266 +1906,214 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana", + "id": "def-common.ElasticsearchPrivilegesType", "type": "Interface", "tags": [], - "label": "AuditKibana", + "label": "ElasticsearchPrivilegesType", "description": [ - "\nAudit kibana schema using ECS format" + "\nType representing Elasticsearch specific portion of the role definition." ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.space_id", - "type": "string", + "id": "def-common.ElasticsearchPrivilegesType.cluster", + "type": "Array", "tags": [], - "label": "space_id", - "description": [ - "\nThe ID of the space associated with this event." - ], + "label": "cluster", + "description": [], "signature": [ - "string | undefined" + "string[] | undefined" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.session_id", - "type": "string", + "id": "def-common.ElasticsearchPrivilegesType.remote_cluster", + "type": "Array", "tags": [], - "label": "session_id", - "description": [ - "\nThe ID of the user session associated with this event. Each login attempt\nresults in a unique session id." - ], + "label": "remote_cluster", + "description": [], "signature": [ - "string | undefined" + "{ privileges: string[]; clusters: string[]; }[] | undefined" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.saved_object", - "type": "Object", + "id": "def-common.ElasticsearchPrivilegesType.indices", + "type": "Array", "tags": [], - "label": "saved_object", - "description": [ - "\nSaved object that was created, changed, deleted or accessed as part of this event." - ], + "label": "indices", + "description": [], "signature": [ - "{ type: string; id: string; name?: string | undefined; } | undefined" + "{ names: string[]; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; privileges: string[]; query?: string | undefined; allow_restricted_indices?: boolean | undefined; }[] | undefined" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.authentication_provider", - "type": "string", + "id": "def-common.ElasticsearchPrivilegesType.remote_indices", + "type": "Array", "tags": [], - "label": "authentication_provider", - "description": [ - "\nName of authentication provider associated with a login event." - ], + "label": "remote_indices", + "description": [], "signature": [ - "string | undefined" + "{ clusters: string[]; names: string[]; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; privileges: string[]; query?: string | undefined; allow_restricted_indices?: boolean | undefined; }[] | undefined" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.authentication_type", - "type": "string", + "id": "def-common.ElasticsearchPrivilegesType.run_as", + "type": "Array", "tags": [], - "label": "authentication_type", - "description": [ - "\nType of authentication provider associated with a login event." - ], + "label": "run_as", + "description": [], "signature": [ - "string | undefined" + "string[] | undefined" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false - }, + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.GrantAPIKeyResult", + "type": "Interface", + "tags": [], + "label": "GrantAPIKeyResult", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.authentication_realm", + "id": "def-common.GrantAPIKeyResult.id", "type": "string", "tags": [], - "label": "authentication_realm", + "label": "id", "description": [ - "\nName of Elasticsearch realm that has authenticated the user." - ], - "signature": [ - "string | undefined" + "\nUnique id for this API key" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.lookup_realm", + "id": "def-common.GrantAPIKeyResult.name", "type": "string", "tags": [], - "label": "lookup_realm", + "label": "name", "description": [ - "\nName of Elasticsearch realm where the user details were retrieved from." - ], - "signature": [ - "string | undefined" + "\nName for this API key" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.add_to_spaces", - "type": "Object", + "id": "def-common.GrantAPIKeyResult.api_key", + "type": "string", "tags": [], - "label": "add_to_spaces", + "label": "api_key", "description": [ - "\nSet of space IDs that a saved object was shared to." - ], - "signature": [ - "readonly string[] | undefined" + "\nGenerated API key" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false - }, + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.InvalidateAPIKeyResult", + "type": "Interface", + "tags": [], + "label": "InvalidateAPIKeyResult", + "description": [ + "\nThe return value when invalidating an API key in Elasticsearch." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.delete_from_spaces", - "type": "Object", + "id": "def-common.InvalidateAPIKeyResult.invalidated_api_keys", + "type": "Array", "tags": [], - "label": "delete_from_spaces", + "label": "invalidated_api_keys", "description": [ - "\nSet of space IDs that a saved object was removed from." + "\nThe IDs of the API keys that were invalidated as part of the request." ], "signature": [ - "readonly string[] | undefined" + "string[]" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.unauthorized_spaces", - "type": "Object", + "id": "def-common.InvalidateAPIKeyResult.previously_invalidated_api_keys", + "type": "Array", "tags": [], - "label": "unauthorized_spaces", + "label": "previously_invalidated_api_keys", "description": [ - "\nSet of space IDs that are not authorized for an action." + "\nThe IDs of the API keys that were already invalidated." ], "signature": [ - "readonly string[] | undefined" + "string[]" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditKibana.unauthorized_types", - "type": "Object", + "id": "def-common.InvalidateAPIKeyResult.error_count", + "type": "number", "tags": [], - "label": "unauthorized_types", + "label": "error_count", "description": [ - "\nSet of types that are not authorized for an action." + "\nThe number of errors that were encountered when invalidating the API keys." ], - "signature": [ - "readonly string[] | undefined" - ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditLogger", - "type": "Interface", - "tags": [], - "label": "AuditLogger", - "description": [], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditLogger.log", - "type": "Function", + "id": "def-common.InvalidateAPIKeyResult.error_details", + "type": "Array", "tags": [], - "label": "log", + "label": "error_details", "description": [ - "\nLogs an {@link AuditEvent} and automatically adds meta data about the\ncurrent user, space and correlation id.\n\nGuidelines around what events should be logged and how they should be\nstructured can be found in: `/x-pack/plugins/security/README.md`\n" + "\nDetails about these errors. This field is not present in the response when error_count is 0." ], "signature": [ - "(event: ", - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditEvent", - "text": "AuditEvent" - }, - " | undefined) => void" - ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditLogger.log.$1", - "type": "Object", - "tags": [], - "label": "event", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditEvent", - "text": "AuditEvent" - }, - " | undefined" - ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] - }, - { - "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditLogger.enabled", - "type": "boolean", - "tags": [], - "label": "enabled", - "description": [ - "\nIndicates whether audit logging is enabled or not.\n\nUseful for skipping resource-intense operations that don't need to be performed when audit\nlogging is disabled." + "{ type?: string | undefined; reason?: string | undefined; caused_by?: { type?: string | undefined; reason?: string | undefined; } | undefined; }[] | undefined" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_logger.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -432,40 +2122,30 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditRequest", + "id": "def-common.InvalidateAPIKeysParams", "type": "Interface", "tags": [], - "label": "AuditRequest", + "label": "InvalidateAPIKeysParams", "description": [ - "\nAudit request schema using ECS format" - ], - "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditRequest", - "text": "AuditRequest" - }, - " extends { body?: { bytes?: number | undefined; content?: string | undefined; } | undefined; bytes?: number | undefined; id?: string | undefined; method?: string | undefined; mime_type?: string | undefined; referrer?: string | undefined; }" + "\nRepresents the params for invalidating multiple API keys" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditRequest.headers", - "type": "Object", + "id": "def-common.InvalidateAPIKeysParams.ids", + "type": "Array", "tags": [], - "label": "headers", + "label": "ids", "description": [ - "\nHTTP request headers" + "\nList of unique API key IDs" ], "signature": [ - "{ 'x-forwarded-for'?: string | undefined; } | undefined" + "string[]" ], - "path": "packages/core/security/core-security-server/src/audit_logging/audit_events.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -474,10 +2154,10 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditRequestHandlerContext", + "id": "def-common.SecurityRequestHandlerContext", "type": "Interface", "tags": [], - "label": "AuditRequestHandlerContext", + "label": "SecurityRequestHandlerContext", "description": [], "path": "packages/core/security/core-security-server/src/request_handler_context.ts", "deprecated": false, @@ -485,125 +2165,101 @@ "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuditRequestHandlerContext.logger", + "id": "def-common.SecurityRequestHandlerContext.authc", "type": "Object", "tags": [], - "label": "logger", + "label": "authc", "description": [], "signature": [ { "pluginId": "@kbn/core-security-server", "scope": "common", "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditLogger", - "text": "AuditLogger" + "section": "def-common.AuthcRequestHandlerContext", + "text": "AuthcRequestHandlerContext" } ], "path": "packages/core/security/core-security-server/src/request_handler_context.ts", "deprecated": false, "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuthcRequestHandlerContext", - "type": "Interface", - "tags": [], - "label": "AuthcRequestHandlerContext", - "description": [], - "path": "packages/core/security/core-security-server/src/request_handler_context.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.AuthcRequestHandlerContext.getCurrentUser", - "type": "Function", + "id": "def-common.SecurityRequestHandlerContext.audit", + "type": "Object", "tags": [], - "label": "getCurrentUser", + "label": "audit", "description": [], "signature": [ - "() => ", { - "pluginId": "@kbn/core-security-common", + "pluginId": "@kbn/core-security-server", "scope": "common", - "docId": "kibKbnCoreSecurityCommonPluginApi", - "section": "def-common.AuthenticatedUser", - "text": "AuthenticatedUser" - }, - " | null" + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.AuditRequestHandlerContext", + "text": "AuditRequestHandlerContext" + } ], "path": "packages/core/security/core-security-server/src/request_handler_context.ts", "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] + "trackAdoption": false } ], "initialIsOpen": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreAuditService", + "id": "def-common.SecurityServiceSetup", "type": "Interface", "tags": [], - "label": "CoreAuditService", - "description": [], - "path": "packages/core/security/core-security-server/src/audit.ts", + "label": "SecurityServiceSetup", + "description": [ + "\nSetup contract for Core's security service.\n" + ], + "path": "packages/core/security/core-security-server/src/contracts.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreAuditService.asScoped", + "id": "def-common.SecurityServiceSetup.registerSecurityDelegate", "type": "Function", "tags": [], - "label": "asScoped", + "label": "registerSecurityDelegate", "description": [ - "\nCreates an {@link AuditLogger} scoped to the current request.\n\nThis audit logger logs events with all required user and session info and should be used for\nall user-initiated actions.\n" + "\nRegister the security implementation that then will be used and re-exposed by Core.\n" ], "signature": [ - "(request: ", - { - "pluginId": "@kbn/core-http-server", - "scope": "common", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-common.KibanaRequest", - "text": "KibanaRequest" - }, - ") => ", + "(api: ", { "pluginId": "@kbn/core-security-server", "scope": "common", "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditLogger", - "text": "AuditLogger" - } + "section": "def-common.CoreSecurityDelegateContract", + "text": "CoreSecurityDelegateContract" + }, + ") => void" ], - "path": "packages/core/security/core-security-server/src/audit.ts", + "path": "packages/core/security/core-security-server/src/contracts.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreAuditService.asScoped.$1", + "id": "def-common.SecurityServiceSetup.registerSecurityDelegate.$1", "type": "Object", "tags": [], - "label": "request", + "label": "api", "description": [], "signature": [ { - "pluginId": "@kbn/core-http-server", + "pluginId": "@kbn/core-security-server", "scope": "common", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-common.KibanaRequest", - "text": "KibanaRequest" - }, - "" + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CoreSecurityDelegateContract", + "text": "CoreSecurityDelegateContract" + } ], - "path": "packages/core/security/core-security-server/src/audit.ts", + "path": "packages/core/security/core-security-server/src/contracts.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -613,23 +2269,23 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreAuditService.withoutRequest", + "id": "def-common.SecurityServiceSetup.fips", "type": "Object", "tags": [], - "label": "withoutRequest", + "label": "fips", "description": [ - "\n{@link AuditLogger} for background tasks only.\n\nThis audit logger logs events without any user or session info and should never be used to log\nuser-initiated actions.\n" + "\nThe {@link CoreFipsService | FIPS service}" ], "signature": [ { "pluginId": "@kbn/core-security-server", "scope": "common", "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditLogger", - "text": "AuditLogger" + "section": "def-common.CoreFipsService", + "text": "CoreFipsService" } ], - "path": "packages/core/security/core-security-server/src/audit.ts", + "path": "packages/core/security/core-security-server/src/contracts.ts", "deprecated": false, "trackAdoption": false } @@ -638,163 +2294,220 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreAuthenticationService", + "id": "def-common.SecurityServiceStart", "type": "Interface", "tags": [], - "label": "CoreAuthenticationService", + "label": "SecurityServiceStart", "description": [ - "\nCore's authentication service\n" + "\nStart contract for Core's security service.\n" ], - "path": "packages/core/security/core-security-server/src/authc.ts", + "path": "packages/core/security/core-security-server/src/contracts.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreAuthenticationService.getCurrentUser", - "type": "Function", + "id": "def-common.SecurityServiceStart.authc", + "type": "Object", "tags": [], - "label": "getCurrentUser", + "label": "authc", "description": [ - "\nRetrieve the user bound to the provided request, or null if\nno user is authenticated.\n" + "\nThe {@link CoreAuthenticationService | authentication service}" ], "signature": [ - "(request: ", - { - "pluginId": "@kbn/core-http-server", - "scope": "common", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-common.KibanaRequest", - "text": "KibanaRequest" - }, - ") => ", { - "pluginId": "@kbn/core-security-common", + "pluginId": "@kbn/core-security-server", "scope": "common", - "docId": "kibKbnCoreSecurityCommonPluginApi", - "section": "def-common.AuthenticatedUser", - "text": "AuthenticatedUser" - }, - " | null" + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CoreAuthenticationService", + "text": "CoreAuthenticationService" + } ], - "path": "packages/core/security/core-security-server/src/authc.ts", + "path": "packages/core/security/core-security-server/src/contracts.ts", "deprecated": false, - "trackAdoption": false, - "children": [ + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.SecurityServiceStart.audit", + "type": "Object", + "tags": [], + "label": "audit", + "description": [ + "\nThe {@link CoreAuditService | audit service}" + ], + "signature": [ { - "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreAuthenticationService.getCurrentUser.$1", - "type": "Object", - "tags": [], - "label": "request", - "description": [ - "The request to retrieve the authenticated user for." - ], - "signature": [ - { - "pluginId": "@kbn/core-http-server", - "scope": "common", - "docId": "kibKbnCoreHttpServerPluginApi", - "section": "def-common.KibanaRequest", - "text": "KibanaRequest" - }, - "" - ], - "path": "packages/core/security/core-security-server/src/authc.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CoreAuditService", + "text": "CoreAuditService" } ], - "returnComment": [] + "path": "packages/core/security/core-security-server/src/contracts.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreFipsService", + "id": "def-common.UpdateCrossClusterAPIKeyParams", "type": "Interface", "tags": [], - "label": "CoreFipsService", - "description": [ - "\nCore's FIPS service\n" - ], - "path": "packages/core/security/core-security-server/src/fips.ts", + "label": "UpdateCrossClusterAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreFipsService.isEnabled", - "type": "Function", + "id": "def-common.UpdateCrossClusterAPIKeyParams.id", + "type": "string", "tags": [], - "label": "isEnabled", - "description": [ - "\nCheck if Kibana is configured to run in FIPS mode" + "label": "id", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateCrossClusterAPIKeyParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"cross_cluster\"" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateCrossClusterAPIKeyParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateCrossClusterAPIKeyParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], "signature": [ - "() => boolean" + "{ [key: string]: any; } | undefined" ], - "path": "packages/core/security/core-security-server/src/fips.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateCrossClusterAPIKeyParams.access", + "type": "Object", + "tags": [], + "label": "access", + "description": [], + "signature": [ + "{ search?: { names: string[]; query?: unknown; field_security?: unknown; allow_restricted_indices?: boolean | undefined; }[] | undefined; replication?: { names: string[]; }[] | undefined; }" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreSecurityDelegateContract", + "id": "def-common.UpdateRestAPIKeyParams", "type": "Interface", "tags": [], - "label": "CoreSecurityDelegateContract", - "description": [ - "\nThe contract exposed by the security provider for Core to\nconsume and re-expose via its security service.\n" - ], - "path": "packages/core/security/core-security-server/src/api_provider.ts", + "label": "UpdateRestAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreSecurityDelegateContract.authc", + "id": "def-common.UpdateRestAPIKeyParams.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateRestAPIKeyParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateRestAPIKeyParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateRestAPIKeyParams.role_descriptors", "type": "Object", "tags": [], - "label": "authc", + "label": "role_descriptors", "description": [], "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.CoreAuthenticationService", - "text": "CoreAuthenticationService" - } + "{ [x: string]: { [key: string]: unknown; }; }" ], - "path": "packages/core/security/core-security-server/src/api_provider.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.CoreSecurityDelegateContract.audit", + "id": "def-common.UpdateRestAPIKeyParams.metadata", "type": "Object", "tags": [], - "label": "audit", + "label": "metadata", "description": [], "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.CoreAuditService", - "text": "CoreAuditService" - } + "{ [key: string]: any; } | undefined" ], - "path": "packages/core/security/core-security-server/src/api_provider.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -803,138 +2516,95 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityRequestHandlerContext", + "id": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams", "type": "Interface", "tags": [], - "label": "SecurityRequestHandlerContext", + "label": "UpdateRestAPIKeyWithKibanaPrivilegesParams", "description": [], - "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityRequestHandlerContext.authc", - "type": "Object", + "id": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams.id", + "type": "string", "tags": [], - "label": "authc", + "label": "id", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams.type", + "type": "string", + "tags": [], + "label": "type", "description": [], "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuthcRequestHandlerContext", - "text": "AuthcRequestHandlerContext" - } + "\"rest\" | undefined" ], - "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityRequestHandlerContext.audit", - "type": "Object", + "id": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams.expiration", + "type": "string", "tags": [], - "label": "audit", + "label": "expiration", "description": [], "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.AuditRequestHandlerContext", - "text": "AuditRequestHandlerContext" - } + "string | undefined" ], - "path": "packages/core/security/core-security-server/src/request_handler_context.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityServiceSetup", - "type": "Interface", - "tags": [], - "label": "SecurityServiceSetup", - "description": [ - "\nSetup contract for Core's security service.\n" - ], - "path": "packages/core/security/core-security-server/src/contracts.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityServiceSetup.registerSecurityDelegate", - "type": "Function", + "id": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams.metadata", + "type": "Object", "tags": [], - "label": "registerSecurityDelegate", - "description": [ - "\nRegister the security implementation that then will be used and re-exposed by Core.\n" - ], + "label": "metadata", + "description": [], "signature": [ - "(api: ", - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.CoreSecurityDelegateContract", - "text": "CoreSecurityDelegateContract" - }, - ") => void" + "{ [key: string]: any; } | undefined" ], - "path": "packages/core/security/core-security-server/src/contracts.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityServiceSetup.registerSecurityDelegate.$1", - "type": "Object", - "tags": [], - "label": "api", - "description": [], - "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.CoreSecurityDelegateContract", - "text": "CoreSecurityDelegateContract" - } - ], - "path": "packages/core/security/core-security-server/src/contracts.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] + "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityServiceSetup.fips", + "id": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams.kibana_role_descriptors", "type": "Object", "tags": [], - "label": "fips", - "description": [ - "\nThe {@link CoreFipsService | FIPS service}" - ], + "label": "kibana_role_descriptors", + "description": [], "signature": [ + "{ [x: string]: { elasticsearch: ", { "pluginId": "@kbn/core-security-server", "scope": "common", "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.CoreFipsService", - "text": "CoreFipsService" - } + "section": "def-common.ElasticsearchPrivilegesType", + "text": "ElasticsearchPrivilegesType" + }, + " & { [key: string]: unknown; }; kibana: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.KibanaPrivilegesType", + "text": "KibanaPrivilegesType" + }, + "; }; }" ], - "path": "packages/core/security/core-security-server/src/contracts.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -943,58 +2613,40 @@ }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityServiceStart", + "id": "def-common.ValidateAPIKeyParams", "type": "Interface", "tags": [], - "label": "SecurityServiceStart", + "label": "ValidateAPIKeyParams", "description": [ - "\nStart contract for Core's security service.\n" + "\nRepresents the parameters for validating API Key credentials." ], - "path": "packages/core/security/core-security-server/src/contracts.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityServiceStart.authc", - "type": "Object", + "id": "def-common.ValidateAPIKeyParams.id", + "type": "string", "tags": [], - "label": "authc", + "label": "id", "description": [ - "\nThe {@link CoreAuthenticationService | authentication service}" - ], - "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.CoreAuthenticationService", - "text": "CoreAuthenticationService" - } + "\nUnique id for this API key" ], - "path": "packages/core/security/core-security-server/src/contracts.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/core-security-server", - "id": "def-common.SecurityServiceStart.audit", - "type": "Object", + "id": "def-common.ValidateAPIKeyParams.api_key", + "type": "string", "tags": [], - "label": "audit", + "label": "api_key", "description": [ - "\nThe {@link CoreAuditService | audit service}" - ], - "signature": [ - { - "pluginId": "@kbn/core-security-server", - "scope": "common", - "docId": "kibKbnCoreSecurityServerPluginApi", - "section": "def-common.CoreAuditService", - "text": "CoreAuditService" - } + "\nGenerated API Key (secret)" ], - "path": "packages/core/security/core-security-server/src/contracts.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -1045,6 +2697,133 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateAPIKeyParams", + "type": "Type", + "tags": [], + "label": "CreateAPIKeyParams", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateCrossClusterAPIKeyParams", + "text": "CreateCrossClusterAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.CreateAPIKeyResult", + "type": "Type", + "tags": [], + "label": "CreateAPIKeyResult", + "description": [ + "\nResponse of Kibana Create API key endpoint." + ], + "signature": [ + "SecurityCreateApiKeyResponse" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.KibanaPrivilegesType", + "type": "Type", + "tags": [], + "label": "KibanaPrivilegesType", + "description": [ + "\nType representing Kibana specific portion of the role definition." + ], + "signature": [ + "{ spaces: string[]; base?: string[] | undefined; feature?: Record | undefined; }[]" + ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateAPIKeyParams", + "type": "Type", + "tags": [], + "label": "UpdateAPIKeyParams", + "description": [ + "\nRequest body of Kibana Update API key endpoint." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateRestAPIKeyParams", + "text": "UpdateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateCrossClusterAPIKeyParams", + "text": "UpdateCrossClusterAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams", + "text": "UpdateRestAPIKeyWithKibanaPrivilegesParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/core-security-server", + "id": "def-common.UpdateAPIKeyResult", + "type": "Type", + "tags": [], + "label": "UpdateAPIKeyResult", + "description": [ + "\nResponse of Kibana Update API key endpoint." + ], + "signature": [ + "SecurityUpdateApiKeyResponse" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index e76d5d248794e..6a08b94c80e04 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; @@ -21,10 +21,13 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 52 | 0 | 16 | 0 | +| 146 | 1 | 63 | 0 | ## Common +### Functions + + ### Interfaces diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 97e9a6aa5eddb..804cabb86c046 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.devdocs.json b/api_docs/kbn_core_security_server_mocks.devdocs.json index b9910d935968b..686b62e5af8fc 100644 --- a/api_docs/kbn_core_security_server_mocks.devdocs.json +++ b/api_docs/kbn_core_security_server_mocks.devdocs.json @@ -90,6 +90,44 @@ } ], "objects": [ + { + "parentPluginId": "@kbn/core-security-server-mocks", + "id": "def-common.apiKeysMock", + "type": "Object", + "tags": [], + "label": "apiKeysMock", + "description": [], + "path": "packages/core/security/core-security-server-mocks/src/api_keys.mock.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-security-server-mocks", + "id": "def-common.apiKeysMock.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "() => jest.MockedObjectDeep<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.APIKeys", + "text": "APIKeys" + }, + ">" + ], + "path": "packages/core/security/core-security-server-mocks/src/api_keys.mock.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-security-server-mocks", "id": "def-common.auditLoggerMock", diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 4837bea5d8289..ae701990499af 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 13 | 0 | 13 | 2 | +| 15 | 0 | 15 | 2 | ## Common diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index eae8617e6fe54..70a3d735210f2 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index a9296a333acaf..50fc2868a8114 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index d4dbdd1869237..3ea24300b04bf 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 0b37e06fcc38c..c0c9aea180781 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 14e0d72778ecc..8d92cb58d7dff 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 042e552861a7a..790d150256c1d 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 02cb90067ad44..52ee66138de12 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 730e11f40bd82..7a7f7d25c8c48 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 5c82e09bc6601..487a34b3ef4c9 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index e5d18270b2904..dee2943242a7f 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 39c90eea55dc2..f2c36574705f3 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index cc711a972530a..37914f9a0f76e 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index f5e13361357f4..1494ef582037c 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index bca627eb63e23..f48fda3b2d940 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 9bd6a2f4e21f8..87b9a14ed0bd8 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index e6934d5ef4f0f..89df44e037de5 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 37c1136c9968a..61cf393dc5b22 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 208c63217e13e..3bd7e6978e429 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index d1495c6f87dfe..ee4c1be113244 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 3eeb3b2230a88..71e9fdb216c66 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 1cf3e2b8be0c4..837180b140b68 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 77ba5dec8902c..651f8f3b04c40 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 71e9dd73f06e3..e117c9b70b1b9 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index ab5718fa6d08e..cf88f775fb228 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index c9e78b7d26df7..10dafaded4540 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index ca3566253f9cf..2a3f26390cb3f 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 05792794b0a52..a9f16e272eec7 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index e56fff27beafd..520109e83ebfd 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 027d32961861c..88ea1fc2cdf9c 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index deb44c2a5a93d..ebe45ba4fb7e9 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 8a62f537cfc8e..04f0ef9bb2949 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index cb81dc195b531..69cf0df1e043c 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index a6de3df2ee8d3..c5b4476e38917 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 3612cdf26c0ca..c1465d219dd7b 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 8bd13f416db1b..6408d98650279 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 2f4fb0a2b850c..1adaa5c99a61b 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index fec53bf278c1f..1fe60a7a662b7 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index d757d1cb65f5b..5ae49ee44b2c7 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index db827308451c8..5a572d6760ccb 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 10b51c92bdbf6..2ce275aabd524 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.devdocs.json b/api_docs/kbn_data_view_utils.devdocs.json index bbef9faf79cd5..c1b48a5d1f3b4 100644 --- a/api_docs/kbn_data_view_utils.devdocs.json +++ b/api_docs/kbn_data_view_utils.devdocs.json @@ -19,6 +19,62 @@ "common": { "classes": [], "functions": [ + { + "parentPluginId": "@kbn/data-view-utils", + "id": "def-common.convertDatatableColumnToDataViewFieldSpec", + "type": "Function", + "tags": [], + "label": "convertDatatableColumnToDataViewFieldSpec", + "description": [ + "\nConvert a datatable column to a DataViewFieldSpec" + ], + "signature": [ + "(column: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + }, + ") => ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.FieldSpec", + "text": "FieldSpec" + } + ], + "path": "packages/kbn-data-view-utils/src/utils/convert_to_data_view_field_spec.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/data-view-utils", + "id": "def-common.convertDatatableColumnToDataViewFieldSpec.$1", + "type": "Object", + "tags": [], + "label": "column", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.DatatableColumn", + "text": "DatatableColumn" + } + ], + "path": "packages/kbn-data-view-utils/src/utils/convert_to_data_view_field_spec.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/data-view-utils", "id": "def-common.createRegExpPatternFrom", diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 35fcf27583c48..9c77d0b2f7f14 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 5 | 0 | 4 | 0 | +| 7 | 0 | 5 | 0 | ## Common diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index a2149161db461..c004445a6d6df 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 6516a6992e167..ead9a6580c1fc 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 81a9e07573cf9..5e49e88e15229 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 9eda3599e2dfc..85ca3b08993de 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index ed558c6f415c3..3bcb897c161c4 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 371a0d04a5484..784d7b561bd15 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.devdocs.json b/api_docs/kbn_deeplinks_observability.devdocs.json index 2a2d36cdb7282..3b151a497e3c5 100644 --- a/api_docs/kbn_deeplinks_observability.devdocs.json +++ b/api_docs/kbn_deeplinks_observability.devdocs.json @@ -22,18 +22,18 @@ "interfaces": [ { "parentPluginId": "@kbn/deeplinks-observability", - "id": "def-common.DatasetQualityLocatorParams", + "id": "def-common.DataQualityLocatorParams", "type": "Interface", "tags": [], - "label": "DatasetQualityLocatorParams", + "label": "DataQualityLocatorParams", "description": [], "signature": [ { "pluginId": "@kbn/deeplinks-observability", "scope": "common", "docId": "kibKbnDeeplinksObservabilityPluginApi", - "section": "def-common.DatasetQualityLocatorParams", - "text": "DatasetQualityLocatorParams" + "section": "def-common.DataQualityLocatorParams", + "text": "DataQualityLocatorParams" }, " extends ", { @@ -50,7 +50,7 @@ "children": [ { "parentPluginId": "@kbn/deeplinks-observability", - "id": "def-common.DatasetQualityLocatorParams.filters", + "id": "def-common.DataQualityLocatorParams.filters", "type": "Object", "tags": [], "label": "filters", @@ -61,6 +61,20 @@ "path": "packages/deeplinks/observability/locators/dataset_quality.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/deeplinks-observability", + "id": "def-common.DataQualityLocatorParams.flyout", + "type": "Object", + "tags": [], + "label": "flyout", + "description": [], + "signature": [ + "{ dataset: DatasetConfig; } | undefined" + ], + "path": "packages/deeplinks/observability/locators/dataset_quality.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -754,13 +768,13 @@ }, { "parentPluginId": "@kbn/deeplinks-observability", - "id": "def-common.DATASET_QUALITY_LOCATOR_ID", + "id": "def-common.DATA_QUALITY_LOCATOR_ID", "type": "string", "tags": [], - "label": "DATASET_QUALITY_LOCATOR_ID", + "label": "DATA_QUALITY_LOCATOR_ID", "description": [], "signature": [ - "\"DATASET_QUALITY_LOCATOR\"" + "\"DATA_QUALITY_LOCATOR\"" ], "path": "packages/deeplinks/observability/locators/dataset_quality.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 86d5dd2c3efb0..e6a307fa8b646 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 55 | 0 | 43 | 0 | +| 56 | 0 | 44 | 0 | ## Common diff --git a/api_docs/kbn_deeplinks_search.devdocs.json b/api_docs/kbn_deeplinks_search.devdocs.json index 312aad5a35d80..d3659c3bf083c 100644 --- a/api_docs/kbn_deeplinks_search.devdocs.json +++ b/api_docs/kbn_deeplinks_search.devdocs.json @@ -30,7 +30,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"appSearch\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchInferenceEndpoints\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\"" + "\"appSearch\" | \"enterpriseSearch\" | \"enterpriseSearchContent\" | \"enterpriseSearchApplications\" | \"enterpriseSearchRelevance\" | \"enterpriseSearchAnalytics\" | \"workplaceSearch\" | \"serverlessElasticsearch\" | \"serverlessConnectors\" | \"searchPlayground\" | \"searchInferenceEndpoints\" | \"searchHomepage\" | \"enterpriseSearchContent:connectors\" | \"enterpriseSearchContent:searchIndices\" | \"enterpriseSearchContent:webCrawlers\" | \"enterpriseSearchApplications:searchApplications\" | \"enterpriseSearchApplications:playground\" | \"appSearch:engines\" | \"enterpriseSearchRelevance:inferenceEndpoints\"" ], "path": "packages/deeplinks/search/deep_links.ts", "deprecated": false, @@ -114,13 +114,13 @@ }, { "parentPluginId": "@kbn/deeplinks-search", - "id": "def-common.ENTERPRISE_SEARCH_INFERENCE_ENDPOINTS_APP_ID", + "id": "def-common.ENTERPRISE_SEARCH_RELEVANCE_APP_ID", "type": "string", "tags": [], - "label": "ENTERPRISE_SEARCH_INFERENCE_ENDPOINTS_APP_ID", + "label": "ENTERPRISE_SEARCH_RELEVANCE_APP_ID", "description": [], "signature": [ - "\"enterpriseSearchInferenceEndpoints\"" + "\"enterpriseSearchRelevance\"" ], "path": "packages/deeplinks/search/constants.ts", "deprecated": false, diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 5006993ab7bf5..8a8806d97c244 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 230253c75efe9..32002cd4fabaa 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 8754e80b0c295..1230f5cd39b94 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index df1ab900aef16..3d4837d7f869d 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 45a3b76ab4b57..fd9f605ebfa8f 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index dad78c414e3ea..1bb36ed0a2d57 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 96f57d83edca9..17b6385fcb510 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index b962fe962b01a..e12d1fb934996 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 54f5461df533c..1ae344ef56f12 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 030ee2f59ebe2..01cc6e54a6d09 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 3b7a727845284..378560e2f9dbb 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 937235a9945c2..c790db3a17d38 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 079158c906b48..03b4b3317e082 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index e8eedc9b350d8..7bf4159ded7fe 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 538c23bdbfc3a..9c93ea2205a55 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt.mdx b/api_docs/kbn_ebt.mdx index 49c57c623e9df..499e44b7202ca 100644 --- a/api_docs/kbn_ebt.mdx +++ b/api_docs/kbn_ebt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt title: "@kbn/ebt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt'] --- import kbnEbtObj from './kbn_ebt.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 955875e54964e..602bef774c217 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 0d562c897bd3f..b9ffb6f6e264f 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 4bf65e3122f2c..c2ce5f9f909ca 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index f9fb2031ec976..bc572016322d8 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index f6184753a263a..b75806470bb96 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.devdocs.json b/api_docs/kbn_entities_schema.devdocs.json index cf8d585a18f80..bcb6b2ff87c2b 100644 --- a/api_docs/kbn_entities_schema.devdocs.json +++ b/api_docs/kbn_entities_schema.devdocs.json @@ -43,7 +43,7 @@ "label": "EntityDefinition", "description": [], "signature": [ - "{ id: string; type: string; name: string; history: { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; managed: boolean; indexPatterns: string[]; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "{ id: string; type: string; version: string; name: string; history: { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; managed: boolean; indexPatterns: string[]; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -221,7 +221,7 @@ "label": "entityDefinitionSchema", "description": [], "signature": [ - "Zod.ZodObject<{ id: Zod.ZodString; name: Zod.ZodString; description: Zod.ZodOptional; type: Zod.ZodString; filter: Zod.ZodOptional; indexPatterns: Zod.ZodArray; identityFields: Zod.ZodArray, Zod.ZodEffects]>, \"many\">; displayNameTemplate: Zod.ZodString; metadata: Zod.ZodOptional; limit: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { source: string; destination?: string | undefined; limit?: number | undefined; }, { source: string; destination?: string | undefined; limit?: number | undefined; }>, Zod.ZodEffects]>, \"many\">>; metrics: Zod.ZodOptional; name: Zod.ZodString; description: Zod.ZodOptional; type: Zod.ZodString; filter: Zod.ZodOptional; indexPatterns: Zod.ZodArray; identityFields: Zod.ZodArray, Zod.ZodEffects]>, \"many\">; displayNameTemplate: Zod.ZodString; metadata: Zod.ZodOptional; limit: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { source: string; destination?: string | undefined; limit?: number | undefined; }, { source: string; destination?: string | undefined; limit?: number | undefined; }>, Zod.ZodEffects]>, \"many\">>; metrics: Zod.ZodOptional, \"many\">>; staticFields: Zod.ZodOptional>; managed: Zod.ZodDefault>; history: Zod.ZodObject<{ timestampField: Zod.ZodString; interval: Zod.ZodEffects, moment.Duration, string>; lookbackPeriod: Zod.ZodOptional>; settings: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }, { interval: string; timestampField: string; lookbackPeriod?: string | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>; latest: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }, { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { id: string; type: string; name: string; history: { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; managed: boolean; indexPatterns: string[]; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }>, \"many\">>; staticFields: Zod.ZodOptional>; managed: Zod.ZodDefault>; history: Zod.ZodObject<{ timestampField: Zod.ZodString; interval: Zod.ZodEffects, moment.Duration, string>; lookbackPeriod: Zod.ZodOptional>; settings: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }, { interval: string; timestampField: string; lookbackPeriod?: string | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>; latest: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }, { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { id: string; type: string; version: string; name: string; history: { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; managed: boolean; indexPatterns: string[]; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -269,7 +269,7 @@ "section": "def-common.BasicAggregations", "text": "BasicAggregations" }, - "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; latest?: { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; } | undefined; }, { id: string; type: string; name: string; history: { interval: string; timestampField: string; lookbackPeriod?: string | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; indexPatterns: string[]; identityFields: (string | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: (string | { source: string; destination?: string | undefined; limit?: number | undefined; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; latest?: { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; } | undefined; }, { id: string; type: string; version: string; name: string; history: { interval: string; timestampField: string; lookbackPeriod?: string | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; indexPatterns: string[]; identityFields: (string | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: (string | { source: string; destination?: string | undefined; limit?: number | undefined; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -467,6 +467,21 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.semVerSchema", + "type": "Object", + "tags": [], + "label": "semVerSchema", + "description": [], + "signature": [ + "Zod.ZodEffects" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/common.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ] } diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 03a08d0d54cf2..db23747c07d57 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 18 | 0 | 18 | 0 | +| 19 | 0 | 19 | 0 | ## Common diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 7cf1b70304a8f..74e15499c98c8 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 58d019d0bf8fa..e0bdec105a323 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index acfaba698e7fa..bb67567945bfc 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 2a985320900f7..09fa30e666064 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 82d8789b63717..bd52515236889 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index ae03b6127e3d0..996cdd292a3c2 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.devdocs.json b/api_docs/kbn_esql_ast.devdocs.json index ba60e35d615c3..9811a14a8fa62 100644 --- a/api_docs/kbn_esql_ast.devdocs.json +++ b/api_docs/kbn_esql_ast.devdocs.json @@ -341,7 +341,13 @@ "text": "ESQLAstNode" }, "[]) => ", - "ESQLParamLiteral", + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLParamLiteral", + "text": "ESQLParamLiteral" + }, "[]" ], "path": "packages/kbn-esql-ast/src/walker/walker.ts", @@ -1508,6 +1514,88 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.ESQLParamLiteral", + "type": "Interface", + "tags": [], + "label": "ESQLParamLiteral", + "description": [], + "signature": [ + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLParamLiteral", + "text": "ESQLParamLiteral" + }, + " extends ", + "ESQLAstBaseItem", + "" + ], + "path": "packages/kbn-esql-ast/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.ESQLParamLiteral.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"literal\"" + ], + "path": "packages/kbn-esql-ast/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.ESQLParamLiteral.literalType", + "type": "string", + "tags": [], + "label": "literalType", + "description": [], + "signature": [ + "\"param\"" + ], + "path": "packages/kbn-esql-ast/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.ESQLParamLiteral.paramType", + "type": "Uncategorized", + "tags": [], + "label": "paramType", + "description": [], + "signature": [ + "ParamType" + ], + "path": "packages/kbn-esql-ast/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-ast", + "id": "def-common.ESQLParamLiteral.value", + "type": "CompoundType", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string | number" + ], + "path": "packages/kbn-esql-ast/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/esql-ast", "id": "def-common.ESQLSource", @@ -2015,7 +2103,13 @@ " | ", "ESQLStringLiteral", " | ", - "ESQLParamLiteral", + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLParamLiteral", + "text": "ESQLParamLiteral" + }, "" ], "path": "packages/kbn-esql-ast/src/types.ts", diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 409e43359b6b8..c26af5141e0d2 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 99 | 1 | 96 | 11 | +| 104 | 1 | 101 | 10 | ## Common diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 0aac396b0a5e5..d4ce11a10185b 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.devdocs.json b/api_docs/kbn_esql_validation_autocomplete.devdocs.json index 79100a05ac285..56830eaa4f756 100644 --- a/api_docs/kbn_esql_validation_autocomplete.devdocs.json +++ b/api_docs/kbn_esql_validation_autocomplete.devdocs.json @@ -628,7 +628,13 @@ " | ", "ESQLStringLiteral", " | ", - "ESQLParamLiteral", + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLParamLiteral", + "text": "ESQLParamLiteral" + }, " | ", { "pluginId": "@kbn/esql-ast", @@ -740,7 +746,13 @@ " | ", "ESQLStringLiteral", " | ", - "ESQLParamLiteral", + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLParamLiteral", + "text": "ESQLParamLiteral" + }, " | ", { "pluginId": "@kbn/esql-ast", @@ -836,7 +848,13 @@ " | ", "ESQLStringLiteral", " | ", - "ESQLParamLiteral", + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLParamLiteral", + "text": "ESQLParamLiteral" + }, " | ", { "pluginId": "@kbn/esql-ast", @@ -940,7 +958,13 @@ " | ", "ESQLStringLiteral", " | ", - "ESQLParamLiteral", + { + "pluginId": "@kbn/esql-ast", + "scope": "common", + "docId": "kibKbnEsqlAstPluginApi", + "section": "def-common.ESQLParamLiteral", + "text": "ESQLParamLiteral" + }, " | ", { "pluginId": "@kbn/esql-ast", diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 54d5544dfae3a..6005c598f9798 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 90452a569323b..9e6436015f568 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 022224ae64082..675787e44b485 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index dffd8f52dd155..7c31260958bbf 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index dc400e31bde16..6c08526725b10 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 23af3158f039a..7dd29ed4b3ee6 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 7ab020263de7e..421592b70fbe8 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 197ec0ddd43d8..1a6c7b6f84ffe 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index e56080047a545..bbe87749889cf 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index fdb06c43b4393..2a0ffa26fcef8 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 48b9532c8c240..774fe7fb04566 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index b0282d6e6fe6b..6e8b03b091596 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 5c4d3964ae8aa..fdcf2f4d89afa 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 945768bb9e590..a495ad1c6d2e0 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 3ddd9004d5bd9..34e162a443d28 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 9a04a6ac2d41a..094412e8b5682 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index bd0f10e3f2f7a..c34e4c3ea3f07 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 20b2eae2f7b3a..12426866b6e81 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index f8905056b6964..8a5f9c1afce58 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 3d1c353f16c2d..e08496320d2a2 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index e26e50409e91a..9a5a1047820c9 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index cc84a9d96eff2..b060a6760686e 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 5ffa24e29075d..c47b58d8e3bf9 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 67ce5e8cc6dfe..85e08645d5779 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 9482370f2098e..1e743744d845d 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 5942980525cf1..8b4de71f7ddbe 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 9f75bdc13c9cc..64123585efa90 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 8b86cea224f66..e4ab643d9af9d 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 7191c53657e0c..b23b257e4101c 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 885a833b848e8..a3f7c87931519 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 06baa35ff2d4b..9e177417e52a5 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index c4bf0298cab27..5f427ab32ad72 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index d17b72c5d78a3..f5453b314c11a 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 7b7504802df25..1ea1f37beabe6 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index ac6609227b665..1b47ad998cf41 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 850a3c590f8fb..96583dd6dcac9 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 5ec041d5c749c..b7c542d83bb2f 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index d3a88fe215040..5091928b66778 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 9c41b224c50fe..12b7a262dd653 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index b89de140a27b3..77c4bac229828 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 7a27ffffde80c..a1dab6d429a7d 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 18176ee9ca602..1f3a24ca87355 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index b4b296032e909..1718efdec3a87 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index a6c83fb1bc8f4..db9cee8230a0d 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index ce2df8e5b25cb..8a805df3d3a39 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index ac523aa0416dd..db8386221e335 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 8a64499c8321e..02363df9d634b 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index bfed7b76b6060..7aebba7095217 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 784348ccc434a..71eb1446f75b9 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 087ad1b156eca..7c1e5e14dcc2a 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 04e967817f5be..45119a3317a4b 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 0b299726b544d..e048b8839f2a2 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 78c19265dc11f..5002ea91da03f 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 97d381b8e263c..85b4d01c8731d 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index b3383c6fc054b..bfccdc8d37f70 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index ff022fd4098b4..daf0cea9ed7a2 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 61537f4a1be4c..1dc34236ad32e 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 1006c08221c4b..1e8a952d47927 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index f9c0a41562641..363be1682f841 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 7244fc9f1399f..632420bf2fad9 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 55b9791fa2733..7cdc4e877f2cf 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 65980b4809fb9..da8839726a176 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 02491f27034d1..606ce4780c701 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 45eff4760ee26..0bbdd8a7357e6 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index ab69959755eca..730aebc4e4093 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 97f5b22c20e03..ab23d4ca1a5c9 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 0aa6a9294274c..9091ae8ebd0d0 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 5bc58b4ab29e7..bf66b55a15af0 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 30078356d43ff..527409b93aa1e 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index c2fab682158a4..ade93f4976d2d 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 0e71ba311f3cc..e8b45372798be 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 835039597aa7f..39db829036539 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 0d109f34bc4f5..569858f1cca62 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index efad24db23069..c80056ab85de0 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index c1fece43923f3..a5355d0238ee7 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 74644502aff39..06e09a80c911a 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 97462d503b78b..5f357c296b794 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 1c39672f5e2df..c0c8dd81f2209 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index acf4af07efdb0..6b6707e0a21e9 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index cb29649614e39..0db0964faef93 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 6b6e2fe6d34fd..7ca46a3d4ede8 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 88ac70409c110..c5fdd3a40296a 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index cb50c19d04a9a..b535d75a8af00 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index dee6a9dcb4281..c096003007485 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index c405579e9f465..e35bff754e051 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 9924c95c9a34e..7f044e2b150b1 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index 2014c95c4c348..dfe0d2671b37c 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 61e6f419b90f8..c245d9a606f1e 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index 422af3b6140e3..aec8f452011b9 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 722df1697e829..6d9e606ebd8eb 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 7dbae17bcf545..8a70b608998e2 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 19c3bd2cc9ed4..eee329fa9599b 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index c9725297c9842..1a08570e9a503 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 0a9ec50d257a4..910dc86ec01c8 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 87ce43cac874d..71f2af8f818f9 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 696f801a977e9..54fcf8a30cdc3 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index b142fbb353f28..9e208e0540f25 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index e0f7bb5acdade..846d4679f21df 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 72b2179b51701..275699efbbedb 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 4842e6a2b5661..3362789482740 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 951256c39e536..5328846f12fe3 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 71f7a6297be1a..6ef174063cebd 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 9d129916ceec2..7ea167bd57b8e 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index d43937348fb60..769ead4b28a35 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 88d9bf660bd00..e87259ceaaf00 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index d435ea6427be6..469defcaff4d3 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 63a01de311743..4525093694536 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 65978f536556a..9c7c73a5f7eb1 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index b7631257ad219..e10de0f6f3056 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.devdocs.json b/api_docs/kbn_recently_accessed.devdocs.json new file mode 100644 index 0000000000000..972588291edf7 --- /dev/null +++ b/api_docs/kbn_recently_accessed.devdocs.json @@ -0,0 +1,269 @@ +{ + "id": "@kbn/recently-accessed", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [ + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessedService", + "type": "Class", + "tags": [], + "label": "RecentlyAccessedService", + "description": [], + "path": "packages/kbn-recently-accessed/src/recently_accessed_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessedService.start", + "type": "Function", + "tags": [], + "label": "start", + "description": [], + "signature": [ + "({ http, key }: StartDeps) => ", + { + "pluginId": "@kbn/recently-accessed", + "scope": "common", + "docId": "kibKbnRecentlyAccessedPluginApi", + "section": "def-common.RecentlyAccessed", + "text": "RecentlyAccessed" + } + ], + "path": "packages/kbn-recently-accessed/src/recently_accessed_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessedService.start.$1", + "type": "Object", + "tags": [], + "label": "{ http, key }", + "description": [], + "signature": [ + "StartDeps" + ], + "path": "packages/kbn-recently-accessed/src/recently_accessed_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [ + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessed", + "type": "Interface", + "tags": [], + "label": "RecentlyAccessed", + "description": [ + "\n{@link RecentlyAccessed | APIs} for recently accessed history." + ], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessed.add", + "type": "Function", + "tags": [], + "label": "add", + "description": [ + "\nAdds a new item to the recently accessed history.\n" + ], + "signature": [ + "(link: string, label: string, id: string) => void" + ], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessed.add.$1", + "type": "string", + "tags": [], + "label": "link", + "description": [ + "a relative URL to the resource (not including the {@link HttpStart.basePath | `http.basePath`})" + ], + "signature": [ + "string" + ], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessed.add.$2", + "type": "string", + "tags": [], + "label": "label", + "description": [ + "the label to display in the UI" + ], + "signature": [ + "string" + ], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessed.add.$3", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "a unique string used to de-duplicate the recently accessed list." + ], + "signature": [ + "string" + ], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessed.get", + "type": "Function", + "tags": [], + "label": "get", + "description": [ + "\nGets an Array of the current recently accessed history.\n" + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/recently-accessed", + "scope": "common", + "docId": "kibKbnRecentlyAccessedPluginApi", + "section": "def-common.RecentlyAccessedHistoryItem", + "text": "RecentlyAccessedHistoryItem" + }, + "[]" + ], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessed.get$", + "type": "Function", + "tags": [], + "label": "get$", + "description": [ + "\nGets an Observable of the array of recently accessed history.\n" + ], + "signature": [ + "() => ", + "Observable", + "<", + { + "pluginId": "@kbn/recently-accessed", + "scope": "common", + "docId": "kibKbnRecentlyAccessedPluginApi", + "section": "def-common.RecentlyAccessedHistoryItem", + "text": "RecentlyAccessedHistoryItem" + }, + "[]>" + ], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessedHistoryItem", + "type": "Interface", + "tags": [], + "label": "RecentlyAccessedHistoryItem", + "description": [], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessedHistoryItem.link", + "type": "string", + "tags": [], + "label": "link", + "description": [], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessedHistoryItem.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/recently-accessed", + "id": "def-common.RecentlyAccessedHistoryItem.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/kbn-recently-accessed/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx new file mode 100644 index 0000000000000..ecdd49ce284cb --- /dev/null +++ b/api_docs/kbn_recently_accessed.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnRecentlyAccessedPluginApi +slug: /kibana-dev-docs/api/kbn-recently-accessed +title: "@kbn/recently-accessed" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/recently-accessed plugin +date: 2024-07-10 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] +--- +import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 14 | 0 | 7 | 0 | + +## Common + +### Classes + + +### Interfaces + + diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index f1fa3104d03fa..9e448cd5df8d9 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index f4cdffdcac021..63f06084fc55a 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index caa046bede436..fcd60fbf61417 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index c0ae43523df83..1930243290861 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index eb7e0c948d4b2..a7901d9ecdf41 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index d099fee886f5c..8013b2c585286 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index ecdc0f512a625..a7e19c8f8815c 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 2e185bd3e9c09..0311edc4a8554 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 77a9baff0a4e7..e6dce93a89500 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index f03e1164abca5..a570271c52a7d 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index d668328d20e23..48a3dd740958a 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 8ce4258543b46..d886a858f369e 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 8712180c101d5..cd5bd0462b403 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index f52846975e606..9365b7b86b4f7 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index 6f7f12a59850f..d52b51314d80e 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index be41eba0c6a6c..86aa9a218ab13 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index b2289667ccc4e..88a57b7b4635d 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 3c983f8067808..f8f10883aa806 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index 99a5af6503be7..2a815b0d45a47 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 4962e236dd470..68054b59c5003 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 9361a07a5911f..418bb52e19f8c 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 54d0ccd633422..11286b6e453a1 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 77115422dbec4..21340cf60f9b9 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index d241357c284f9..96958af47e9eb 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index de2ea6e888589..2e038b0b4f076 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index e2e90e6248dea..aeef4d14be70b 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 5009b6f1dd922..ad3f912e30ba8 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 7a39ecf13f580..4b91e9d44176a 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index cd01e2a84fc1d..81fd7b1d386ea 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 51cb27c0dced7..26ff8eb125c38 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.devdocs.json b/api_docs/kbn_security_api_key_management.devdocs.json index 5fd86dcf3f8c8..661a3acf9b5c9 100644 --- a/api_docs/kbn_security_api_key_management.devdocs.json +++ b/api_docs/kbn_security_api_key_management.devdocs.json @@ -186,10 +186,10 @@ "signature": [ "(apiKey: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CreateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", "text": "CreateAPIKeyParams" }, ") => Promise<", @@ -209,10 +209,10 @@ "description": [], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CreateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", "text": "CreateAPIKeyParams" } ], @@ -234,10 +234,10 @@ "signature": [ "(apiKey: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.UpdateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", "text": "UpdateAPIKeyParams" }, ") => Promise<", @@ -257,10 +257,10 @@ "description": [], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.UpdateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", "text": "UpdateAPIKeyParams" } ], @@ -532,10 +532,10 @@ }, ") => ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CreateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", "text": "CreateAPIKeyParams" } ], @@ -586,10 +586,10 @@ }, ") => ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.UpdateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", "text": "UpdateAPIKeyParams" } ], @@ -976,7 +976,7 @@ "label": "sort", "description": [], "signature": [ - "{ field: \"id\" | \"type\" | \"name\" | \"username\" | \"profile_uid\" | \"metadata\" | \"expired\" | \"creation\" | \"expiration\" | \"role_descriptors\" | \"realm\" | \"invalidated\" | \"realm_type\" | \"limited_by\" | \"_sort\"; direction: \"asc\" | \"desc\"; }" + "{ field: \"id\" | \"type\" | \"name\" | \"username\" | \"profile_uid\" | \"metadata\" | \"expired\" | \"creation\" | \"realm\" | \"role_descriptors\" | \"expiration\" | \"invalidated\" | \"realm_type\" | \"limited_by\" | \"_sort\"; direction: \"asc\" | \"desc\"; }" ], "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", "deprecated": false, @@ -1131,9 +1131,31 @@ "label": "CreateAPIKeyParams", "description": [], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateCrossClusterAPIKeyParams", + "text": "CreateCrossClusterAPIKeyParams" + } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1150,7 +1172,7 @@ "signature": [ "SecurityCreateApiKeyResponse" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1163,7 +1185,7 @@ "label": "QueryApiKeySortOptions", "description": [], "signature": [ - "{ field: \"id\" | \"type\" | \"name\" | \"username\" | \"profile_uid\" | \"metadata\" | \"expired\" | \"creation\" | \"expiration\" | \"role_descriptors\" | \"realm\" | \"invalidated\" | \"realm_type\" | \"limited_by\" | \"_sort\"; direction: \"asc\" | \"desc\"; }" + "{ field: \"id\" | \"type\" | \"name\" | \"username\" | \"profile_uid\" | \"metadata\" | \"expired\" | \"creation\" | \"realm\" | \"role_descriptors\" | \"expiration\" | \"invalidated\" | \"realm_type\" | \"limited_by\" | \"_sort\"; direction: \"asc\" | \"desc\"; }" ], "path": "x-pack/packages/security/api_key_management/src/components/api_keys_api_client.ts", "deprecated": false, @@ -1180,9 +1202,31 @@ "\nRequest body of Kibana Update API key endpoint." ], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; role_descriptors: Record>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; type: \"cross_cluster\"; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>" + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateRestAPIKeyParams", + "text": "UpdateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateCrossClusterAPIKeyParams", + "text": "UpdateCrossClusterAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams", + "text": "UpdateRestAPIKeyWithKibanaPrivilegesParams" + } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1199,7 +1243,7 @@ "signature": [ "SecurityUpdateApiKeyResponse" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 9c95241ecaa83..398771a54e6eb 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 27f10f009c4d4..8339f1657ea66 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index bf16364236051..67ea2e26e2732 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index ace424adb9be5..cbf7d1e0325c6 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 654c86d26238b..2b9bf0f8a94c8 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.devdocs.json b/api_docs/kbn_security_plugin_types_server.devdocs.json index dbd001d28def1..7650af308a8fd 100644 --- a/api_docs/kbn_security_plugin_types_server.devdocs.json +++ b/api_docs/kbn_security_plugin_types_server.devdocs.json @@ -62,15 +62,15 @@ "label": "getRestApiKeyWithKibanaPrivilegesSchema", "description": [], "signature": [ - "(getBasePrivilegeNames: () => { global: string[]; space: string[]; }) => ExtendedObjectType<{ type: ", + "(getBasePrivilegeNames: () => { global: string[]; space: string[]; }) => ", { "pluginId": "@kbn/config-schema", "scope": "common", "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" + "section": "def-common.ObjectType", + "text": "ObjectType" }, - "<\"rest\" | undefined>; name: ", + "<{ type: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -78,7 +78,7 @@ "section": "def-common.Type", "text": "Type" }, - "; expiration: ", + "<\"rest\" | undefined>; name: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -86,7 +86,7 @@ "section": "def-common.Type", "text": "Type" }, - "; role_descriptors: ", + "; expiration: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -94,7 +94,7 @@ "section": "def-common.Type", "text": "Type" }, - ">>; metadata: ", + "; metadata: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -102,7 +102,7 @@ "section": "def-common.Type", "text": "Type" }, - " | undefined>; }, { role_descriptors: null; kibana_role_descriptors: ", + " | undefined>; kibana_role_descriptors: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -143,23 +143,15 @@ "label": "getUpdateRestApiKeyWithKibanaPrivilegesSchema", "description": [], "signature": [ - "(getBasePrivilegeNames: () => { global: string[]; space: string[]; }) => ExtendedObjectType<{ type: ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - "<\"rest\" | undefined>; name: ", + "(getBasePrivilegeNames: () => { global: string[]; space: string[]; }) => ", { "pluginId": "@kbn/config-schema", "scope": "common", "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" + "section": "def-common.ObjectType", + "text": "ObjectType" }, - "; expiration: ", + "<{ type: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -167,7 +159,7 @@ "section": "def-common.Type", "text": "Type" }, - "; role_descriptors: ", + "<\"rest\" | undefined>; expiration: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -175,7 +167,7 @@ "section": "def-common.Type", "text": "Type" }, - ">>; metadata: ", + "; metadata: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -183,7 +175,7 @@ "section": "def-common.Type", "text": "Type" }, - " | undefined>; }, { role_descriptors: null; name: null; id: ", + " | undefined>; id: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -223,6 +215,39 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.isCreateRestAPIKeyParams", + "type": "Function", + "tags": [], + "label": "isCreateRestAPIKeyParams", + "description": [], + "signature": [ + "(params: any) => boolean" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.isCreateRestAPIKeyParams.$1", + "type": "Any", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "any" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [ @@ -536,8 +561,10 @@ "type": "Interface", "tags": [], "label": "APIKeys", - "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "description": [ + "\nInterface for managing API keys in Elasticsearch, including creation,\nvalidation, and invalidation of API keys,\nas well as checking the status of API key features." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -553,7 +580,7 @@ "signature": [ "() => Promise" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -571,7 +598,7 @@ "signature": [ "() => Promise" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -597,17 +624,17 @@ }, ", createParams: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CreateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", "text": "CreateAPIKeyParams" }, ") => Promise<", "SecurityCreateApiKeyResponse", " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -630,7 +657,7 @@ }, "" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -646,14 +673,98 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CreateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", "text": "CreateAPIKeyParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.update", + "type": "Function", + "tags": [], + "label": "update", + "description": [ + "\nAttempts update an API key with the provided 'role_descriptors' and 'metadata'\n\nReturns `updated`, `true` if the update was successful, `false` if there was nothing to update\n\nUser needs `manage_api_key` privilege to update REST API keys and `manage_security` for cross-cluster API keys.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", updateParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + }, + ") => Promise<", + "SecurityUpdateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.update.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.update.$2", + "type": "CompoundType", + "tags": [], + "label": "updateParams", + "description": [ + "The params to edit an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -679,17 +790,33 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - ", createParams: Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>) => Promise<", + ", createParams: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.GrantAPIKeyResult", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.GrantAPIKeyResult", "text": "GrantAPIKeyResult" }, " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -712,7 +839,7 @@ }, "" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -727,9 +854,23 @@ "Create operation parameters." ], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>" + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -749,15 +890,15 @@ "signature": [ "(apiKeyPrams: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.ValidateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", "text": "ValidateAPIKeyParams" }, ") => Promise" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -772,14 +913,14 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.ValidateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", "text": "ValidateAPIKeyParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -807,23 +948,23 @@ }, ", params: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" }, ") => Promise<", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeyResult", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", "text": "InvalidateAPIKeyResult" }, " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -846,7 +987,7 @@ }, "" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -862,14 +1003,14 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -889,23 +1030,23 @@ "signature": [ "(params: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" }, ") => Promise<", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeyResult", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", "text": "InvalidateAPIKeyResult" }, " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -920,14 +1061,14 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -940,45 +1081,569 @@ }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.AppActions", + "id": "def-server.APIKeys", "type": "Interface", "tags": [], - "label": "AppActions", - "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/app.ts", + "label": "APIKeys", + "description": [ + "\nInterface for managing API keys in Elasticsearch, including creation,\nvalidation, and invalidation of API keys,\nas well as checking the status of API key features." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.AppActions.get", + "id": "def-server.APIKeys.areAPIKeysEnabled", "type": "Function", "tags": [], - "label": "get", - "description": [], + "label": "areAPIKeysEnabled", + "description": [ + "\nDetermines if API Keys are enabled in Elasticsearch." + ], "signature": [ - "(operation: string) => string" + "() => Promise" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/app.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.AppActions.get.$1", - "type": "string", - "tags": [], - "label": "operation", - "description": [], - "signature": [ - "string" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/app.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.areCrossClusterAPIKeysEnabled", + "type": "Function", + "tags": [], + "label": "areCrossClusterAPIKeysEnabled", + "description": [ + "\nDetermines if Cross-Cluster API Keys are enabled in Elasticsearch." + ], + "signature": [ + "() => Promise" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [ + "\nTries to create an API key for the current user.\n\nReturns newly created API key or `null` if API keys are disabled.\n\nUser needs `manage_api_key` privilege to create REST API keys and `manage_security` for Cross-Cluster API keys.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", createParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + }, + ") => Promise<", + "SecurityCreateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.create.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.create.$2", + "type": "CompoundType", + "tags": [], + "label": "createParams", + "description": [ + "The params to create an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", + "text": "CreateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.update", + "type": "Function", + "tags": [], + "label": "update", + "description": [ + "\nAttempts update an API key with the provided 'role_descriptors' and 'metadata'\n\nReturns `updated`, `true` if the update was successful, `false` if there was nothing to update\n\nUser needs `manage_api_key` privilege to update REST API keys and `manage_security` for cross-cluster API keys.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", updateParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + }, + ") => Promise<", + "SecurityUpdateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.update.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.update.$2", + "type": "CompoundType", + "tags": [], + "label": "updateParams", + "description": [ + "The params to edit an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.grantAsInternalUser", + "type": "Function", + "tags": [], + "label": "grantAsInternalUser", + "description": [ + "\nTries to grant an API key for the current user." + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", createParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.GrantAPIKeyResult", + "text": "GrantAPIKeyResult" + }, + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.grantAsInternalUser.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.grantAsInternalUser.$2", + "type": "CompoundType", + "tags": [], + "label": "createParams", + "description": [ + "Create operation parameters." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.validate", + "type": "Function", + "tags": [], + "label": "validate", + "description": [ + "\nTries to validate an API key." + ], + "signature": [ + "(apiKeyPrams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", + "text": "ValidateAPIKeyParams" + }, + ") => Promise" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.validate.$1", + "type": "Object", + "tags": [], + "label": "apiKeyPrams", + "description": [ + "ValidateAPIKeyParams." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", + "text": "ValidateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.invalidate", + "type": "Function", + "tags": [], + "label": "invalidate", + "description": [ + "\nTries to invalidate an API keys." + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", params: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", + "text": "InvalidateAPIKeyResult" + }, + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.invalidate.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.invalidate.$2", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "The params to invalidate an API keys." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.invalidateAsInternalUser", + "type": "Function", + "tags": [], + "label": "invalidateAsInternalUser", + "description": [ + "\nTries to invalidate the API keys by using the internal user." + ], + "signature": [ + "(params: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", + "text": "InvalidateAPIKeyResult" + }, + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.APIKeys.invalidateAsInternalUser.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "The params to invalidate the API keys." + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", + "text": "InvalidateAPIKeysParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.AppActions", + "type": "Interface", + "tags": [], + "label": "AppActions", + "description": [], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/app.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.AppActions.get", + "type": "Function", + "tags": [], + "label": "get", + "description": [], + "signature": [ + "(operation: string) => string" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/app.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.AppActions.get.$1", + "type": "string", + "tags": [], + "label": "operation", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/app.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], "returnComment": [] } ], @@ -1550,10 +2215,10 @@ "description": [], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.APIKeys", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.APIKeys", "text": "APIKeys" } ], @@ -2169,35 +2834,257 @@ }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivileges.globally", + "id": "def-server.CheckPrivileges.globally", + "type": "Function", + "tags": [], + "label": "globally", + "description": [], + "signature": [ + "(privileges: ", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CheckPrivilegesPayload", + "text": "CheckPrivilegesPayload" + }, + ", options?: ", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CheckPrivilegesOptions", + "text": "CheckPrivilegesOptions" + }, + " | undefined) => Promise<", + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CheckPrivilegesResponse", + "text": "CheckPrivilegesResponse" + }, + ">" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivileges.globally.$1", + "type": "Object", + "tags": [], + "label": "privileges", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CheckPrivilegesPayload", + "text": "CheckPrivilegesPayload" + } + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivileges.globally.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-server", + "scope": "server", + "docId": "kibKbnSecurityPluginTypesServerPluginApi", + "section": "def-server.CheckPrivilegesOptions", + "text": "CheckPrivilegesOptions" + }, + " | undefined" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesOptions", + "type": "Interface", + "tags": [], + "label": "CheckPrivilegesOptions", + "description": [ + "\nOptions to influce the privilege checks." + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesOptions.requireLoginAction", + "type": "CompoundType", + "tags": [], + "label": "requireLoginAction", + "description": [ + "\nWhether or not the `login` action should be required (default: true).\nSetting this to false is not advised except for special circumstances, when you do not require\nthe request to belong to a user capable of logging into Kibana." + ], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesPayload", + "type": "Interface", + "tags": [], + "label": "CheckPrivilegesPayload", + "description": [ + "\nPrivileges that can be checked for the Kibana users." + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesPayload.kibana", + "type": "CompoundType", + "tags": [], + "label": "kibana", + "description": [ + "\nA list of the Kibana specific privileges (usually generated with `security.authz.actions.*.get(...)`)." + ], + "signature": [ + "string | string[] | undefined" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesPayload.elasticsearch", + "type": "Object", + "tags": [], + "label": "elasticsearch", + "description": [ + "\nA set of the Elasticsearch cluster and index privileges." + ], + "signature": [ + "{ cluster: string[]; index: Record; } | undefined" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesResponse", + "type": "Interface", + "tags": [], + "label": "CheckPrivilegesResponse", + "description": [], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesResponse.hasAllRequested", + "type": "boolean", + "tags": [], + "label": "hasAllRequested", + "description": [], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesResponse.username", + "type": "string", + "tags": [], + "label": "username", + "description": [], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckPrivilegesResponse.privileges", + "type": "Object", + "tags": [], + "label": "privileges", + "description": [], + "signature": [ + "{ kibana: { resource?: string | undefined; privilege: string; authorized: boolean; }[]; elasticsearch: { cluster: { privilege: string; authorized: boolean; }[]; index: { [indexName: string]: { privilege: string; authorized: boolean; }[]; }; }; }" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckUserProfilesPrivileges", + "type": "Interface", + "tags": [], + "label": "CheckUserProfilesPrivileges", + "description": [ + "\nAn interface to check users profiles privileges in a specific context (only a single-space context is supported at\nthe moment)." + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckUserProfilesPrivileges.atSpace", "type": "Function", "tags": [], - "label": "globally", + "label": "atSpace", "description": [], "signature": [ - "(privileges: ", - { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckPrivilegesPayload", - "text": "CheckPrivilegesPayload" - }, - ", options?: ", + "(spaceId: string, privileges: ", { "pluginId": "@kbn/security-plugin-types-server", "scope": "server", "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckPrivilegesOptions", - "text": "CheckPrivilegesOptions" + "section": "def-server.CheckUserProfilesPrivilegesPayload", + "text": "CheckUserProfilesPrivilegesPayload" }, - " | undefined) => Promise<", + ") => Promise<", { "pluginId": "@kbn/security-plugin-types-server", "scope": "server", "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckPrivilegesResponse", - "text": "CheckPrivilegesResponse" + "section": "def-server.CheckUserProfilesPrivilegesResponse", + "text": "CheckUserProfilesPrivilegesResponse" }, ">" ], @@ -2207,19 +3094,13 @@ "children": [ { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivileges.globally.$1", - "type": "Object", + "id": "def-server.CheckUserProfilesPrivileges.atSpace.$1", + "type": "string", "tags": [], - "label": "privileges", + "label": "spaceId", "description": [], "signature": [ - { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckPrivilegesPayload", - "text": "CheckPrivilegesPayload" - } + "string" ], "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", "deprecated": false, @@ -2228,25 +3109,24 @@ }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivileges.globally.$2", + "id": "def-server.CheckUserProfilesPrivileges.atSpace.$2", "type": "Object", "tags": [], - "label": "options", + "label": "privileges", "description": [], "signature": [ { "pluginId": "@kbn/security-plugin-types-server", "scope": "server", "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckPrivilegesOptions", - "text": "CheckPrivilegesOptions" - }, - " | undefined" + "section": "def-server.CheckUserProfilesPrivilegesPayload", + "text": "CheckUserProfilesPrivilegesPayload" + } ], "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", "deprecated": false, "trackAdoption": false, - "isRequired": false + "isRequired": true } ], "returnComment": [] @@ -2256,12 +3136,12 @@ }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesOptions", + "id": "def-server.CheckUserProfilesPrivilegesPayload", "type": "Interface", "tags": [], - "label": "CheckPrivilegesOptions", + "label": "CheckUserProfilesPrivilegesPayload", "description": [ - "\nOptions to influce the privilege checks." + "\nPrivileges that can be checked for the users profiles (only Kibana specific privileges are supported at the moment)." ], "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", "deprecated": false, @@ -2269,65 +3149,227 @@ "children": [ { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesOptions.requireLoginAction", - "type": "CompoundType", + "id": "def-server.CheckUserProfilesPrivilegesPayload.kibana", + "type": "Array", "tags": [], - "label": "requireLoginAction", + "label": "kibana", "description": [ - "\nWhether or not the `login` action should be required (default: true).\nSetting this to false is not advised except for special circumstances, when you do not require\nthe request to belong to a user capable of logging into Kibana." + "\nA list of the Kibana specific privileges (usually generated with `security.authz.actions.*.get(...)`)." ], "signature": [ - "boolean | undefined" + "string[]" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckUserProfilesPrivilegesResponse", + "type": "Interface", + "tags": [], + "label": "CheckUserProfilesPrivilegesResponse", + "description": [ + "\nResponse of the check privileges operation for the users profiles." + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckUserProfilesPrivilegesResponse.hasPrivilegeUids", + "type": "Array", + "tags": [], + "label": "hasPrivilegeUids", + "description": [ + "\nThe subset of the requested profile IDs of the users that have all the requested privileges." + ], + "signature": [ + "string[]" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CheckUserProfilesPrivilegesResponse.errors", + "type": "Object", + "tags": [], + "label": "errors", + "description": [ + "\nAn errors object that may be returned from ES that contains a `count` of UIDs that have errors in the `details` property.\n\nEach entry in `details` will contain an error `type`, e.g 'resource_not_found_exception', and a `reason` message, e.g. 'profile document not found'" + ], + "signature": [ + "{ count: number; details: Record; } | undefined" ], "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", "deprecated": false, "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesPayload", - "type": "Interface", - "tags": [], - "label": "CheckPrivilegesPayload", - "description": [ - "\nPrivileges that can be checked for the Kibana users." - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateCrossClusterAPIKeyParams", + "type": "Interface", + "tags": [], + "label": "CreateCrossClusterAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateCrossClusterAPIKeyParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"cross_cluster\"" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateCrossClusterAPIKeyParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateCrossClusterAPIKeyParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateCrossClusterAPIKeyParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateCrossClusterAPIKeyParams.access", + "type": "Object", + "tags": [], + "label": "access", + "description": [], + "signature": [ + "{ search?: { names: string[]; query?: unknown; field_security?: unknown; allow_restricted_indices?: boolean | undefined; }[] | undefined; replication?: { names: string[]; }[] | undefined; }" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateRestAPIKeyParams", + "type": "Interface", + "tags": [], + "label": "CreateRestAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateRestAPIKeyParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateRestAPIKeyParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateRestAPIKeyParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesPayload.kibana", - "type": "CompoundType", + "id": "def-server.CreateRestAPIKeyParams.role_descriptors", + "type": "Object", "tags": [], - "label": "kibana", - "description": [ - "\nA list of the Kibana specific privileges (usually generated with `security.authz.actions.*.get(...)`)." - ], + "label": "role_descriptors", + "description": [], "signature": [ - "string | string[] | undefined" + "{ [x: string]: { [key: string]: any; }; }" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesPayload.elasticsearch", + "id": "def-server.CreateRestAPIKeyParams.metadata", "type": "Object", "tags": [], - "label": "elasticsearch", - "description": [ - "\nA set of the Elasticsearch cluster and index privileges." - ], + "label": "metadata", + "description": [], "signature": [ - "{ cluster: string[]; index: Record; } | undefined" + "{ [key: string]: any; } | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -2336,213 +3378,181 @@ }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesResponse", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams", "type": "Interface", "tags": [], - "label": "CheckPrivilegesResponse", + "label": "CreateRestAPIKeyWithKibanaPrivilegesParams", "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesResponse.hasAllRequested", - "type": "boolean", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.type", + "type": "string", "tags": [], - "label": "hasAllRequested", + "label": "type", "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesResponse.username", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.expiration", "type": "string", "tags": [], - "label": "username", + "label": "expiration", "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckPrivilegesResponse.privileges", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.metadata", "type": "Object", "tags": [], - "label": "privileges", + "label": "metadata", "description": [], "signature": [ - "{ kibana: { resource?: string | undefined; privilege: string; authorized: boolean; }[]; elasticsearch: { cluster: { privilege: string; authorized: boolean; }[]; index: { [indexName: string]: { privilege: string; authorized: boolean; }[]; }; }; }" + "{ [key: string]: any; } | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivileges", - "type": "Interface", - "tags": [], - "label": "CheckUserProfilesPrivileges", - "description": [ - "\nAn interface to check users profiles privileges in a specific context (only a single-space context is supported at\nthe moment)." - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivileges.atSpace", - "type": "Function", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.kibana_role_descriptors", + "type": "Object", "tags": [], - "label": "atSpace", + "label": "kibana_role_descriptors", "description": [], "signature": [ - "(spaceId: string, privileges: ", + "{ [x: string]: { elasticsearch: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckUserProfilesPrivilegesPayload", - "text": "CheckUserProfilesPrivilegesPayload" + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ElasticsearchPrivilegesType", + "text": "ElasticsearchPrivilegesType" }, - ") => Promise<", + " & { [key: string]: unknown; }; kibana: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckUserProfilesPrivilegesResponse", - "text": "CheckUserProfilesPrivilegesResponse" + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.KibanaPrivilegesType", + "text": "KibanaPrivilegesType" }, - ">" + "; }; }" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivileges.atSpace.$1", - "type": "string", - "tags": [], - "label": "spaceId", - "description": [], - "signature": [ - "string" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivileges.atSpace.$2", - "type": "Object", - "tags": [], - "label": "privileges", - "description": [], - "signature": [ - { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CheckUserProfilesPrivilegesPayload", - "text": "CheckUserProfilesPrivilegesPayload" - } - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] + "trackAdoption": false } ], "initialIsOpen": false }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivilegesPayload", + "id": "def-server.ElasticsearchPrivilegesType", "type": "Interface", "tags": [], - "label": "CheckUserProfilesPrivilegesPayload", + "label": "ElasticsearchPrivilegesType", "description": [ - "\nPrivileges that can be checked for the users profiles (only Kibana specific privileges are supported at the moment)." + "\nType representing Elasticsearch specific portion of the role definition." ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivilegesPayload.kibana", + "id": "def-server.ElasticsearchPrivilegesType.cluster", "type": "Array", "tags": [], - "label": "kibana", - "description": [ - "\nA list of the Kibana specific privileges (usually generated with `security.authz.actions.*.get(...)`)." - ], + "label": "cluster", + "description": [], "signature": [ - "string[]" + "string[] | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivilegesResponse", - "type": "Interface", - "tags": [], - "label": "CheckUserProfilesPrivilegesResponse", - "description": [ - "\nResponse of the check privileges operation for the users profiles." - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivilegesResponse.hasPrivilegeUids", + "id": "def-server.ElasticsearchPrivilegesType.remote_cluster", "type": "Array", "tags": [], - "label": "hasPrivilegeUids", - "description": [ - "\nThe subset of the requested profile IDs of the users that have all the requested privileges." + "label": "remote_cluster", + "description": [], + "signature": [ + "{ privileges: string[]; clusters: string[]; }[] | undefined" ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.ElasticsearchPrivilegesType.indices", + "type": "Array", + "tags": [], + "label": "indices", + "description": [], "signature": [ - "string[]" + "{ names: string[]; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; privileges: string[]; query?: string | undefined; allow_restricted_indices?: boolean | undefined; }[] | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CheckUserProfilesPrivilegesResponse.errors", - "type": "Object", + "id": "def-server.ElasticsearchPrivilegesType.remote_indices", + "type": "Array", "tags": [], - "label": "errors", - "description": [ - "\nAn errors object that may be returned from ES that contains a `count` of UIDs that have errors in the `details` property.\n\nEach entry in `details` will contain an error `type`, e.g 'resource_not_found_exception', and a `reason` message, e.g. 'profile document not found'" + "label": "remote_indices", + "description": [], + "signature": [ + "{ clusters: string[]; names: string[]; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; privileges: string[]; query?: string | undefined; allow_restricted_indices?: boolean | undefined; }[] | undefined" ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.ElasticsearchPrivilegesType.run_as", + "type": "Array", + "tags": [], + "label": "run_as", + "description": [], "signature": [ - "{ count: number; details: Record; } | undefined" + "string[] | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/check_privileges.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false } @@ -2556,7 +3566,7 @@ "tags": [], "label": "GrantAPIKeyResult", "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -2569,7 +3579,7 @@ "description": [ "\nUnique id for this API key" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, @@ -2582,7 +3592,7 @@ "description": [ "\nName for this API key" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, @@ -2595,7 +3605,7 @@ "description": [ "\nGenerated API key" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -2725,7 +3735,7 @@ "description": [ "\nThe return value when invalidating an API key in Elasticsearch." ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -2741,7 +3751,7 @@ "signature": [ "string[]" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, @@ -2757,7 +3767,7 @@ "signature": [ "string[]" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, @@ -2770,7 +3780,7 @@ "description": [ "\nThe number of errors that were encountered when invalidating the API keys." ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, @@ -2786,7 +3796,7 @@ "signature": [ "{ type?: string | undefined; reason?: string | undefined; caused_by?: { type?: string | undefined; reason?: string | undefined; } | undefined; }[] | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -2802,7 +3812,7 @@ "description": [ "\nRepresents the params for invalidating multiple API keys" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -2812,11 +3822,13 @@ "type": "Array", "tags": [], "label": "ids", - "description": [], + "description": [ + "\nList of unique API key IDs" + ], "signature": [ "string[]" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -3277,32 +4289,8 @@ "path": "x-pack/plugins/enterprise_search/server/lib/indices/create_api_key.ts" }, { - "plugin": "enterpriseSearch", - "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_info_handler.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_download_handler.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts" }, { "plugin": "serverlessSearch", @@ -3403,30 +4391,6 @@ { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/list.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/state.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts" } ] }, @@ -3543,65 +4507,324 @@ "children": [ { "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.UIActions.get", - "type": "Function", + "id": "def-server.UIActions.get", + "type": "Function", + "tags": [], + "label": "get", + "description": [], + "signature": [ + "(featureId: keyof ", + { + "pluginId": "@kbn/core-capabilities-common", + "scope": "common", + "docId": "kibKbnCoreCapabilitiesCommonPluginApi", + "section": "def-common.Capabilities", + "text": "Capabilities" + }, + ", ...uiCapabilityParts: string[]) => string" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/ui.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UIActions.get.$1", + "type": "CompoundType", + "tags": [], + "label": "featureId", + "description": [], + "signature": [ + "keyof ", + { + "pluginId": "@kbn/core-capabilities-common", + "scope": "common", + "docId": "kibKbnCoreCapabilitiesCommonPluginApi", + "section": "def-common.Capabilities", + "text": "Capabilities" + } + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/ui.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UIActions.get.$2", + "type": "Array", + "tags": [], + "label": "uiCapabilityParts", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/ui.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateCrossClusterAPIKeyParams", + "type": "Interface", + "tags": [], + "label": "UpdateCrossClusterAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateCrossClusterAPIKeyParams.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateCrossClusterAPIKeyParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"cross_cluster\"" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateCrossClusterAPIKeyParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateCrossClusterAPIKeyParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateCrossClusterAPIKeyParams.access", + "type": "Object", + "tags": [], + "label": "access", + "description": [], + "signature": [ + "{ search?: { names: string[]; query?: unknown; field_security?: unknown; allow_restricted_indices?: boolean | undefined; }[] | undefined; replication?: { names: string[]; }[] | undefined; }" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyParams", + "type": "Interface", + "tags": [], + "label": "UpdateRestAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyParams.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyParams.role_descriptors", + "type": "Object", + "tags": [], + "label": "role_descriptors", + "description": [], + "signature": [ + "{ [x: string]: { [key: string]: unknown; }; }" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams", + "type": "Interface", + "tags": [], + "label": "UpdateRestAPIKeyWithKibanaPrivilegesParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-server", + "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams.kibana_role_descriptors", + "type": "Object", "tags": [], - "label": "get", + "label": "kibana_role_descriptors", "description": [], "signature": [ - "(featureId: keyof ", + "{ [x: string]: { elasticsearch: ", { - "pluginId": "@kbn/core-capabilities-common", + "pluginId": "@kbn/core-security-server", "scope": "common", - "docId": "kibKbnCoreCapabilitiesCommonPluginApi", - "section": "def-common.Capabilities", - "text": "Capabilities" + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ElasticsearchPrivilegesType", + "text": "ElasticsearchPrivilegesType" }, - ", ...uiCapabilityParts: string[]) => string" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/ui.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ + " & { [key: string]: unknown; }; kibana: ", { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.UIActions.get.$1", - "type": "CompoundType", - "tags": [], - "label": "featureId", - "description": [], - "signature": [ - "keyof ", - { - "pluginId": "@kbn/core-capabilities-common", - "scope": "common", - "docId": "kibKbnCoreCapabilitiesCommonPluginApi", - "section": "def-common.Capabilities", - "text": "Capabilities" - } - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/ui.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.KibanaPrivilegesType", + "text": "KibanaPrivilegesType" }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.UIActions.get.$2", - "type": "Array", - "tags": [], - "label": "uiCapabilityParts", - "description": [], - "signature": [ - "string[]" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/actions/ui.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } + "; }; }" ], - "returnComment": [] + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -3866,7 +5089,7 @@ "description": [ "\nRepresents the parameters for validating API Key credentials." ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -3879,7 +5102,7 @@ "description": [ "\nUnique id for this API key" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, @@ -3892,7 +5115,7 @@ "description": [ "\nGenerated API Key (secret)" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -4209,9 +5432,31 @@ "label": "CreateAPIKeyParams", "description": [], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateCrossClusterAPIKeyParams", + "text": "CreateCrossClusterAPIKeyParams" + } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -4228,67 +5473,7 @@ "signature": [ "SecurityCreateApiKeyResponse" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CreateCrossClusterAPIKeyParams", - "type": "Type", - "tags": [], - "label": "CreateCrossClusterAPIKeyParams", - "description": [], - "signature": [ - "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly type: \"cross_cluster\"; readonly name: string; readonly access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CreateRestAPIKeyParams", - "type": "Type", - "tags": [], - "label": "CreateRestAPIKeyParams", - "description": [], - "signature": [ - "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly name: string; readonly role_descriptors: Record>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams", - "type": "Type", - "tags": [], - "label": "CreateRestAPIKeyWithKibanaPrivilegesParams", - "description": [], - "signature": [ - "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly name: string; readonly kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.ElasticsearchPrivilegesType", - "type": "Type", - "tags": [], - "label": "ElasticsearchPrivilegesType", - "description": [], - "signature": [ - "{ readonly cluster?: string[] | undefined; readonly indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; readonly remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; readonly remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; readonly run_as?: string[] | undefined; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -4314,11 +5499,13 @@ "type": "Type", "tags": [], "label": "KibanaPrivilegesType", - "description": [], + "description": [ + "\nType representing Kibana specific portion of the role definition." + ], "signature": [ - "Readonly<{ base?: string[] | undefined; feature?: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]" + "{ spaces: string[]; base?: string[] | undefined; feature?: Record | undefined; }[]" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -4333,9 +5520,31 @@ "\nRequest body of Kibana Update API key endpoint." ], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; role_descriptors: Record>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; type: \"cross_cluster\"; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { id: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>" + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateRestAPIKeyParams", + "text": "UpdateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateCrossClusterAPIKeyParams", + "text": "UpdateCrossClusterAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateRestAPIKeyWithKibanaPrivilegesParams", + "text": "UpdateRestAPIKeyWithKibanaPrivilegesParams" + } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -4352,52 +5561,7 @@ "signature": [ "SecurityUpdateApiKeyResponse" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.UpdateCrossClusterAPIKeyParams", - "type": "Type", - "tags": [], - "label": "UpdateCrossClusterAPIKeyParams", - "description": [], - "signature": [ - "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly id: string; readonly type: \"cross_cluster\"; readonly access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.UpdateRestAPIKeyParams", - "type": "Type", - "tags": [], - "label": "UpdateRestAPIKeyParams", - "description": [], - "signature": [ - "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly id: string; readonly role_descriptors: Record>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "@kbn/security-plugin-types-server", - "id": "def-server.UpdateRestAPIKeyWithKibanaPrivilegesParams", - "type": "Type", - "tags": [], - "label": "UpdateRestAPIKeyWithKibanaPrivilegesParams", - "description": [], - "signature": [ - "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly id: string; readonly kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -4442,7 +5606,7 @@ "section": "def-common.ObjectType", "text": "ObjectType" }, - "; name: ", + "<\"cross_cluster\">; name: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4466,23 +5630,7 @@ "section": "def-common.Type", "text": "Type" }, - "; role_descriptors: ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - ">>; metadata: ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - " | undefined>; }, { type: ", + "; metadata: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4490,7 +5638,7 @@ "section": "def-common.Type", "text": "Type" }, - "<\"cross_cluster\">; role_descriptors: null; access: ", + " | undefined>; access: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4514,7 +5662,7 @@ "section": "def-common.Type", "text": "Type" }, - "[] | undefined>; }>; }>>" + "[] | undefined>; }>; }>" ], "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", "deprecated": false, @@ -4662,23 +5810,7 @@ "section": "def-common.ObjectType", "text": "ObjectType" }, - "; name: ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - "; expiration: ", + "<{ id: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4686,7 +5818,7 @@ "section": "def-common.Type", "text": "Type" }, - "; role_descriptors: ", + "; type: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4694,7 +5826,7 @@ "section": "def-common.Type", "text": "Type" }, - ">>; metadata: ", + "<\"cross_cluster\">; expiration: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4702,7 +5834,7 @@ "section": "def-common.Type", "text": "Type" }, - " | undefined>; }, { type: ", + "; metadata: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4710,7 +5842,7 @@ "section": "def-common.Type", "text": "Type" }, - "<\"cross_cluster\">; role_descriptors: null; access: ", + " | undefined>; access: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4734,15 +5866,7 @@ "section": "def-common.Type", "text": "Type" }, - "[] | undefined>; }>; }>, { name: null; id: ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - "; }>>" + "[] | undefined>; }>; }>" ], "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", "deprecated": false, @@ -4764,7 +5888,7 @@ "section": "def-common.ObjectType", "text": "ObjectType" }, - "; name: ", + "; type: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4780,7 +5904,7 @@ "section": "def-common.Type", "text": "Type" }, - "; expiration: ", + "<\"rest\" | undefined>; expiration: ", { "pluginId": "@kbn/config-schema", "scope": "common", @@ -4804,15 +5928,7 @@ "section": "def-common.Type", "text": "Type" }, - " | undefined>; }, { name: null; id: ", - { - "pluginId": "@kbn/config-schema", - "scope": "common", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-common.Type", - "text": "Type" - }, - "; }>>" + " | undefined>; }>" ], "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", "deprecated": false, diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 7c6aa2da3511c..6fb35919dcbb7 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 216 | 0 | 121 | 0 | +| 275 | 1 | 154 | 0 | ## Server diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index b21ee6f8c4925..6fccd11ffda47 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 0b83757f314ee..22a52c912f52a 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 8057980cadb7a..4061b2105608c 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index b5b0d157c24ac..94b036a30f18d 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 5dd49e562276d..5b89ab28fc2de 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 847ada8f39c8f..7627255900a2c 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index e9d5e398486b6..b03df41ad2bd0 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 57d5f1abad190..4ecb54c33c025 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index fff4914fe6a2f..673d2bb6967b2 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 954af3189ec59..fa6b4d00e19d3 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 5d0f2d29fcb49..f686d368ed6e2 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index adde037bf8f76..9be381985de48 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index e43f20cdf9b71..ec4eee272f424 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 70fb3ceefef02..8f4665c8344a8 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 26f187818b0d1..462ee376ae04d 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 100e35128e49b..efacc5115aead 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index b2150310488de..52c0b338efc78 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 8dc005863aaae..935ba90bb1416 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 0334b7101d410..0bc1f725c5e35 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 0974a12d88dd5..0f604c0b5d5af 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 17e8687117b28..77f52b193a9e4 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 906161232d75c..f5ec57b43def9 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index a651a0ed8e596..aa4b39ab8955f 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 52f01f02c37a5..be90ae8a969f3 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index b34d7c3f130ad..9c26e99f4e3ac 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 0654aa98964e3..28bc7f0f7e5c5 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index b95f3d8c270a9..9617cb297fbbd 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index 87842d991d974..a8763cbf46030 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index f21be827265cb..ed25b3fc9e73e 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index ae711cf27009d..4424874cd02a6 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index ce8b7138b3f6a..5b673495bc8ae 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 2b9f134fc1a71..9884b2d1ce6dd 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index f6b0046b47e5f..43f7f939640c6 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 714b36ef1c651..d9a4e5f49d6fd 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 3c6075bbedff6..ea4cf0b64ae9e 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 3f830a73d4ac2..f5795800ff1fe 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index bf856b962f65d..bca4b029bd2d8 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index dd93e338a49b6..878b30b25aae9 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index e06be2cf1ae86..35787edd06aa5 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 5bcc1d6dd2210..f50cb79d2e939 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 7a390a371b985..d5c4844146ddf 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index b3eddac900238..d643ac3730a45 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index b98be1af3526a..bd27c66bec82d 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 49889a486b35e..cb6953a271a92 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index fe5d366e3204d..82c14e1e5f4f5 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index e7e61258e8112..4700851eda938 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 7c1a0a4799703..47d635c6aedab 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 1d8f6e8a14c32..1ac01342d945d 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 8f4ffc93536e3..62a4db0f57045 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index f90b3d07d556e..3bee76770978d 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 409ea87af405c..d6d6eb0d2b608 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 3599ac1d45c67..6743c0370d028 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 8a8fbf4076232..b82e0ad2249df 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index 0a99623c45ee7..d46cb4f512a15 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index a003943ace5fe..f6bf13ff3deea 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index d811eb76f4f32..2c280356ae080 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 9807cff5789c2..cba88a3bc13b3 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 937c53dd2f21b..f47914382acfc 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 3f77f2e595402..a9ada0e17b0bc 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 4c55d88218b17..b288e58eac4ca 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 29e6f400f9019..09eb7da739fd2 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 507995b46b07e..c39e05952056e 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index 8d2e867e0829d..edb04f116aedb 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 69aee6a46de94..5a0e6f853368a 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 5296751e7f6c1..cefea5217586b 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index ca374d345179f..cbb8e21ada263 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index b7a7ca637f243..f66ce28c9d6f6 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 807a274717f06..6cdc1785c8984 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 0db9b623abdb4..32a43d0fb7092 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index e10cfefa7e37f..3cfe536931253 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 5d4f631d15a18..a0ef1f4ffc40c 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 3871ca4aab266..eaaee1a53d074 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 0745405dc9a15..9f6a46ac3272d 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index ff38938a9cf6a..4209b964ab11d 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 54d1eca651229..6e5c89a25a3cb 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index cb36987434044..4cb600291c5fb 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index b25472babcf81..f11108590ac7d 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.devdocs.json b/api_docs/kbn_test_eui_helpers.devdocs.json index aab4d099fcc9a..d3276c2634aba 100644 --- a/api_docs/kbn_test_eui_helpers.devdocs.json +++ b/api_docs/kbn_test_eui_helpers.devdocs.json @@ -140,7 +140,7 @@ "tags": [], "label": "selected", "description": [ - "\nReturns selected value of button group" + "\nReturns selected option of button group" ], "signature": [ "HTMLElement" @@ -186,6 +186,171 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness", + "type": "Class", + "tags": [], + "label": "EuiSelectTestHarness", + "description": [], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.testId", + "type": "string", + "tags": [], + "label": "#testId", + "description": [], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.selectEl", + "type": "Object", + "tags": [], + "label": "#selectEl", + "description": [ + "\nReturns select or throws" + ], + "signature": [ + "HTMLElement" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.Unnamed.$1", + "type": "string", + "tags": [], + "label": "testId", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.testId", + "type": "string", + "tags": [], + "label": "testId", + "description": [ + "\nReturns `data-test-subj` of select" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.self", + "type": "CompoundType", + "tags": [], + "label": "self", + "description": [ + "\nReturns button select if found, otherwise `null`" + ], + "signature": [ + "HTMLElement | null" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.options", + "type": "Array", + "tags": [], + "label": "options", + "description": [ + "\nReturns all options of select" + ], + "signature": [ + "HTMLOptionElement[]" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.selected", + "type": "string", + "tags": [], + "label": "selected", + "description": [ + "\nReturns selected option" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.select", + "type": "Function", + "tags": [], + "label": "select", + "description": [ + "\nSelect option by value" + ], + "signature": [ + "(optionName: string | RegExp) => void" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/test-eui-helpers", + "id": "def-common.EuiSelectTestHarness.select.$1", + "type": "CompoundType", + "tags": [], + "label": "optionName", + "description": [], + "signature": [ + "string | RegExp" + ], + "path": "packages/kbn-test-eui-helpers/src/rtl_helpers.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/test-eui-helpers", "id": "def-common.EuiSuperDatePickerTestHarness", diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index f96a386cb8ed1..5099ea7eb0413 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 25 | 0 | 13 | 0 | +| 36 | 0 | 18 | 0 | ## Common diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 93131030a565f..4f82466404486 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index ebab933870827..8f2c2bcb8f442 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 5a4309ae18d55..a889d2a241ffb 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 709a03157915b..91a3eecc08f45 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index dc160105e78a5..c3f6006e3fcad 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 636b8be20610f..5ca83bdf1a6ec 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 949a959470f6e..cddcb821d229e 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 3ce429bac4a27..990674c0960cc 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 4863e314d89a5..90f571914c374 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 303b7a7721882..fe5a4f694bb40 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.devdocs.json b/api_docs/kbn_ui_shared_deps_src.devdocs.json index 5a4f7663f18a0..cdcc1a191f022 100644 --- a/api_docs/kbn_ui_shared_deps_src.devdocs.json +++ b/api_docs/kbn_ui_shared_deps_src.devdocs.json @@ -524,6 +524,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/ui-shared-deps-src", + "id": "def-common.externals.kbncryptobrowser", + "type": "string", + "tags": [], + "label": "'@kbn/crypto-browser'", + "description": [], + "path": "packages/kbn-ui-shared-deps-src/src/definitions.js", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/ui-shared-deps-src", "id": "def-common.externals.kbnesquery", diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 7c0e9167c87a6..5de7a71863db8 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 55 | 0 | 46 | 0 | +| 56 | 0 | 47 | 0 | ## Common diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 86fda35b01e2c..b2aeefbd8b4ca 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index d69f9c8c5c1a8..23f6481b3b6ba 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index b29a49446008f..0ec1e020d9a49 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 7d5a9c5415762..5d9f33596721d 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index cff3206d2d904..ea1be4f0240a8 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index 9a07953f5ef7b..c9d96e19e8089 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 3a6350ce0f461..ed43dfa3580b3 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 4d51c61d4f468..da98e9e683b05 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 3a8b5546675b9..0d23d9d6e3ddb 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 6016643b3d27e..c154ac78aff31 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 16358c94b7da8..2760fb6498ffc 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 16b7d652dfe9b..2ffdc37c2f362 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 35cd7528e1757..6d48065cf5a6f 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 7cd72ea98a4e0..bc8ac20863181 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 6f87b3d59c226..e20d7586b7661 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index 01deacde43e62..e2b68abc0a324 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index f994ec347d18b..b211d3d85375e 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 3019bde1572f7..edfac50200b65 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 431ebf3a2d618..6879db37872f5 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 7d4b442e3b28a..cb0b3d58dda46 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 28c0c308162ca..0534b92e8b64c 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -4455,6 +4455,63 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "lens", + "id": "def-public.MetricVisualizationState.titlesTextAlign", + "type": "CompoundType", + "tags": [], + "label": "titlesTextAlign", + "description": [], + "signature": [ + "\"right\" | \"left\" | \"center\" | undefined" + ], + "path": "x-pack/plugins/lens/public/visualizations/metric/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "lens", + "id": "def-public.MetricVisualizationState.valuesTextAlign", + "type": "CompoundType", + "tags": [], + "label": "valuesTextAlign", + "description": [], + "signature": [ + "\"right\" | \"left\" | \"center\" | undefined" + ], + "path": "x-pack/plugins/lens/public/visualizations/metric/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "lens", + "id": "def-public.MetricVisualizationState.iconAlign", + "type": "CompoundType", + "tags": [], + "label": "iconAlign", + "description": [], + "signature": [ + "\"right\" | \"left\" | undefined" + ], + "path": "x-pack/plugins/lens/public/visualizations/metric/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "lens", + "id": "def-public.MetricVisualizationState.valueFontMode", + "type": "CompoundType", + "tags": [], + "label": "valueFontMode", + "description": [], + "signature": [ + "ValueFontMode", + " | undefined" + ], + "path": "x-pack/plugins/lens/public/visualizations/metric/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "lens", "id": "def-public.MetricVisualizationState.color", @@ -4469,6 +4526,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "lens", + "id": "def-public.MetricVisualizationState.icon", + "type": "string", + "tags": [], + "label": "icon", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/lens/public/visualizations/metric/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "lens", "id": "def-public.MetricVisualizationState.palette", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index c3d5cb143c0e7..2f8b8605a7eb7 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 672 | 0 | 570 | 62 | +| 677 | 0 | 575 | 63 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index de74ce08f2e16..5bc44e9854e70 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 09495a17a5d3b..9ecd9d9bd5811 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 4fc4c85abc9f5..ca13a48f61e32 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 560e44067a7ea..41ee754c5045d 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index a2d3af9cc76f5..5e1b2229e8f72 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 035befc30e241..b09764d682764 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index b1b1874c1a108..586cf3c3419fe 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 455b1b62caf67..b5d4e58649f4a 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 9efd852c72ca9..e58e039bb493f 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 47e0f72e43f1b..b3620ad031132 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 1541454bbeea5..e292b96e8f128 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 94a27bc9aec2d..b852e1b255fbb 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 380e40ca6d566..ea10715eade14 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index d6d2f2c8ac194..3fcc0874fadf1 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index dcbdf08271312..9ffc042d9afaf 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 74d85a0245195..f9ea2f7a9b8ce 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 380cd978db995..ddb54acf97fb0 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index bd93f2dc714f9..1a23a284aa163 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index f79178e58cd42..dc1108ff5804e 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 5e5755bad1a4d..fa70830dd135c 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 3449ee952dca5..10d70f8c5ce85 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index d2d8baa627bcb..3a47267ac6556 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 1b834afc8f332..5c81008f885a3 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 9c33efa5ef117..6f2e347af77e6 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 231481cbb3217..1c041f0f374c6 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 02f2807beb89d..9b4fb87da6834 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index dd1bbf734cd35..d07ee8fefae24 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 9e1a61f471a7c..8ddb05533db16 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index aa0bef6692c8e..cd29c113f0837 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index d152b01f9130a..a9e589fb817c9 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 811 | 695 | 42 | +| 812 | 696 | 42 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 49694 | 237 | 37903 | 1897 | +| 49918 | 239 | 38033 | 1897 | ## Plugin Directory @@ -57,7 +57,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 129 | 0 | 123 | 12 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3199 | 31 | 2590 | 24 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 8 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 5 | 0 | 5 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | @@ -76,18 +76,19 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Entity manager plugin for entity assets (inventory, topology, etc) | 8 | 0 | 8 | 1 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 99 | 3 | 97 | 3 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 10 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The Event Annotation service contains expressions for event annotations | 201 | 0 | 201 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The listing page for event annotations. | 15 | 0 | 15 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 112 | 0 | 112 | 11 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 126 | 0 | 126 | 12 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 126 | 0 | 126 | 12 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'error' renderer to expressions | 17 | 0 | 15 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Gauge plugin adds a `gauge` renderer and function to the expression plugin. The renderer will display the `gauge` chart. | 59 | 0 | 58 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Heatmap plugin adds a `heatmap` renderer and function to the expression plugin. The renderer will display the `heatmap` chart. | 112 | 0 | 108 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'image' function and renderer to expressions | 26 | 0 | 26 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds a `metric` renderer and function to the expression plugin. The renderer will display the `legacy metric` chart. | 51 | 0 | 51 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'metric' function and renderer to expressions | 32 | 0 | 27 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds a `metric` renderer and function to the expression plugin. The renderer will display the `metric` chart. | 67 | 0 | 67 | 2 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds a `metric` renderer and function to the expression plugin. The renderer will display the `metric` chart. | 75 | 0 | 75 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Partition Visualization plugin adds a `partitionVis` renderer and `pieVis`, `mosaicVis`, `treemapVis`, `waffleVis` functions to the expression plugin. The renderer will display the `pie`, `waffle`, `treemap` and `mosaic` charts. | 73 | 0 | 73 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'repeatImage' function and renderer to expressions | 32 | 0 | 32 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'revealImage' function and renderer to expressions | 14 | 0 | 14 | 3 | @@ -125,7 +126,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 610 | 3 | 417 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 672 | 0 | 570 | 62 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 677 | 0 | 575 | 63 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | @@ -179,7 +180,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 8 | 0 | 8 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 18 | 0 | 10 | 1 | | searchprofiler | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | -| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 415 | 0 | 206 | 1 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 438 | 0 | 222 | 1 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 191 | 0 | 121 | 37 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | @@ -193,13 +194,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 260 | 0 | 66 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 25 | 0 | 25 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 10 | 0 | 10 | 0 | -| synthetics | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 | +| synthetics | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 102 | 0 | 59 | 5 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 45 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 26 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 10 | 0 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 4 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 228 | 1 | 184 | 18 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | @@ -211,7 +211,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | The `unifiedHistogram` plugin provides UI components to create a layout including a resizable histogram and a main display. | 71 | 0 | 36 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience. | 152 | 2 | 113 | 23 | | upgradeAssistant | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | This plugin visualizes data from Heartbeat, and integrates with other Observability solutions. | 1 | 0 | 1 | 0 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | This plugin visualizes data from Heartbeat, and integrates with other Observability solutions. | 1 | 0 | 1 | 0 | | urlDrilldown | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds drilldown implementations to Kibana | 0 | 0 | 0 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 12 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 56 | 0 | 16 | 2 | @@ -278,7 +278,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 10 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 48 | 0 | 32 | 3 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 33 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 30 | 0 | 30 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 195 | 1 | 128 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 101 | 0 | 0 | 0 | @@ -418,9 +418,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 6 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 52 | 0 | 16 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 146 | 1 | 63 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 16 | 0 | 16 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 2 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 15 | 0 | 15 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 21 | 0 | 20 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 3 | 0 | @@ -461,14 +461,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 51 | 0 | 51 | 1 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 14 | 0 | 9 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 80 | 0 | 80 | 1 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 5 | 0 | 4 | 0 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 7 | 0 | 5 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 44 | 0 | 43 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 5 | 0 | 5 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 3 | 0 | 3 | 0 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 55 | 0 | 43 | 0 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 56 | 0 | 44 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 17 | 0 | 17 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 5 | 0 | 5 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | @@ -490,14 +490,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 35 | 0 | 34 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 160 | 0 | 134 | 9 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 362 | 0 | 336 | 0 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 18 | 0 | 18 | 0 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 19 | 0 | 19 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 52 | 0 | 37 | 7 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 6 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 269 | 1 | 209 | 15 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 0 | 26 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 99 | 1 | 96 | 11 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 104 | 1 | 101 | 10 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 53 | 0 | 51 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 193 | 0 | 182 | 10 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 | @@ -608,6 +608,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 18 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 0 | 2 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 11 | 0 | 8 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 14 | 0 | 7 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 18 | 0 | 18 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 40 | 0 | 38 | 5 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 9 | 0 | @@ -643,7 +644,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 118 | 0 | 59 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 51 | 0 | 25 | 0 | -| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 216 | 0 | 121 | 0 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 275 | 1 | 154 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 54 | 0 | 49 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 30 | 0 | 24 | 0 | @@ -721,7 +722,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 21 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 5 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 315 | 4 | 267 | 13 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 25 | 0 | 13 | 0 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 36 | 0 | 18 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 131 | 3 | 98 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 33 | 0 | 13 | 0 | @@ -732,7 +733,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 86 | 0 | 86 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 0 | 28 | 0 | -| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 55 | 0 | 46 | 0 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 56 | 0 | 47 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 8 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 153 | 0 | 81 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 5377b64c59d8b..044039be72e2f 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 2cf99c9268efc..8a4f3cf4f1d1e 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 5fc1054893379..66b8099faa64b 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index c81cc064925b0..2d1fb75fa9ebc 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 61ae6d3ac7bc4..1332a6bbe1307 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index e85a65b36c59f..aaf34bf8ec7ca 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 905ccaead09c7..a85cd6355abed 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index fe3d512ee6f20..3c0bac39f60e8 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 92cd07cb6a86d..469dd74c89171 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index c16fb0c31ecab..46bf950d7cc7c 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 2d65a9e00b0a4..27f188c099000 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 47bc1753e03e3..c59950e900de1 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 343c998820d52..4511c56481e6b 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index d42770557cf89..a4e7160e19728 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index f2d736be63446..bfcdcd6c94b37 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 850b0930150ee..68ce1ae4d6022 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 5aa11ebce0055..d338a09e37e07 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index fb4ee5e644b26..379fd5ffceb98 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index a0d0813d0d9c9..e4cd144d11b56 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 1d24c2f2d0127..2e7befc9dd365 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index a2ca0c503916f..3047177c85e7e 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 64611dafd8273..c75eeb689a0d5 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index 6923618136dcd..5d7daa39f0360 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -1829,8 +1829,10 @@ "type": "Interface", "tags": [], "label": "APIKeys", - "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "description": [ + "\nInterface for managing API keys in Elasticsearch, including creation,\nvalidation, and invalidation of API keys,\nas well as checking the status of API key features." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1846,7 +1848,7 @@ "signature": [ "() => Promise" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -1864,7 +1866,7 @@ "signature": [ "() => Promise" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -1890,17 +1892,17 @@ }, ", createParams: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CreateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", "text": "CreateAPIKeyParams" }, ") => Promise<", "SecurityCreateApiKeyResponse", " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1923,7 +1925,7 @@ }, "" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1939,14 +1941,98 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.CreateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateAPIKeyParams", "text": "CreateAPIKeyParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "security", + "id": "def-server.APIKeys.update", + "type": "Function", + "tags": [], + "label": "update", + "description": [ + "\nAttempts update an API key with the provided 'role_descriptors' and 'metadata'\n\nReturns `updated`, `true` if the update was successful, `false` if there was nothing to update\n\nUser needs `manage_api_key` privilege to update REST API keys and `manage_security` for cross-cluster API keys.\n" + ], + "signature": [ + "(request: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + ", updateParams: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + }, + ") => Promise<", + "SecurityUpdateApiKeyResponse", + " | null>" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.APIKeys.update.$1", + "type": "Object", + "tags": [], + "label": "request", + "description": [ + "Request instance." + ], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.KibanaRequest", + "text": "KibanaRequest" + }, + "" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "security", + "id": "def-server.APIKeys.update.$2", + "type": "CompoundType", + "tags": [], + "label": "updateParams", + "description": [ + "The params to edit an API key" + ], + "signature": [ + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.UpdateAPIKeyParams", + "text": "UpdateAPIKeyParams" + } + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1972,17 +2058,33 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - ", createParams: Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>) => Promise<", + ", createParams: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.GrantAPIKeyResult", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + ") => Promise<", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.GrantAPIKeyResult", "text": "GrantAPIKeyResult" }, " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -2005,7 +2107,7 @@ }, "" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -2020,9 +2122,23 @@ "Create operation parameters." ], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }>" + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -2042,15 +2158,15 @@ "signature": [ "(apiKeyPrams: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.ValidateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", "text": "ValidateAPIKeyParams" }, ") => Promise" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -2065,14 +2181,14 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.ValidateAPIKeyParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ValidateAPIKeyParams", "text": "ValidateAPIKeyParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -2100,23 +2216,23 @@ }, ", params: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" }, ") => Promise<", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeyResult", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", "text": "InvalidateAPIKeyResult" }, " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -2139,7 +2255,7 @@ }, "" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -2155,14 +2271,14 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -2182,23 +2298,23 @@ "signature": [ "(params: ", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" }, ") => Promise<", { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeyResult", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeyResult", "text": "InvalidateAPIKeyResult" }, " | null>" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -2213,14 +2329,14 @@ ], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.InvalidateAPIKeysParams", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.InvalidateAPIKeysParams", "text": "InvalidateAPIKeysParams" } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -2984,10 +3100,10 @@ "description": [], "signature": [ { - "pluginId": "@kbn/security-plugin-types-server", - "scope": "server", - "docId": "kibKbnSecurityPluginTypesServerPluginApi", - "section": "def-server.APIKeys", + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.APIKeys", "text": "APIKeys" } ], @@ -3985,51 +4101,79 @@ }, { "parentPluginId": "security", - "id": "def-server.GrantAPIKeyResult", + "id": "def-server.CreateCrossClusterAPIKeyParams", "type": "Interface", "tags": [], - "label": "GrantAPIKeyResult", + "label": "CreateCrossClusterAPIKeyParams", "description": [], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "security", - "id": "def-server.GrantAPIKeyResult.id", + "id": "def-server.CreateCrossClusterAPIKeyParams.type", "type": "string", "tags": [], - "label": "id", - "description": [ - "\nUnique id for this API key" + "label": "type", + "description": [], + "signature": [ + "\"cross_cluster\"" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "security", - "id": "def-server.GrantAPIKeyResult.name", + "id": "def-server.CreateCrossClusterAPIKeyParams.expiration", "type": "string", "tags": [], - "label": "name", - "description": [ - "\nName for this API key" + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "security", - "id": "def-server.GrantAPIKeyResult.api_key", + "id": "def-server.CreateCrossClusterAPIKeyParams.name", "type": "string", "tags": [], - "label": "api_key", - "description": [ - "\nGenerated API key" + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.CreateCrossClusterAPIKeyParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.CreateCrossClusterAPIKeyParams.access", + "type": "Object", + "tags": [], + "label": "access", + "description": [], + "signature": [ + "{ search?: { names: string[]; query?: unknown; field_security?: unknown; allow_restricted_indices?: boolean | undefined; }[] | undefined; replication?: { names: string[]; }[] | undefined; }" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -4038,78 +4182,395 @@ }, { "parentPluginId": "security", - "id": "def-server.InvalidateAPIKeyResult", + "id": "def-server.CreateRestAPIKeyParams", "type": "Interface", "tags": [], - "label": "InvalidateAPIKeyResult", - "description": [ - "\nThe return value when invalidating an API key in Elasticsearch." - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "label": "CreateRestAPIKeyParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "security", - "id": "def-server.InvalidateAPIKeyResult.invalidated_api_keys", - "type": "Array", + "id": "def-server.CreateRestAPIKeyParams.type", + "type": "string", "tags": [], - "label": "invalidated_api_keys", - "description": [ - "\nThe IDs of the API keys that were invalidated as part of the request." - ], + "label": "type", + "description": [], "signature": [ - "string[]" + "\"rest\" | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "security", - "id": "def-server.InvalidateAPIKeyResult.previously_invalidated_api_keys", - "type": "Array", + "id": "def-server.CreateRestAPIKeyParams.expiration", + "type": "string", "tags": [], - "label": "previously_invalidated_api_keys", - "description": [ - "\nThe IDs of the API keys that were already invalidated." - ], + "label": "expiration", + "description": [], "signature": [ - "string[]" + "string | undefined" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "security", - "id": "def-server.InvalidateAPIKeyResult.error_count", - "type": "number", + "id": "def-server.CreateRestAPIKeyParams.name", + "type": "string", "tags": [], - "label": "error_count", - "description": [ - "\nThe number of errors that were encountered when invalidating the API keys." - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "security", - "id": "def-server.InvalidateAPIKeyResult.error_details", - "type": "Array", + "id": "def-server.CreateRestAPIKeyParams.role_descriptors", + "type": "Object", "tags": [], - "label": "error_details", - "description": [ - "\nDetails about these errors. This field is not present in the response when error_count is 0." - ], + "label": "role_descriptors", + "description": [], "signature": [ - "{ type?: string | undefined; reason?: string | undefined; caused_by?: { type?: string | undefined; reason?: string | undefined; } | undefined; }[] | undefined" + "{ [x: string]: { [key: string]: any; }; }" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false - } + }, + { + "parentPluginId": "security", + "id": "def-server.CreateRestAPIKeyParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams", + "type": "Interface", + "tags": [], + "label": "CreateRestAPIKeyWithKibanaPrivilegesParams", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"rest\" | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.expiration", + "type": "string", + "tags": [], + "label": "expiration", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.metadata", + "type": "Object", + "tags": [], + "label": "metadata", + "description": [], + "signature": [ + "{ [key: string]: any; } | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams.kibana_role_descriptors", + "type": "Object", + "tags": [], + "label": "kibana_role_descriptors", + "description": [], + "signature": [ + "{ [x: string]: { elasticsearch: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.ElasticsearchPrivilegesType", + "text": "ElasticsearchPrivilegesType" + }, + " & { [key: string]: unknown; }; kibana: ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.KibanaPrivilegesType", + "text": "KibanaPrivilegesType" + }, + "; }; }" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.ElasticsearchPrivilegesType", + "type": "Interface", + "tags": [], + "label": "ElasticsearchPrivilegesType", + "description": [ + "\nType representing Elasticsearch specific portion of the role definition." + ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.ElasticsearchPrivilegesType.cluster", + "type": "Array", + "tags": [], + "label": "cluster", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.ElasticsearchPrivilegesType.remote_cluster", + "type": "Array", + "tags": [], + "label": "remote_cluster", + "description": [], + "signature": [ + "{ privileges: string[]; clusters: string[]; }[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.ElasticsearchPrivilegesType.indices", + "type": "Array", + "tags": [], + "label": "indices", + "description": [], + "signature": [ + "{ names: string[]; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; privileges: string[]; query?: string | undefined; allow_restricted_indices?: boolean | undefined; }[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.ElasticsearchPrivilegesType.remote_indices", + "type": "Array", + "tags": [], + "label": "remote_indices", + "description": [], + "signature": [ + "{ clusters: string[]; names: string[]; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; privileges: string[]; query?: string | undefined; allow_restricted_indices?: boolean | undefined; }[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.ElasticsearchPrivilegesType.run_as", + "type": "Array", + "tags": [], + "label": "run_as", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/roles/schema.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.GrantAPIKeyResult", + "type": "Interface", + "tags": [], + "label": "GrantAPIKeyResult", + "description": [], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.GrantAPIKeyResult.id", + "type": "string", + "tags": [], + "label": "id", + "description": [ + "\nUnique id for this API key" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.GrantAPIKeyResult.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "\nName for this API key" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.GrantAPIKeyResult.api_key", + "type": "string", + "tags": [], + "label": "api_key", + "description": [ + "\nGenerated API key" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.InvalidateAPIKeyResult", + "type": "Interface", + "tags": [], + "label": "InvalidateAPIKeyResult", + "description": [ + "\nThe return value when invalidating an API key in Elasticsearch." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.InvalidateAPIKeyResult.invalidated_api_keys", + "type": "Array", + "tags": [], + "label": "invalidated_api_keys", + "description": [ + "\nThe IDs of the API keys that were invalidated as part of the request." + ], + "signature": [ + "string[]" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.InvalidateAPIKeyResult.previously_invalidated_api_keys", + "type": "Array", + "tags": [], + "label": "previously_invalidated_api_keys", + "description": [ + "\nThe IDs of the API keys that were already invalidated." + ], + "signature": [ + "string[]" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.InvalidateAPIKeyResult.error_count", + "type": "number", + "tags": [], + "label": "error_count", + "description": [ + "\nThe number of errors that were encountered when invalidating the API keys." + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "security", + "id": "def-server.InvalidateAPIKeyResult.error_details", + "type": "Array", + "tags": [], + "label": "error_details", + "description": [ + "\nDetails about these errors. This field is not present in the response when error_count is 0." + ], + "signature": [ + "{ type?: string | undefined; reason?: string | undefined; caused_by?: { type?: string | undefined; reason?: string | undefined; } | undefined; }[] | undefined" + ], + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", + "deprecated": false, + "trackAdoption": false + } ], "initialIsOpen": false }, @@ -4122,7 +4583,7 @@ "description": [ "\nRepresents the params for invalidating multiple API keys" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -4132,11 +4593,13 @@ "type": "Array", "tags": [], "label": "ids", - "description": [], + "description": [ + "\nList of unique API key IDs" + ], "signature": [ "string[]" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -4734,7 +5197,7 @@ "description": [ "\nRepresents the parameters for validating API Key credentials." ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -4747,7 +5210,7 @@ "description": [ "\nUnique id for this API key" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false }, @@ -4760,7 +5223,7 @@ "description": [ "\nGenerated API Key (secret)" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false } @@ -5092,9 +5555,31 @@ "label": "CreateAPIKeyParams", "description": [], "signature": [ - "Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; role_descriptors: Record>; }> | Readonly<{ type?: \"rest\" | undefined; metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { name: string; kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }> | Readonly<{ metadata?: Readonly<{} & {}> | undefined; expiration?: string | undefined; } & { type: \"cross_cluster\"; name: string; access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }>" + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyParams", + "text": "CreateRestAPIKeyParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateRestAPIKeyWithKibanaPrivilegesParams", + "text": "CreateRestAPIKeyWithKibanaPrivilegesParams" + }, + " | ", + { + "pluginId": "@kbn/core-security-server", + "scope": "common", + "docId": "kibKbnCoreSecurityServerPluginApi", + "section": "def-common.CreateCrossClusterAPIKeyParams", + "text": "CreateCrossClusterAPIKeyParams" + } ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -5111,67 +5596,7 @@ "signature": [ "SecurityCreateApiKeyResponse" ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "security", - "id": "def-server.CreateCrossClusterAPIKeyParams", - "type": "Type", - "tags": [], - "label": "CreateCrossClusterAPIKeyParams", - "description": [], - "signature": [ - "{ readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly type: \"cross_cluster\"; readonly name: string; readonly access: Readonly<{ search?: Readonly<{ query?: any; field_security?: any; allow_restricted_indices?: boolean | undefined; } & { names: string[]; }>[] | undefined; replication?: Readonly<{} & { names: string[]; }>[] | undefined; } & {}>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "security", - "id": "def-server.CreateRestAPIKeyParams", - "type": "Type", - "tags": [], - "label": "CreateRestAPIKeyParams", - "description": [], - "signature": [ - "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly name: string; readonly role_descriptors: Record>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "security", - "id": "def-server.CreateRestAPIKeyWithKibanaPrivilegesParams", - "type": "Type", - "tags": [], - "label": "CreateRestAPIKeyWithKibanaPrivilegesParams", - "description": [], - "signature": [ - "{ readonly type?: \"rest\" | undefined; readonly metadata?: Readonly<{} & {}> | undefined; readonly expiration?: string | undefined; readonly name: string; readonly kibana_role_descriptors: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]; elasticsearch: Readonly<{ cluster?: string[] | undefined; indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; run_as?: string[] | undefined; } & {}>; }>>; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authentication/api_keys/api_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "security", - "id": "def-server.ElasticsearchPrivilegesType", - "type": "Type", - "tags": [], - "label": "ElasticsearchPrivilegesType", - "description": [], - "signature": [ - "{ readonly cluster?: string[] | undefined; readonly indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; }>[] | undefined; readonly remote_cluster?: Readonly<{} & { privileges: string[]; clusters: string[]; }>[] | undefined; readonly remote_indices?: Readonly<{ query?: string | undefined; field_security?: Record<\"except\" | \"grant\", string[]> | undefined; allow_restricted_indices?: boolean | undefined; } & { names: string[]; privileges: string[]; clusters: string[]; }>[] | undefined; readonly run_as?: string[] | undefined; }" - ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts", + "path": "packages/core/security/core-security-server/src/authentication/api_keys/api_keys.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -5182,11 +5607,13 @@ "type": "Type", "tags": [], "label": "KibanaPrivilegesType", - "description": [], + "description": [ + "\nType representing Kibana specific portion of the role definition." + ], "signature": [ - "Readonly<{ base?: string[] | undefined; feature?: Record | undefined; } & { spaces: string[] | \"*\"[]; }>[]" + "{ spaces: string[]; base?: string[] | undefined; feature?: Record | undefined; }[]" ], - "path": "x-pack/packages/security/plugin_types_server/src/authorization/role_schema.ts", + "path": "packages/core/security/core-security-server/src/roles/schema.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -5316,29 +5743,9 @@ "plugin": "ml", "path": "x-pack/plugins/ml/server/routes/annotations.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/request_context_factory.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts" } ] }, @@ -5491,30 +5898,6 @@ "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_info_handler.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_download_handler.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" - }, { "plugin": "serverlessSearch", "path": "x-pack/plugins/serverless_search/server/routes/api_key_routes.ts" @@ -5614,30 +5997,6 @@ { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/list.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/state.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.test.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts" } ] }, diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 426eb872fc138..6fe96f7524444 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 415 | 0 | 206 | 1 | +| 438 | 0 | 222 | 1 | ## Client diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index e07a045ba7722..b5d8334c5d5b0 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -485,7 +485,7 @@ "\nExperimental flag needed to enable the link" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -565,7 +565,7 @@ "\nExperimental flag needed to disable the link. Opposite of experimentalKey" ], "signature": [ - "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"aiAssistantFlyoutMode\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" + "\"assistantKnowledgeBaseByDefault\" | \"assistantModelEvaluation\" | \"excludePoliciesInFilterEnabled\" | \"kubernetesEnabled\" | \"donutChartEmbeddablesEnabled\" | \"previewTelemetryUrlEnabled\" | \"extendedRuleExecutionLoggingEnabled\" | \"socTrendsEnabled\" | \"responseActionsEnabled\" | \"endpointResponseActionsEnabled\" | \"responseActionUploadEnabled\" | \"automatedProcessActionsEnabled\" | \"responseActionsSentinelOneV1Enabled\" | \"responseActionsSentinelOneV2Enabled\" | \"responseActionsSentinelOneGetFileEnabled\" | \"responseActionsSentinelOneKillProcessEnabled\" | \"responseActionsCrowdstrikeManualHostIsolationEnabled\" | \"responseActionScanEnabled\" | \"alertsPageChartsEnabled\" | \"alertTypeEnabled\" | \"expandableFlyoutDisabled\" | \"securitySolutionNotesEnabled\" | \"entityAlertPreviewEnabled\" | \"newUserDetailsFlyoutManagedUser\" | \"riskScoringPersistence\" | \"riskScoringRoutesEnabled\" | \"esqlRulesDisabled\" | \"protectionUpdatesEnabled\" | \"AIAssistantOnRuleCreationFormEnabled\" | \"disableTimelineSaveTour\" | \"alertSuppressionForEsqlRuleEnabled\" | \"riskEnginePrivilegesRouteEnabled\" | \"alertSuppressionForMachineLearningRuleEnabled\" | \"sentinelOneDataInAnalyzerEnabled\" | \"sentinelOneManualHostActionsEnabled\" | \"crowdstrikeDataInAnalyzerEnabled\" | \"jamfDataInAnalyzerEnabled\" | \"timelineEsqlTabDisabled\" | \"unifiedComponentsInTimelineEnabled\" | \"analyzerDatePickersAndSourcererDisabled\" | \"prebuiltRulesCustomizationEnabled\" | \"malwareOnWriteScanOptionAvailable\" | \"unifiedManifestEnabled\" | \"valueListItemsModalEnabled\" | \"bulkCustomHighlightedFieldsEnabled\" | \"manualRuleRunEnabled\" | \"filterProcessDescendantsForEventFiltersEnabled\" | undefined" ], "path": "x-pack/plugins/security_solution/public/common/links/types.ts", "deprecated": false, @@ -1964,7 +1964,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, @@ -3071,7 +3071,7 @@ "\nThe security solution generic experimental features" ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/server/plugin_contract.ts", "deprecated": false, @@ -3247,7 +3247,7 @@ "label": "ExperimentalFeatures", "description": [], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly aiAssistantFlyoutMode: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" + "{ readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly donutChartEmbeddablesEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly extendedRuleExecutionLoggingEnabled: boolean; readonly socTrendsEnabled: boolean; readonly responseActionsEnabled: boolean; readonly endpointResponseActionsEnabled: boolean; readonly responseActionUploadEnabled: boolean; readonly automatedProcessActionsEnabled: boolean; readonly responseActionsSentinelOneV1Enabled: boolean; readonly responseActionsSentinelOneV2Enabled: boolean; readonly responseActionsSentinelOneGetFileEnabled: boolean; readonly responseActionsSentinelOneKillProcessEnabled: boolean; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: boolean; readonly responseActionScanEnabled: boolean; readonly alertsPageChartsEnabled: boolean; readonly alertTypeEnabled: boolean; readonly expandableFlyoutDisabled: boolean; readonly securitySolutionNotesEnabled: boolean; readonly entityAlertPreviewEnabled: boolean; readonly assistantModelEvaluation: boolean; readonly assistantKnowledgeBaseByDefault: boolean; readonly newUserDetailsFlyoutManagedUser: boolean; readonly riskScoringPersistence: boolean; readonly riskScoringRoutesEnabled: boolean; readonly esqlRulesDisabled: boolean; readonly protectionUpdatesEnabled: boolean; readonly AIAssistantOnRuleCreationFormEnabled: boolean; readonly disableTimelineSaveTour: boolean; readonly alertSuppressionForEsqlRuleEnabled: boolean; readonly riskEnginePrivilegesRouteEnabled: boolean; readonly alertSuppressionForMachineLearningRuleEnabled: boolean; readonly sentinelOneDataInAnalyzerEnabled: boolean; readonly sentinelOneManualHostActionsEnabled: boolean; readonly crowdstrikeDataInAnalyzerEnabled: boolean; readonly jamfDataInAnalyzerEnabled: boolean; readonly timelineEsqlTabDisabled: boolean; readonly unifiedComponentsInTimelineEnabled: boolean; readonly analyzerDatePickersAndSourcererDisabled: boolean; readonly prebuiltRulesCustomizationEnabled: boolean; readonly malwareOnWriteScanOptionAvailable: boolean; readonly unifiedManifestEnabled: boolean; readonly valueListItemsModalEnabled: boolean; readonly bulkCustomHighlightedFieldsEnabled: boolean; readonly manualRuleRunEnabled: boolean; readonly filterProcessDescendantsForEventFiltersEnabled: boolean; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, @@ -3313,7 +3313,7 @@ "\nA list of allowed values that can be used in `xpack.securitySolution.enableExperimental`.\nThis object is then used to validate and parse the value entered." ], "signature": [ - "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutDisabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewEnabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly AIAssistantOnRuleCreationFormEnabled: false; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly alertSuppressionForMachineLearningRuleEnabled: false; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly jamfDataInAnalyzerEnabled: false; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly aiAssistantFlyoutMode: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: false; }" + "{ readonly excludePoliciesInFilterEnabled: false; readonly kubernetesEnabled: true; readonly donutChartEmbeddablesEnabled: false; readonly previewTelemetryUrlEnabled: false; readonly extendedRuleExecutionLoggingEnabled: false; readonly socTrendsEnabled: false; readonly responseActionsEnabled: true; readonly endpointResponseActionsEnabled: true; readonly responseActionUploadEnabled: true; readonly automatedProcessActionsEnabled: true; readonly responseActionsSentinelOneV1Enabled: true; readonly responseActionsSentinelOneV2Enabled: true; readonly responseActionsSentinelOneGetFileEnabled: true; readonly responseActionsSentinelOneKillProcessEnabled: false; readonly responseActionsCrowdstrikeManualHostIsolationEnabled: true; readonly responseActionScanEnabled: false; readonly alertsPageChartsEnabled: true; readonly alertTypeEnabled: false; readonly expandableFlyoutDisabled: false; readonly securitySolutionNotesEnabled: false; readonly entityAlertPreviewEnabled: false; readonly assistantModelEvaluation: false; readonly assistantKnowledgeBaseByDefault: false; readonly newUserDetailsFlyoutManagedUser: false; readonly riskScoringPersistence: true; readonly riskScoringRoutesEnabled: true; readonly esqlRulesDisabled: false; readonly protectionUpdatesEnabled: true; readonly AIAssistantOnRuleCreationFormEnabled: false; readonly disableTimelineSaveTour: false; readonly alertSuppressionForEsqlRuleEnabled: false; readonly riskEnginePrivilegesRouteEnabled: true; readonly alertSuppressionForMachineLearningRuleEnabled: false; readonly sentinelOneDataInAnalyzerEnabled: true; readonly sentinelOneManualHostActionsEnabled: true; readonly crowdstrikeDataInAnalyzerEnabled: true; readonly jamfDataInAnalyzerEnabled: false; readonly timelineEsqlTabDisabled: false; readonly unifiedComponentsInTimelineEnabled: false; readonly analyzerDatePickersAndSourcererDisabled: false; readonly prebuiltRulesCustomizationEnabled: false; readonly malwareOnWriteScanOptionAvailable: true; readonly unifiedManifestEnabled: true; readonly valueListItemsModalEnabled: true; readonly bulkCustomHighlightedFieldsEnabled: false; readonly manualRuleRunEnabled: false; readonly filterProcessDescendantsForEventFiltersEnabled: false; }" ], "path": "x-pack/plugins/security_solution/common/experimental_features.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 2beb77b8f021a..b7b2be2be7482 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 6f910f41ef9fa..ebb118cace66d 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index c45b80b05022b..9553b08dccff1 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 5edadd4df8584..57a0aa2229dee 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index a0d2eb5ba6340..bff2ac08d57f2 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 5caf420464062..7b7a7522bea8c 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 780c2b3b45e42..c9f4cec316f79 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 3131c5c2c6108..1ff559bbbd72b 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 1bceb41948c73..e70711708aece 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index b12b6a9ec84e1..145d3e958e819 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index e47eb24a3ffce..ed9a8c5947272 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 7bd81f0d77fe7..1293d7b86b30b 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 0d8eeb21ffb4b..087f7d8ac7cca 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index cafa9df73c7d7..79ed70ae22e34 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index bd107e8ace5ae..a4b2e92dba152 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 156c0703d5d00..05150e6ac611e 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index f998b3df27e23..0db1faf7d8cb4 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index c930712b12bcf..0e37f1419e164 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index ef23eb49129cc..bccc09ec31398 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 99e3b0e874c36..42ae21461db92 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 2a2604e67dd17..7570d1d8f7839 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index e4b742cbd7d1f..d461dc87124a5 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 882b2c6be2044..5fd2c4e8ccc02 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 5aa9989c99e79..fce6bfd75d250 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 1caa3e13cf3c6..4fe43ee8c187e 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index e523bb984eb86..079600b222919 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index bf5e4d8873990..d0be2830ce3ba 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 9be2c3796bffd..85e0450ad4b93 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 41ab261a2f6a1..ff2be9d4589ca 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; This plugin visualizes data from Heartbeat, and integrates with other Observability solutions. -Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) for questions regarding this plugin. +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 57e7235cc89b4..411863237c373 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 57af900f407c7..826632b661f6e 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 04268f31c0558..2590939f79170 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 00204bf4434c2..ed8c293707c3a 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 0524cbaa8be37..82e9d4bb26494 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 88bc88e7f03a2..ef2b0c3150811 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 90f824637708d..6fde86032473e 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 986e5117524d0..05412076e4ccd 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index f89789624e87c..f39474618a083 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 3f26a6dc228f4..9263d0a13bed5 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index c32fdb2696281..fcff5b44cd7b4 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 85f6705d4d4cc..f128139595729 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 62f1b17b448d9..959b152aca56a 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 210f5acd288f1..f45a58c6bfa54 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-07-09 +date: 2024-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 48d4d9ed2c67771a7746422a9203d0008b52b6f9 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 10 Jul 2024 12:01:24 +0300 Subject: [PATCH 21/82] [ML] API integration tests for `/trained_models/model_downloads` endpoint (#187865) ## Summary Part of #182235 Adds API integration tests for the `GET /internal/ml/trained_models/model_downloads` endpoint ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../apis/ml/trained_models/index.ts | 1 + .../apis/ml/trained_models/model_downloads.ts | 136 ++++++++++++++++++ 2 files changed, 137 insertions(+) create mode 100644 x-pack/test/api_integration/apis/ml/trained_models/model_downloads.ts diff --git a/x-pack/test/api_integration/apis/ml/trained_models/index.ts b/x-pack/test/api_integration/apis/ml/trained_models/index.ts index 1bb92dca1ec56..c9bf98545e2b4 100644 --- a/x-pack/test/api_integration/apis/ml/trained_models/index.ts +++ b/x-pack/test/api_integration/apis/ml/trained_models/index.ts @@ -15,5 +15,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./delete_model')); loadTestFile(require.resolve('./put_model')); loadTestFile(require.resolve('./start_stop_deployment')); + loadTestFile(require.resolve('./model_downloads')); }); } diff --git a/x-pack/test/api_integration/apis/ml/trained_models/model_downloads.ts b/x-pack/test/api_integration/apis/ml/trained_models/model_downloads.ts new file mode 100644 index 0000000000000..7954a7b31e900 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/trained_models/model_downloads.ts @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { type NodesInfoNodeInfo } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { getCommonRequestHeader } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + const deployment = getService('deployment'); + const esSupertest = getService('esSupertest'); + + describe('GET trained_models/model_downloads', function () { + before(async () => { + await ml.api.initSavedObjects(); + await ml.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it('returns the list of models available for download', async () => { + const isCloud = await deployment.isCloud(); + + const { body: mlNodesResponse } = await esSupertest.get('/_nodes/ml:true/os'); + + // Check that all ML nodes are Intel-based. + const areMlNodesIntelBased = Object.values( + mlNodesResponse.nodes as Record + ).every((node) => node.os?.name === 'Linux' && node.os?.arch === 'amd64'); + + const isIntelBased = isCloud || areMlNodesIntelBased; + + const { body, status } = await supertest + .get(`/internal/ml/trained_models/model_downloads`) + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(getCommonRequestHeader('1')); + ml.api.assertResponseStatusCode(200, status, body); + + expect(body.length).to.eql(5); + + expect(body).to.eql([ + { + modelName: 'elser', + hidden: true, + version: 1, + config: { + input: { + field_names: ['text_field'], + }, + }, + description: 'Elastic Learned Sparse EncodeR v1 (Tech Preview)', + type: ['elastic', 'pytorch', 'text_expansion'], + model_id: '.elser_model_1', + }, + { + modelName: 'elser', + version: 2, + config: { + input: { + field_names: ['text_field'], + }, + }, + description: 'Elastic Learned Sparse EncodeR v2', + type: ['elastic', 'pytorch', 'text_expansion'], + model_id: '.elser_model_2', + ...(isIntelBased ? { default: true } : { recommended: true }), + }, + { + modelName: 'elser', + version: 2, + os: 'Linux', + arch: 'amd64', + config: { + input: { + field_names: ['text_field'], + }, + }, + description: 'Elastic Learned Sparse EncodeR v2, optimized for linux-x86_64', + type: ['elastic', 'pytorch', 'text_expansion'], + model_id: '.elser_model_2_linux-x86_64', + ...(isIntelBased ? { recommended: true } : {}), + }, + { + modelName: 'e5', + version: 1, + config: { + input: { + field_names: ['text_field'], + }, + }, + description: 'E5 (EmbEddings from bidirEctional Encoder rEpresentations)', + license: 'MIT', + licenseUrl: 'https://huggingface.co/elastic/multilingual-e5-small', + type: ['pytorch', 'text_embedding'], + model_id: '.multilingual-e5-small', + ...(isIntelBased ? { default: true } : { recommended: true }), + }, + { + modelName: 'e5', + version: 1, + os: 'Linux', + arch: 'amd64', + config: { + input: { + field_names: ['text_field'], + }, + }, + description: + 'E5 (EmbEddings from bidirEctional Encoder rEpresentations), optimized for linux-x86_64', + license: 'MIT', + licenseUrl: 'https://huggingface.co/elastic/multilingual-e5-small_linux-x86_64', + type: ['pytorch', 'text_embedding'], + model_id: '.multilingual-e5-small_linux-x86_64', + ...(isIntelBased ? { recommended: true } : {}), + }, + ]); + }); + + it('returns an error for unauthorized user', async () => { + const { body, status } = await supertest + .get(`/internal/ml/trained_models/model_downloads`) + .auth(USER.ML_UNAUTHORIZED, ml.securityCommon.getPasswordForUser(USER.ML_UNAUTHORIZED)) + .set(getCommonRequestHeader('1')); + ml.api.assertResponseStatusCode(403, status, body); + }); + }); +}; From 657ea46c72ccbe4c6b8be2892546cdf3b26dc8fc Mon Sep 17 00:00:00 2001 From: mohamedhamed-ahmed Date: Wed, 10 Jul 2024 12:33:25 +0300 Subject: [PATCH 22/82] [Dataset Quality] Filter out irrelevant breakdown fields (#187900) closes https://github.com/elastic/kibana/issues/187898 --- .../dataset_quality/public/hooks/use_degraded_docs_chart.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx index 03da29c7e04ea..9d459f8227a40 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx +++ b/x-pack/plugins/observability_solution/dataset_quality/public/hooks/use_degraded_docs_chart.tsx @@ -14,7 +14,6 @@ import { useEuiTheme } from '@elastic/eui'; import { type DataView, DataViewField } from '@kbn/data-views-plugin/common'; import { useDatasetQualityContext } from '../components/dataset_quality/context'; import { DEFAULT_LOGS_DATA_VIEW } from '../../common/constants'; -import { indexNameToDataStreamParts } from '../../common/utils'; import { getLensAttributes } from '../components/flyout/degraded_docs_trend/lens_attributes'; import { useCreateDataView } from './use_create_dataview'; import { useRedirectLink } from './use_redirect_link'; @@ -193,7 +192,7 @@ export const useDegradedDocsChart = ({ dataStream }: DegradedDocsChartDeps) => { }; function getDataViewIndexPattern(dataStream: string | undefined) { - return dataStream ? `${indexNameToDataStreamParts(dataStream).type}-*-*` : DEFAULT_LOGS_DATA_VIEW; + return dataStream ?? DEFAULT_LOGS_DATA_VIEW; } function getDataViewField(dataView: DataView | undefined, fieldName: string | undefined) { From 7517bdc54c27e1d6e99cc6a462e35bc41f3ec0ae Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Wed, 10 Jul 2024 11:50:26 +0200 Subject: [PATCH 23/82] Adds link to ESO developer documentation in nav (#187867) ## Summary Adds link to the new encrypted saved objects developer documentation in the left hand navigation under "key concepts". --- nav-kibana-dev.docnav.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/nav-kibana-dev.docnav.json b/nav-kibana-dev.docnav.json index 050aee9d2e972..60d0494de9c71 100644 --- a/nav-kibana-dev.docnav.json +++ b/nav-kibana-dev.docnav.json @@ -80,6 +80,10 @@ "id": "kibDevDocsSavedObjectsIntro", "label": "Saved objects" }, + { + "id": "kibDevDocsEncryptedSavedObjectsIntro", + "label": "Encrypted Saved objects" + }, { "id": "kibDevDocsPersistableStateIntro" }, @@ -614,4 +618,4 @@ ] } ] -} +} \ No newline at end of file From 59d58721d854c7d114444b5bbd9ebe7579ec8d53 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 10 Jul 2024 11:58:29 +0200 Subject: [PATCH 24/82] Get rid of the infamous `10s` delay in Core's integration tests (#187858) ## Summary Fix https://github.com/elastic/kibana/issues/130240 --- .../migrations/group1/7_13_0_failed_action_tasks.test.ts | 2 -- .../migrations/group1/7_13_0_unknown_types.test.ts | 2 -- .../saved_objects/migrations/group2/batch_size_bytes.test.ts | 2 -- .../group2/batch_size_bytes_exceeds_es_content_length.test.ts | 2 -- .../migrations/group2/check_target_mappings.test.ts | 3 --- .../saved_objects/migrations/group2/cleanup.test.ts | 3 +-- .../migrations/group2/collects_corrupt_docs.test.ts | 2 -- .../migrations/group2/corrupt_outdated_docs.test.ts | 2 -- .../migrations/group2/multiple_kibana_nodes.test.ts | 1 - .../saved_objects/migrations/group2/outdated_docs.test.ts | 2 -- .../migrations/group3/deferred_migrations.test.ts | 2 -- .../migrations/group3/migration_from_older_v1.test.ts | 2 -- .../saved_objects/migrations/group3/multiple_es_nodes.test.ts | 4 ---- .../saved_objects/migrations/group3/read_batch_size.test.ts | 2 -- .../saved_objects/migrations/group3/rewriting_id.test.ts | 2 -- .../saved_objects/migrations/group3/skip_migration.test.ts | 2 -- .../migrations/group3/wait_for_migration_completion.test.ts | 2 -- .../saved_objects/migrations/group4/v2_md5_to_mv.test.ts | 3 +-- .../migrations/group4/v2_with_mv_same_stack_version.test.ts | 3 +-- .../migrations/group4/v2_with_mv_stack_version_bump.test.ts | 3 +-- .../saved_objects/migrations/group5/active_delete.test.ts | 2 -- .../group5/active_delete_multiple_instances.test.ts | 2 -- .../saved_objects/migrations/group5/skip_reindex.test.ts | 2 -- .../migrations/shared_suites/zdt/basic_document_migration.ts | 3 +-- .../migrations/shared_suites/zdt/standard_workflow.ts | 3 +-- .../saved_objects/migrations/zdt_1/basic_downgrade.test.ts | 3 +-- .../migrations/zdt_1/conversion_failures.test.ts | 3 +-- .../saved_objects/migrations/zdt_1/create_index.test.ts | 3 +-- .../saved_objects/migrations/zdt_1/document_cleanup.test.ts | 2 -- .../migrations/zdt_1/mapping_version_conflict.test.ts | 3 +-- .../saved_objects/migrations/zdt_1/rerun_same_version.test.ts | 3 +-- .../saved_objects/migrations/zdt_1/update_mappings.test.ts | 3 +-- .../saved_objects/migrations/zdt_2/outdated_doc_query.test.ts | 3 +-- .../migrations/zdt_2/root_field_addition.test.ts | 3 +-- .../saved_objects/migrations/zdt_2/type_addition.test.ts | 3 +-- .../migrations/zdt_2/v2_to_zdt_partial_failure.test.ts | 3 +-- .../saved_objects/migrations/zdt_2/v2_to_zdt_switch.test.ts | 3 +-- .../migrations/zdt_v2_compat/basic_document_migration.test.ts | 3 +-- .../migrations/zdt_v2_compat/create_index.test.ts | 3 +-- .../migrations/zdt_v2_compat/switch_to_model_version.test.ts | 3 +-- .../migrations/zdt_v2_compat/update_mappings.test.ts | 3 +-- .../saved_objects/service/lib/bulk_update.test.ts | 2 -- .../saved_objects/service/lib/update.test.ts | 2 -- .../saved_objects/validation/validator.test.ts | 2 -- 44 files changed, 21 insertions(+), 90 deletions(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_failed_action_tasks.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_failed_action_tasks.test.ts index 89478ea377f6c..16e0043062a63 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_failed_action_tasks.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_failed_action_tasks.test.ts @@ -57,8 +57,6 @@ describe('migration from 7.13 to 7.14+ with many failed action_tasks', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); const getCounts = async ( diff --git a/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_unknown_types.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_unknown_types.test.ts index 6b06337a367db..d9c4f0d7f33ae 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_unknown_types.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group1/7_13_0_unknown_types.test.ts @@ -58,8 +58,6 @@ describe('migration v2', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); describe('when `discardUnknownObjects` does not match current kibana version', () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts index bea50cf32ce35..e6c3ad412e746 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts @@ -89,8 +89,6 @@ describe('migration v2', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('completes the migration even when a full batch would exceed ES http.max_content_length', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes_exceeds_es_content_length.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes_exceeds_es_content_length.test.ts index 95baed313bd8c..4cdc89006c983 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes_exceeds_es_content_length.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes_exceeds_es_content_length.test.ts @@ -58,8 +58,6 @@ describe('migration v2', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('fails with a descriptive message when maxBatchSizeBytes exceeds ES http.max_content_length', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/check_target_mappings.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/check_target_mappings.test.ts index e79084ebdc34a..600a00e24e9fd 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/check_target_mappings.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/check_target_mappings.test.ts @@ -17,7 +17,6 @@ import { createTestServers, type TestElasticsearchUtils, } from '@kbn/core-test-helpers-kbn-server'; -import { delay } from '../test_utils'; const logFilePath = Path.join(__dirname, 'check_target_mappings.log'); @@ -33,7 +32,6 @@ describe('migration v2 - CHECK_TARGET_MAPPINGS', () => { afterEach(async () => { await root?.shutdown(); await esServer?.stop(); - await delay(10); }); it('is not run for new installations', async () => { @@ -80,7 +78,6 @@ describe('migration v2 - CHECK_TARGET_MAPPINGS', () => { // stop Kibana and remove logs await root.shutdown(); - await delay(10); await fs.unlink(logFilePath).catch(() => {}); root = createRoot(); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/cleanup.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/cleanup.test.ts index 7f04f37589f69..7c93c1477cf4a 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/cleanup.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/cleanup.test.ts @@ -13,7 +13,7 @@ import JSON5 from 'json5'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { SavedObjectsType } from '@kbn/core-saved-objects-server'; import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { getMigrationDocLink, delay } from '../test_utils'; +import { getMigrationDocLink } from '../test_utils'; import { clearLog, currentVersion, @@ -71,7 +71,6 @@ describe('migration v2', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); }); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/collects_corrupt_docs.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/collects_corrupt_docs.test.ts index 45b28e8ac3082..dbc5ea193ad56 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/collects_corrupt_docs.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/collects_corrupt_docs.test.ts @@ -42,8 +42,6 @@ describe('migration v2 with corrupt saved object documents', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('collects corrupt saved object documents across batches', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/corrupt_outdated_docs.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/corrupt_outdated_docs.test.ts index 384cdcbfa8abd..728625003637e 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/corrupt_outdated_docs.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/corrupt_outdated_docs.test.ts @@ -40,8 +40,6 @@ describe('migration v2 with corrupt saved object documents', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it.skip('collects corrupt saved object documents across batches', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kibana_nodes.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kibana_nodes.test.ts index 80d75d757ca4d..d82863f01928c 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kibana_nodes.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/multiple_kibana_nodes.test.ts @@ -171,7 +171,6 @@ describe.skip('migration v2', () => { if (esServer) { await esServer.stop(); - await delay(10000); } }); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/outdated_docs.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/outdated_docs.test.ts index 79a76c72adefc..e7579a7ce4a91 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/outdated_docs.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/outdated_docs.test.ts @@ -41,8 +41,6 @@ describe('migration v2', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('migrates the documents to the highest version', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/deferred_migrations.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/deferred_migrations.test.ts index 8a40466ee2588..41c9501d7e6b2 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/deferred_migrations.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/deferred_migrations.test.ts @@ -12,7 +12,6 @@ import type { SavedObjectsType, SavedObjectUnsanitizedDoc, } from '@kbn/core-saved-objects-server'; -import { delay } from '../test_utils'; import '../jest_matchers'; import { @@ -36,7 +35,6 @@ describe('deferred migrations', () => { afterAll(async () => { await server?.stop(); - await delay(10); }); beforeEach(async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts index d32c2f0902b4e..45ffbb709854c 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts @@ -170,8 +170,6 @@ describe('migrating from 7.3.0-xpack which used v1 migrations', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }; beforeAll(async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/multiple_es_nodes.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/multiple_es_nodes.test.ts index e4350c431977b..73e31881b0a91 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/multiple_es_nodes.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/multiple_es_nodes.test.ts @@ -103,10 +103,6 @@ describe('migration v2', () => { await removeLogFile(); }); - afterAll(async () => { - await new Promise((resolve) => setTimeout(resolve, 10000)); - }); - afterEach(async () => { if (root) { await root.shutdown(); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/read_batch_size.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/read_batch_size.test.ts index 0fce643975c53..3a91a8477d4e5 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/read_batch_size.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/read_batch_size.test.ts @@ -13,7 +13,6 @@ import { createRootWithCorePlugins, type TestElasticsearchUtils, } from '@kbn/core-test-helpers-kbn-server'; -import { delay } from '../test_utils'; import { startElasticsearch } from '../kibana_migrator_test_kit'; const logFilePath = Path.join(__dirname, 'read_batch_size.log'); @@ -33,7 +32,6 @@ describe('migration v2 - read batch size', () => { afterEach(async () => { await root?.shutdown(); await esServer?.stop(); - await delay(10); }); it('reduces the read batchSize in half if a batch exceeds maxReadBatchSizeBytes', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts index 6079469cf4982..70768bd3f7009 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts @@ -108,8 +108,6 @@ describe('migration v2', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('rewrites id deterministically for SO with namespaceType: "multiple" and "multiple-isolated"', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/skip_migration.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/skip_migration.test.ts index e24c50d2cb4c9..54ac46754acc4 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/skip_migration.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/skip_migration.test.ts @@ -71,8 +71,6 @@ describe('starting with `migration.skip: true` when indices are up to date', () if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('starts and display the correct service status', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/wait_for_migration_completion.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/wait_for_migration_completion.test.ts index 459cfc921badf..266e821abf7e3 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/wait_for_migration_completion.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/wait_for_migration_completion.test.ts @@ -40,8 +40,6 @@ describe('migration with waitForCompletion=true', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('waits for another instance to complete the migration', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group4/v2_md5_to_mv.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group4/v2_md5_to_mv.test.ts index 4e1cb4d06e38f..1277370f45835 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group4/v2_md5_to_mv.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group4/v2_md5_to_mv.test.ts @@ -19,7 +19,7 @@ import { readLog, startElasticsearch, } from '../kibana_migrator_test_kit'; -import { delay, createType } from '../test_utils'; +import { createType } from '../test_utils'; import '../jest_matchers'; const logFilePath = Path.join(__dirname, 'v2_md5_to_mv.test.log'); @@ -270,6 +270,5 @@ describe('V2 algorithm', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); }); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_same_stack_version.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_same_stack_version.test.ts index bfc105ee7d160..ba4a19de81741 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_same_stack_version.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_same_stack_version.test.ts @@ -14,7 +14,7 @@ import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server import { modelVersionToVirtualVersion } from '@kbn/core-saved-objects-base-server-internal'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, createType, parseLogFile } from '../test_utils'; +import { createType, parseLogFile } from '../test_utils'; import { getBaseMigratorParams } from '../fixtures/zdt_base.fixtures'; const logFilePath = Path.join(__dirname, 'v2_with_mv_same_stack_version.test.log'); @@ -31,7 +31,6 @@ describe('V2 algorithm - using model versions - upgrade without stack version in afterAll(async () => { await esServer?.stop(); - await delay(10); }); const getTestModelVersionType = ({ beforeUpgrade }: { beforeUpgrade: boolean }) => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_stack_version_bump.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_stack_version_bump.test.ts index 7a5d8a686f084..f24dc6fd427fe 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_stack_version_bump.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group4/v2_with_mv_stack_version_bump.test.ts @@ -14,7 +14,7 @@ import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server import { modelVersionToVirtualVersion } from '@kbn/core-saved-objects-base-server-internal'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, createType, parseLogFile } from '../test_utils'; +import { createType, parseLogFile } from '../test_utils'; import { getBaseMigratorParams } from '../fixtures/zdt_base.fixtures'; const logFilePath = Path.join(__dirname, 'v2_with_mv_stack_version_bump.test.log'); @@ -31,7 +31,6 @@ describe('V2 algorithm - using model versions - stack version bump scenario', () afterAll(async () => { await esServer?.stop(); - await delay(10); }); const getTestSwitchType = ({ beforeUpgrade }: { beforeUpgrade: boolean }) => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete.test.ts index d950129dac69a..cd1a98fa3ee57 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete.test.ts @@ -22,7 +22,6 @@ import { getIncompatibleMappingsMigrator, getNonDeprecatedMappingsMigrator, } from '../kibana_migrator_test_kit'; -import { delay } from '../test_utils'; describe('when upgrading to a new stack version', () => { let esServer: TestElasticsearchUtils['es']; @@ -34,7 +33,6 @@ describe('when upgrading to a new stack version', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); describe('if the mappings match (diffMappings() === false)', () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete_multiple_instances.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete_multiple_instances.test.ts index e297b39847f10..e0233cccb3fb7 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete_multiple_instances.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/active_delete_multiple_instances.test.ts @@ -23,7 +23,6 @@ import { startElasticsearch, } from '../kibana_migrator_test_kit'; import { baselineTypes } from './active_delete.fixtures'; -import { delay } from '../test_utils'; import { createBaselineArchive } from '../kibana_migrator_archive_utils'; const PARALLEL_MIGRATORS = 6; @@ -146,7 +145,6 @@ describe('multiple migrator instances running in parallel', () => { afterAll(async () => { // await esClient?.indices.delete({ index: `${kibanaIndex}_${currentVersion}_001` }); await esServer?.stop(); - await delay(10); }); const getAggregatedTypesCount = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/group5/skip_reindex.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group5/skip_reindex.test.ts index 4d244314d3acb..b93f96671d96f 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group5/skip_reindex.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group5/skip_reindex.test.ts @@ -20,7 +20,6 @@ import { startElasticsearch, KibanaMigratorTestKit, } from '../kibana_migrator_test_kit'; -import { delay } from '../test_utils'; describe('when migrating to a new version', () => { let esServer: TestElasticsearchUtils['es']; @@ -144,6 +143,5 @@ describe('when migrating to a new version', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); }); diff --git a/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/basic_document_migration.ts b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/basic_document_migration.ts index 0c43a40478d03..9e3d01dd0ecec 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/basic_document_migration.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/basic_document_migration.ts @@ -11,7 +11,7 @@ import { range, sortBy } from 'lodash'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../../jest_matchers'; import { getKibanaMigratorTestKit } from '../../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../../test_utils'; +import { parseLogFile } from '../../test_utils'; import { EsRunner, EsServer } from '../../test_types'; import { getBaseMigratorParams, @@ -35,7 +35,6 @@ export function createBasicDocumentsMigrationTest({ afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/standard_workflow.ts b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/standard_workflow.ts index b22e522d1d2c1..f0709e8720ce7 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/standard_workflow.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/shared_suites/zdt/standard_workflow.ts @@ -11,7 +11,7 @@ import { range } from 'lodash'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../../jest_matchers'; import { getKibanaMigratorTestKit } from '../../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../../test_utils'; +import { parseLogFile } from '../../test_utils'; import { EsRunner, EsServer } from '../../test_types'; import { getBaseMigratorParams, @@ -36,7 +36,6 @@ export function createStandardWorkflowTest({ afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_downgrade.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_downgrade.test.ts index 8968fe7bac408..c541f57a6111a 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_downgrade.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/basic_downgrade.test.ts @@ -13,7 +13,7 @@ import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile, createType } from '../test_utils'; +import { parseLogFile, createType } from '../test_utils'; import { getBaseMigratorParams } from '../fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'basic_downgrade.test.log'); @@ -28,7 +28,6 @@ describe('ZDT upgrades - basic downgrade', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const typeV1 = createType({ diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/conversion_failures.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/conversion_failures.test.ts index 05f8f30edacc6..b9821dc62442b 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/conversion_failures.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/conversion_failures.test.ts @@ -13,7 +13,7 @@ import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getSampleAType, @@ -31,7 +31,6 @@ describe('ZDT upgrades - encountering conversion failures', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); beforeEach(async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/create_index.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/create_index.test.ts index f0b049b8307db..6f12311009e21 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/create_index.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/create_index.test.ts @@ -11,7 +11,7 @@ import fs from 'fs/promises'; import '../jest_matchers'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType, getBarType } from '../fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'create_index.test.log'); @@ -26,7 +26,6 @@ describe('ZDT upgrades - running on a fresh cluster', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); it('create the index with the correct mappings and meta', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/document_cleanup.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/document_cleanup.test.ts index ab707f792fbe9..e0341915c7dd3 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/document_cleanup.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/document_cleanup.test.ts @@ -13,7 +13,6 @@ import { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay } from '../test_utils'; import { getBaseMigratorParams, getDeletedType, @@ -35,7 +34,6 @@ describe('ZDT upgrades - document cleanup', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/mapping_version_conflict.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/mapping_version_conflict.test.ts index 7b0658fbd977e..a19db9811462c 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/mapping_version_conflict.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/mapping_version_conflict.test.ts @@ -11,7 +11,7 @@ import fs from 'fs/promises'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType, @@ -33,7 +33,6 @@ describe('ZDT upgrades - mapping model version conflict', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/rerun_same_version.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/rerun_same_version.test.ts index 398a133bf990a..6c4d8688450bf 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/rerun_same_version.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/rerun_same_version.test.ts @@ -11,7 +11,7 @@ import fs from 'fs/promises'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType, getBarType } from '../fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'rerun_same_version.test.log'); @@ -26,7 +26,6 @@ describe('ZDT upgrades - rerun migration on same version', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/update_mappings.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/update_mappings.test.ts index c51c712f34452..82ff0a1c0d5ec 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_1/update_mappings.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_1/update_mappings.test.ts @@ -11,7 +11,7 @@ import fs from 'fs/promises'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType, @@ -31,7 +31,6 @@ describe('ZDT upgrades - basic mapping update', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/outdated_doc_query.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/outdated_doc_query.test.ts index cc901b56f3818..f403fe6c3579a 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/outdated_doc_query.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/outdated_doc_query.test.ts @@ -12,7 +12,7 @@ import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import '../jest_matchers'; import { SavedObjectsModelVersionMap, SavedObject } from '@kbn/core-saved-objects-server'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, createType } from '../test_utils'; +import { createType } from '../test_utils'; import { getBaseMigratorParams } from '../fixtures/zdt_base.fixtures'; import { SavedObjectsSerializer, @@ -114,7 +114,6 @@ describe('getOutdatedDocumentsQuery', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); it('creates a query returning the expected documents', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/root_field_addition.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/root_field_addition.test.ts index 47f853187b18f..1ce530a9c46c1 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/root_field_addition.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/root_field_addition.test.ts @@ -27,7 +27,7 @@ import fs from 'fs/promises'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType } from '../fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'root_field_addition.test.log'); @@ -42,7 +42,6 @@ describe('ZDT upgrades - introducing new root fields', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const baseMappings = { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/type_addition.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/type_addition.test.ts index 61697df6ecef6..770fade1d436c 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/type_addition.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/type_addition.test.ts @@ -11,7 +11,7 @@ import fs from 'fs/promises'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType, getBarType } from '../fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'type_addition.test.log'); @@ -26,7 +26,6 @@ describe('ZDT upgrades - introducing a new SO type', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_partial_failure.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_partial_failure.test.ts index 0cfebd3d8514b..fb3c11e68299f 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_partial_failure.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_partial_failure.test.ts @@ -13,7 +13,7 @@ import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile, createType } from '../test_utils'; +import { parseLogFile, createType } from '../test_utils'; import { getBaseMigratorParams, noopMigration } from '../fixtures/zdt_base.fixtures'; const logFilePath = Path.join(__dirname, 'v2_to_zdt_partial_failure.test.log'); @@ -28,7 +28,6 @@ describe('ZDT with v2 compat - recovering from partially migrated state', () => afterAll(async () => { await esServer?.stop(); - await delay(10); }); const typeBefore = createType({ diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_switch.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_switch.test.ts index 4a92a9d14eef4..dfbe0aeba8866 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_switch.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_switch.test.ts @@ -18,7 +18,7 @@ import { startElasticsearch, currentVersion, } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getSampleAType } from '../fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'v2_to_zdt_switch.test.log'); @@ -35,7 +35,6 @@ describe('ZDT upgrades - switching from v2 algorithm', () => { afterEach(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async ({ diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/basic_document_migration.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/basic_document_migration.test.ts index c71ca527f1270..5bd16f0110c63 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/basic_document_migration.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/basic_document_migration.test.ts @@ -13,7 +13,7 @@ import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getSampleAType, @@ -32,7 +32,6 @@ describe('ZDT with v2 compat - basic document migration', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/create_index.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/create_index.test.ts index 6f1b8257ddb26..d9f76907087be 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/create_index.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/create_index.test.ts @@ -11,7 +11,7 @@ import fs from 'fs/promises'; import '../jest_matchers'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType, getLegacyType } from '../fixtures/zdt_base.fixtures'; const logFilePath = Path.join(__dirname, 'create_index.test.log'); @@ -26,7 +26,6 @@ describe('ZDT with v2 compat - running on a fresh cluster', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); it('create the index with the correct mappings and meta', async () => { diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/switch_to_model_version.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/switch_to_model_version.test.ts index 1aa65bc1cdd02..fa72c8f1edae8 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/switch_to_model_version.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/switch_to_model_version.test.ts @@ -13,7 +13,7 @@ import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile, createType } from '../test_utils'; +import { parseLogFile, createType } from '../test_utils'; import { getBaseMigratorParams, noopMigration } from '../fixtures/zdt_base.fixtures'; const logFilePath = Path.join(__dirname, 'switch_to_model_version.test.log'); @@ -28,7 +28,6 @@ describe('ZDT with v2 compat - type switching from migration to model version', afterAll(async () => { await esServer?.stop(); - await delay(10); }); const typeBefore = createType({ diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/update_mappings.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/update_mappings.test.ts index 0c4956105fc78..9f3e58d6812fa 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/update_mappings.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_v2_compat/update_mappings.test.ts @@ -11,7 +11,7 @@ import fs from 'fs/promises'; import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; import '../jest_matchers'; import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; -import { delay, parseLogFile } from '../test_utils'; +import { parseLogFile } from '../test_utils'; import { getBaseMigratorParams, getFooType, @@ -32,7 +32,6 @@ describe('ZDT with v2 compat - basic mapping update', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const createBaseline = async () => { diff --git a/src/core/server/integration_tests/saved_objects/service/lib/bulk_update.test.ts b/src/core/server/integration_tests/saved_objects/service/lib/bulk_update.test.ts index 98af19ec5c9d0..4cd661add5053 100644 --- a/src/core/server/integration_tests/saved_objects/service/lib/bulk_update.test.ts +++ b/src/core/server/integration_tests/saved_objects/service/lib/bulk_update.test.ts @@ -17,7 +17,6 @@ import { getKibanaMigratorTestKit, startElasticsearch, } from '../../migrations/kibana_migrator_test_kit'; -import { delay } from '../../migrations/test_utils'; import { getBaseMigratorParams } from '../../migrations/fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'bulk_update.test.log'); @@ -32,7 +31,6 @@ describe('SOR - bulk_update API', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const getCrossVersionType = (version: 'v1' | 'v2'): SavedObjectsType => { diff --git a/src/core/server/integration_tests/saved_objects/service/lib/update.test.ts b/src/core/server/integration_tests/saved_objects/service/lib/update.test.ts index f9205086ceb2e..b4c9c912f7331 100644 --- a/src/core/server/integration_tests/saved_objects/service/lib/update.test.ts +++ b/src/core/server/integration_tests/saved_objects/service/lib/update.test.ts @@ -17,7 +17,6 @@ import { getKibanaMigratorTestKit, startElasticsearch, } from '../../migrations/kibana_migrator_test_kit'; -import { delay } from '../../migrations/test_utils'; import { getBaseMigratorParams } from '../../migrations/fixtures/zdt_base.fixtures'; export const logFilePath = Path.join(__dirname, 'update.test.log'); @@ -93,7 +92,6 @@ describe('SOR - update API', () => { afterAll(async () => { await esServer?.stop(); - await delay(10); }); const setup = async () => { diff --git a/src/core/server/integration_tests/saved_objects/validation/validator.test.ts b/src/core/server/integration_tests/saved_objects/validation/validator.test.ts index a0dc22440f1df..4f79a8618df02 100644 --- a/src/core/server/integration_tests/saved_objects/validation/validator.test.ts +++ b/src/core/server/integration_tests/saved_objects/validation/validator.test.ts @@ -164,8 +164,6 @@ describe.skip('validates saved object types when a schema is provided', () => { if (esServer) { await esServer.stop(); } - - await new Promise((resolve) => setTimeout(resolve, 10000)); }); it('does nothing when no schema is provided', async () => { From ea2509914f2238c646bb63eb5bbbb240365fd04d Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 10 Jul 2024 12:08:16 +0200 Subject: [PATCH 25/82] [BK] Migrate es-forward (+add versions.json dependent triggering) (#184018) ## Goal We'd like to introduce a way to run pipelines that have a dependency on the currently active branch set (managed in [versions.json](./versions.json)). With this, we'd like to migrate over the `es-forward` pipelines (currently: [this](https://buildkite.com/elastic/kibana-7-dot-17-es-8-dot-15-forward-compatibility), and [this](https://buildkite.com/elastic/kibana-7-dot-17-es-8-dot-14-forward-compatibility)) to the new buildkite infra. ## Summary This PR introduces a new pipeline: https://buildkite.com/elastic/kibana-trigger-version-dependent-jobs (through [trigger-version-dependent-jobs.yml](.buildkite/pipeline-resource-definitions/trigger-version-dependent-jobs.yml)). The purpose of this new pipeline is to take the name of a "pipelineSet" that refers to a pipeline, and based on the `versions.json` file, work out what are the branches on which the referred pipeline should be triggered. ### Example: `Trigger ES forward compatibility tests` - a scheduled run on [kibana-trigger-version-dependent-jobs](https://buildkite.com/elastic/kibana-trigger-version-dependent-jobs) with the env var `TRIGGER_PIPELINE_SET=es-forward` runs - the pipeline implementation for `kibana-trigger-version-dependent-jobs` works out (looking at `versions.json`), that the `es-forward` set should trigger https://buildkite.com/elastic/kibana-es-forward (doesn't exist prior to the PR) for (7.17+8.14) and (7.17+8.15) - the pipeline implementation uploads two trigger steps, running https://buildkite.com/elastic/kibana-es-forward in two instances with the relevant parameterization. Since the trigger parameters are derived from the `versions.json` file, if we move on and close `8.14`, and open up `8.16`, this will follow, without having to update the pipeline resources or schedules. ## Changes - 2 pipelines created: [trigger-version-dependent-jobs.yml](.buildkite/pipeline-resource-definitions/trigger-version-dependent-jobs.yml), [kibana-es-forward.yml](.buildkite/pipeline-resource-definitions/kibana-es-forward.yml) - [x] add kibana-es-forward.yml - implementation for `trigger-version-dependent-jobs` added - branch configuration removed from pipelines (kibana-artifacts-staging, kibana-artifacts-snapshot, kibana-artifacts-trigger) - added a script for checking RREs validity (moved a few files) ## Verification I've used the migration staging pipeline (*) to run this: - https://buildkite.com/elastic/kibana-migration-pipeline-staging/builds/130 - Env: `TRIGGER_PIPELINE_SET="artifacts-trigger"` - Result: [(success):](https://buildkite.com/elastic/kibana-artifacts-trigger/builds/10806) it triggered for 8.14 only (as expected) - https://buildkite.com/elastic/kibana-migration-pipeline-staging/builds/131 - Env: `TRIGGER_PIPELINE_SET="es-forward"` - Result: (success): it generated 2 trigger steps, but since the es-forward pipeline doesn't exist, the upload step failed - https://buildkite.com/elastic/kibana-migration-pipeline-staging/builds/132 - Env: `TRIGGER_PIPELINE_SET="artifacts-snapshot"` - Result: (success): it triggered jobs for all 3 open branches (main/8.14/7.17) - https://buildkite.com/elastic/kibana-migration-pipeline-staging/builds/134 - Env: `TRIGGER_PIPELINE_SET="artifacts-staging"` - Result: (success): it triggered 8.14 / 7.14, but not for main (*note: this migration staging pipeline will come in handy even after the migration, to stage newly created pipelines without creating the resource up-front) --- .../pipeline-resource-definitions/README.md | 28 +++ .../_new_pipeline.yml} | 0 .../kibana-artifacts-snapshot.yml | 18 -- .../kibana-artifacts-staging.yml | 14 -- .../kibana-artifacts-trigger.yml | 10 - .../kibana-es-forward-testing.yml | 41 ++++ .../locations.yml | 2 + .../{ => scripts}/fix-location-collection.ts | 12 +- .../scripts/validate-pipeline-definition.sh | 28 +++ .../trigger-version-dependent-jobs.yml | 71 +++++++ .buildkite/pipeline-utils/utils.test.ts | 45 +++++ .buildkite/pipeline-utils/utils.ts | 42 +++- .buildkite/scripts/common/util.sh | 6 + .../pipeline.sh | 5 + .../pipeline.test.ts | 77 ++++++++ .../pipeline.ts | 179 ++++++++++++++++++ .buildkite/scripts/steps/artifacts/cloud.sh | 5 + .buildkite/scripts/steps/artifacts/publish.sh | 9 + 18 files changed, 543 insertions(+), 49 deletions(-) create mode 100644 .buildkite/pipeline-resource-definitions/README.md rename .buildkite/pipeline-resource-definitions/{_template/template.yml => _templates/_new_pipeline.yml} (100%) create mode 100644 .buildkite/pipeline-resource-definitions/kibana-es-forward-testing.yml rename .buildkite/pipeline-resource-definitions/{ => scripts}/fix-location-collection.ts (83%) create mode 100755 .buildkite/pipeline-resource-definitions/scripts/validate-pipeline-definition.sh create mode 100644 .buildkite/pipeline-resource-definitions/trigger-version-dependent-jobs.yml create mode 100644 .buildkite/pipeline-utils/utils.test.ts create mode 100755 .buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.sh create mode 100644 .buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.test.ts create mode 100755 .buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.ts diff --git a/.buildkite/pipeline-resource-definitions/README.md b/.buildkite/pipeline-resource-definitions/README.md new file mode 100644 index 0000000000000..07a3e54fd93bd --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/README.md @@ -0,0 +1,28 @@ +# Buildkite pipeline resource definitions + +## Overview +The pipeline resources are "RRE" (real resource entities) that are used to create/maintain buildkite pipelines. + +The resources described in these files are parsed and loaded to Backstage (https://backstage.elastic.dev). +From there, [Terrazzo](https://buildkite.com/elastic/terrazzo/) is generating and updating the buildkite pipelines. + +These pipelines are referenced indirectly through the root's [`catalog-info.yaml`](../../catalog-info.yaml) file in order to reduce bloat in the main resources file. +There's a location file that collects files defined in this folder ([locations.yml](locations.yml)), this file needs to be updated in order to keep track of local files. + +Available parameters and further help can be found here: https://docs.elastic.dev/ci/getting-started-with-buildkite-at-elastic + +## Creating a new pipeline resource definition +The easiest way to create a new pipeline is either by copying and editing a similar pipeline, +or by copying a blank template (see [_new_pipeline.yml](_templates/_new_pipeline.yml)) and editing that. + +You can validate your pipeline's structural integrity, and it's conformity to baseline rules by running the following command: +```bash +.buildkite/pipeline-resource-definitions/scripts/validate-pipeline-definition.sh +``` + +Once you've added the file, you should update the [locations.yml](locations.yml) file to include the new pipeline, or run the following command to update it: +```bash +.buildkite/pipeline-resource-definitions/scripts/fix-location-collection.ts +``` + +Add your pipeline implementation, commit & push & merge. The pipeline resource will appear in Backstage within minutes, then the pipeline will be added to Buildkite within ~10 minutes. \ No newline at end of file diff --git a/.buildkite/pipeline-resource-definitions/_template/template.yml b/.buildkite/pipeline-resource-definitions/_templates/_new_pipeline.yml similarity index 100% rename from .buildkite/pipeline-resource-definitions/_template/template.yml rename to .buildkite/pipeline-resource-definitions/_templates/_new_pipeline.yml diff --git a/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml b/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml index 46c31b20ec009..e1c40f690f4ec 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-artifacts-snapshot.yml @@ -22,7 +22,6 @@ spec: ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' allow_rebuilds: true - branch_configuration: main 8.15 8.14 7.17 default_branch: main repository: elastic/kibana pipeline_file: .buildkite/pipelines/artifacts.yml @@ -44,20 +43,3 @@ spec: access_level: MANAGE_BUILD_AND_READ kibana-tech-leads: access_level: MANAGE_BUILD_AND_READ - schedules: - Daily build (main): - cronline: 0 7 * * * America/New_York - message: Daily build - branch: main - Daily build (8.15): - cronline: 0 7 * * * America/New_York - message: Daily build - branch: '8.15' - Daily build (8.14): - cronline: 0 7 * * * America/New_York - message: Daily build - branch: '8.14' - Daily build (7.17): - cronline: 0 7 * * * America/New_York - message: Daily build - branch: '7.17' diff --git a/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml b/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml index c3cb560290280..71bcc4079c50d 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml @@ -23,7 +23,6 @@ spec: ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' allow_rebuilds: true - branch_configuration: 7.17 8.14 8.15 repository: elastic/kibana pipeline_file: .buildkite/pipelines/artifacts.yml skip_intermediate_builds: false @@ -44,16 +43,3 @@ spec: access_level: MANAGE_BUILD_AND_READ kibana-tech-leads: access_level: MANAGE_BUILD_AND_READ - schedules: - Daily build (8.15): - cronline: 0 7 * * * America/New_York - message: Daily build - branch: '8.15' - Daily build (8.14): - cronline: 0 7 * * * America/New_York - message: Daily build - branch: '8.14' - Daily build (7.17): - cronline: 0 7 * * * America/New_York - message: Daily build - branch: '7.17' diff --git a/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml b/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml index 7d83453dab783..8a9585762de83 100644 --- a/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml +++ b/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml @@ -23,7 +23,6 @@ spec: ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' allow_rebuilds: true - branch_configuration: 8.15 8.14 default_branch: main repository: elastic/kibana pipeline_file: .buildkite/pipelines/artifacts_trigger.yml @@ -45,12 +44,3 @@ spec: access_level: MANAGE_BUILD_AND_READ kibana-tech-leads: access_level: MANAGE_BUILD_AND_READ - schedules: - Daily build (8.15): - cronline: 0 */2 * * * America/New_York - message: Daily build - branch: '8.15' - Daily build (8.14): - cronline: 0 */2 * * * America/New_York - message: Daily build - branch: '8.14' diff --git a/.buildkite/pipeline-resource-definitions/kibana-es-forward-testing.yml b/.buildkite/pipeline-resource-definitions/kibana-es-forward-testing.yml new file mode 100644 index 0000000000000..dea4426e60e1b --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/kibana-es-forward-testing.yml @@ -0,0 +1,41 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: bk-kibana-es-forward-compatibility-testing + description: Forward compatibility testing between Kibana 7.17 and ES 8+ + links: + - url: 'https://buildkite.com/elastic/kibana-es-forward-compatibility-testing' + title: Pipeline link +spec: + type: buildkite-pipeline + system: buildkite + owner: 'group:kibana-operations' + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: kibana / ES Forward Compatibility Testing + description: Forward compatibility testing between Kibana 7.17 and ES 8+ + spec: + env: + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' + ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + allow_rebuilds: false + branch_configuration: main + default_branch: main + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/es_forward.yml # Note: this file exists in 7.17 only + skip_intermediate_builds: false + provider_settings: + prefix_pull_request_fork_branch_names: false + trigger_mode: none + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + appex-qa: + access_level: MANAGE_BUILD_AND_READ + kibana-tech-leads: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipeline-resource-definitions/locations.yml b/.buildkite/pipeline-resource-definitions/locations.yml index c4e07b0d055c1..35115b00e273b 100644 --- a/.buildkite/pipeline-resource-definitions/locations.yml +++ b/.buildkite/pipeline-resource-definitions/locations.yml @@ -14,6 +14,7 @@ spec: - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-artifacts-staging.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-artifacts-trigger.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-coverage-daily.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-es-forward-testing.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-es-serverless-snapshots.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-es-snapshots.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-esql-grammar-sync.yml @@ -41,3 +42,4 @@ spec: - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/trigger-version-dependent-jobs.yml diff --git a/.buildkite/pipeline-resource-definitions/fix-location-collection.ts b/.buildkite/pipeline-resource-definitions/scripts/fix-location-collection.ts similarity index 83% rename from .buildkite/pipeline-resource-definitions/fix-location-collection.ts rename to .buildkite/pipeline-resource-definitions/scripts/fix-location-collection.ts index d4e36f2559a89..1173cddeb15aa 100755 --- a/.buildkite/pipeline-resource-definitions/fix-location-collection.ts +++ b/.buildkite/pipeline-resource-definitions/scripts/fix-location-collection.ts @@ -11,7 +11,7 @@ import jsYaml from 'js-yaml'; import path from 'path'; import { execSync } from 'child_process'; -const EXCLUDE_LIST = ['locations.yml', '_template/template.yml']; +const EXCLUDE_LIST = ['locations.yml', '_templates']; const REPO_FILES_BASE = 'https://github.com/elastic/kibana/blob/main'; type BackstageLocationResource = object & { @@ -20,19 +20,19 @@ type BackstageLocationResource = object & { async function main() { const repoRoot = execSync('git rev-parse --show-toplevel').toString().trim(); - const resourceDefinitionsFolder = path.resolve( + const resourceDefinitionsRoot = path.resolve( repoRoot, '.buildkite', 'pipeline-resource-definitions' ); const resourceDefinitionsBaseUrl = `${REPO_FILES_BASE}/.buildkite/pipeline-resource-definitions`; - const locationFile = path.resolve(resourceDefinitionsFolder, 'locations.yml'); + const locationFile = path.resolve(resourceDefinitionsRoot, 'locations.yml'); const locationFileLines = fs.readFileSync(locationFile, 'utf8').split('\n'); - const pipelines = readDirRecursively(resourceDefinitionsFolder) + const pipelines = readDirRecursively(resourceDefinitionsRoot) .filter((file) => file.endsWith('.yml')) - .map((file) => file.replace(`${resourceDefinitionsFolder}/`, '')) - .filter((f) => !EXCLUDE_LIST.includes(f)); + .map((file) => file.replace(`${resourceDefinitionsRoot}/`, '')) + .filter((f) => EXCLUDE_LIST.every((excludeExpr) => !f.match(excludeExpr))); const preamble = locationFileLines.slice(0, 1); diff --git a/.buildkite/pipeline-resource-definitions/scripts/validate-pipeline-definition.sh b/.buildkite/pipeline-resource-definitions/scripts/validate-pipeline-definition.sh new file mode 100755 index 0000000000000..cd153b23f10ab --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/scripts/validate-pipeline-definition.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +# This script is used to validate a single RRE for a pipeline definition. + +TARGET_FILE=$1 + +if [ -z "$TARGET_FILE" ]; then + echo "Usage: $0 " + exit 1 +fi + +echo "Validating $TARGET_FILE..." +ABSOLUTE_PATH=$(realpath "$TARGET_FILE") +FILE_NAME=$(basename "$ABSOLUTE_PATH") +FOLDER_NAME=$(dirname "$ABSOLUTE_PATH") + +docker run -it \ + --mount type=bind,source="$FOLDER_NAME",target=/home/app/ \ + docker.elastic.co/ci-agent-images/pipelib \ + rre validate --backstage-entity-aware "/home/app/$FILE_NAME" + +if [ $? -ne 0 ]; then + echo "$FILE_NAME invalid ❌" + exit 1 +else + echo "$FILE_NAME valid ✅" + exit 0 +fi diff --git a/.buildkite/pipeline-resource-definitions/trigger-version-dependent-jobs.yml b/.buildkite/pipeline-resource-definitions/trigger-version-dependent-jobs.yml new file mode 100644 index 0000000000000..ea474356b137d --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/trigger-version-dependent-jobs.yml @@ -0,0 +1,71 @@ +### +# For more information on authoring pipeline definitions, +# follow the guides at https://docs.elastic.dev/ci/getting-started-with-buildkite-at-elastic +### +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: bk-kibana-trigger-version-dependent-jobs + description: 'Trigger version-dependent jobs' + links: + - url: 'https://buildkite.com/elastic/kibana-trigger-version-dependent-jobs' + title: Pipeline link +spec: + type: buildkite-pipeline + system: buildkite + owner: 'group:kibana-operations' + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: kibana / trigger version-dependent jobs + description: 'Trigger version-dependent jobs' + spec: + env: + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-operations-alerts' + ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + + allow_rebuilds: false + branch_configuration: main + default_branch: main + repository: elastic/kibana + pipeline_file: .buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.sh + skip_intermediate_builds: false + provider_settings: + prefix_pull_request_fork_branch_names: false + skip_pull_request_builds_for_existing_commits: true + trigger_mode: none + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + appex-qa: + access_level: MANAGE_BUILD_AND_READ + kibana-tech-leads: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ + schedules: + Trigger ES forward compatibility tests: + cronline: 0 5 * * * + message: Trigger ES forward compatibility tests + env: + TRIGGER_PIPELINE_SET: es-forward + Trigger artifact staging builds: + cronline: 0 7 * * * America/New_York + message: Trigger artifact staging builds + env: + TRIGGER_PIPELINE_SET: artifacts-staging + MESSAGE: Daily staging build + Trigger artifact snapshot builds: + cronline: 0 7 * * * America/New_York + message: Trigger artifact snapshot builds + env: + TRIGGER_PIPELINE_SET: artifacts-snapshot + MESSAGE: Daily snapshot build + Run kibana-artifacts-trigger: + cronline: 0 */2 * * * America/New_York + message: Trigger 'kibana-artifacts-trigger' + env: + TRIGGER_PIPELINE_SET: artifacts-trigger + MESSAGE: Daily build diff --git a/.buildkite/pipeline-utils/utils.test.ts b/.buildkite/pipeline-utils/utils.test.ts new file mode 100644 index 0000000000000..2fece6082bc5c --- /dev/null +++ b/.buildkite/pipeline-utils/utils.test.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/* eslint-disable @typescript-eslint/no-unused-expressions */ + +import { expect } from 'chai'; +import { getKibanaDir, getVersionsFile } from './utils'; +import fs from 'fs'; + +// TODO: replace mocha with jest, and write tests that mock FS + +describe('getKibanaDir', () => { + it('should return the kibana directory', () => { + const kibanaDir = getKibanaDir(); + + expect(kibanaDir).to.be.ok; + expect(fs.existsSync(kibanaDir)).to.be.true; + }); +}); + +describe('getVersionsFile', () => { + it('should return the versions file', () => { + const versionsFile = getVersionsFile(); + + expect(versionsFile).to.be.ok; + expect(versionsFile.versions).to.be.an('array'); + }); + + it('should correctly find prevMajor and prevMinor versions', () => { + const versionsFile = getVersionsFile(); + + expect(versionsFile.prevMajors).to.be.an('array'); + expect(versionsFile.prevMajors.length).to.eql(1); + expect(versionsFile.prevMajors[0].branch).to.eql('7.17'); + + expect(versionsFile.prevMinors).to.be.an('array'); + }); + + // TODO: write more tests with mocking... +}); diff --git a/.buildkite/pipeline-utils/utils.ts b/.buildkite/pipeline-utils/utils.ts index e9a5cf9193334..9f7a27d6e1518 100644 --- a/.buildkite/pipeline-utils/utils.ts +++ b/.buildkite/pipeline-utils/utils.ts @@ -7,6 +7,8 @@ */ import { execSync } from 'child_process'; +import fs from 'fs'; +import path from 'path'; const getKibanaDir = (() => { let kibanaDir: string | undefined; @@ -21,4 +23,42 @@ const getKibanaDir = (() => { }; })(); -export { getKibanaDir }; +export interface Version { + branch: string; + version: string; +} +export interface VersionsFile { + versions: Array< + { + previousMajor?: boolean; + previousMinor?: boolean; + currentMajor?: boolean; + currentMinor?: boolean; + } & Version + >; +} +const getVersionsFile = (() => { + let versions: VersionsFile & { + prevMinors: Version[]; + prevMajors: Version[]; + current: Version; + }; + const versionsFileName = 'versions.json'; + try { + const versionsJSON = JSON.parse( + fs.readFileSync(path.join(getKibanaDir(), versionsFileName)).toString() + ); + versions = { + versions: versionsJSON.versions, + prevMinors: versionsJSON.versions.filter((v: any) => v.previousMinor), + prevMajors: versionsJSON.versions.filter((v: any) => v.previousMajor), + current: versionsJSON.versions.find((v: any) => v.currentMajor && v.currentMinor), + }; + } catch (error) { + throw new Error(`Failed to read ${versionsFileName}: ${error}`); + } + + return () => versions; +})(); + +export { getKibanaDir, getVersionsFile }; diff --git a/.buildkite/scripts/common/util.sh b/.buildkite/scripts/common/util.sh index 5630fed40bf93..bc5983e249669 100755 --- a/.buildkite/scripts/common/util.sh +++ b/.buildkite/scripts/common/util.sh @@ -172,3 +172,9 @@ npm_install_global() { download_artifact() { retry 3 1 timeout 3m buildkite-agent artifact download "$@" } + +print_if_dry_run() { + if [[ "${DRY_RUN:-}" =~ ^(1|true)$ ]]; then + echo "DRY_RUN is enabled." + fi +} diff --git a/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.sh b/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.sh new file mode 100755 index 0000000000000..500372eb91596 --- /dev/null +++ b/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -euo pipefail + +ts-node .buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.ts diff --git a/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.test.ts b/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.test.ts new file mode 100644 index 0000000000000..45475301f1c49 --- /dev/null +++ b/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.test.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +/* eslint-disable @typescript-eslint/no-unused-expressions */ + +import { getVersionsFile } from '#pipeline-utils'; +import { expect } from 'chai'; + +import { + getArtifactBuildTriggers, + getArtifactSnapshotPipelineTriggers, + getESForwardPipelineTriggers, + getArtifactStagingPipelineTriggers, +} from './pipeline'; + +const versionsFile = getVersionsFile(); + +describe('pipeline trigger combinations', () => { + it('should trigger the correct pipelines for "es-forward"', () => { + const esForwardTriggers = getESForwardPipelineTriggers(); + // tests 7.17 against 8.x versions + const targets = versionsFile.versions.filter((v) => v.currentMajor === true); + + expect(esForwardTriggers.length).to.eql(targets.length); + + expect(esForwardTriggers.every((trigger) => trigger.build?.branch === '7.17')).to.be.true; + + const targetedManifests = esForwardTriggers.map((t) => t.build?.env?.ES_SNAPSHOT_MANIFEST); + targets.forEach((t) => + expect(targetedManifests).to.include( + `https://storage.googleapis.com/kibana-ci-es-snapshots-daily/${t.version}/manifest-latest-verified.json` + ) + ); + }); + + it('should trigger the correct pipelines for "artifacts-snapshot"', () => { + const snapshotTriggers = getArtifactSnapshotPipelineTriggers(); + // triggers for all open branches + const branches = versionsFile.versions.map((v) => v.branch); + + expect(snapshotTriggers.length).to.eql(branches.length); + + branches.forEach((b) => { + expect(snapshotTriggers.some((trigger) => trigger.build?.branch === b)).to.be.true; + }); + }); + + it('should trigger the correct pipelines for "artifacts-trigger"', () => { + const triggerTriggers = getArtifactBuildTriggers(); + // all currentMajor+prevMinor branches + const branches = versionsFile.versions + .filter((v) => v.currentMajor === true && v.previousMinor === true) + .map((v) => v.branch); + + expect(triggerTriggers.length).to.eql(branches.length); + branches.forEach((b) => { + expect(triggerTriggers.some((trigger) => trigger.build?.branch === b)).to.be.true; + }); + }); + + it('should trigger the correct pipelines for "artifacts-staging"', () => { + const stagingTriggers = getArtifactStagingPipelineTriggers(); + // all branches that are not currentMajor+currentMinor + const branches = versionsFile.versions + .filter((v) => !v.currentMajor || !v.currentMinor) + .map((v) => v.branch); + + expect(stagingTriggers.length).to.eql(branches.length); + branches.forEach((b) => { + expect(stagingTriggers.some((trigger) => trigger.build?.branch === b)).to.be.true; + }); + }); +}); diff --git a/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.ts b/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.ts new file mode 100755 index 0000000000000..314e3d2164688 --- /dev/null +++ b/.buildkite/scripts/pipelines/trigger_version_dependent_jobs/pipeline.ts @@ -0,0 +1,179 @@ +#!/usr/bin/env ts-node +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { getVersionsFile, BuildkiteTriggerStep } from '#pipeline-utils'; + +const pipelineSets = { + 'es-forward': 'kibana-es-forward-compatibility-testing', + 'artifacts-snapshot': 'kibana-artifacts-snapshot', + 'artifacts-staging': 'kibana-artifacts-staging', + 'artifacts-trigger': 'kibana-artifacts-trigger', +}; + +/** + * This pipeline is used to emit trigger steps onto different pipelines, based on dynamic parameters retrieved from the repository. + */ +async function main() { + const pipelineSetNames = Object.keys(pipelineSets); + const pipelineSetName: string | undefined = process.env.TRIGGER_PIPELINE_SET; + const pipelineSteps: BuildkiteTriggerStep[] = []; + + if (!pipelineSetName) { + throw new Error( + `Env var TRIGGER_PIPELINE_SET is required, and can be one of: ${pipelineSetNames}` + ); + } else if (!pipelineSetNames.includes(pipelineSetName)) { + throw new Error( + `Invalid value for TRIGGER_PIPELINE_SET (${pipelineSetName}), can be one of: ${pipelineSetNames}` + ); + } + + switch (pipelineSetName) { + case 'es-forward': { + pipelineSteps.push(...getESForwardPipelineTriggers()); + break; + } + case 'artifacts-snapshot': { + pipelineSteps.push(...getArtifactSnapshotPipelineTriggers()); + break; + } + case 'artifacts-staging': { + pipelineSteps.push(...getArtifactStagingPipelineTriggers()); + break; + } + case 'artifacts-trigger': { + pipelineSteps.push(...getArtifactBuildTriggers()); + break; + } + default: { + throw new Error(`Unknown pipeline set: ${pipelineSetName}`); + } + } + + emitPipeline(pipelineSteps); +} + +/** + * This pipeline is testing the forward compatibility of Kibana with different versions of Elasticsearch. + * Should be triggered for combinations of (Kibana@7.17 + ES@8.x {current open branches on the same major}) + */ +export function getESForwardPipelineTriggers(): BuildkiteTriggerStep[] { + const versions = getVersionsFile(); + const kibanaPrevMajor = versions.prevMajors[0]; + const targetESVersions = [versions.prevMinors, versions.current].flat(); + + return targetESVersions.map(({ version }) => { + return { + trigger: pipelineSets['es-forward'], + async: true, + label: `Triggering Kibana ${kibanaPrevMajor.version} + ES ${version} forward compatibility`, + build: { + message: process.env.MESSAGE || `ES forward-compatibility test for ES ${version}`, + branch: kibanaPrevMajor.branch, + commit: 'HEAD', + env: { + ES_SNAPSHOT_MANIFEST: `https://storage.googleapis.com/kibana-ci-es-snapshots-daily/${version}/manifest-latest-verified.json`, + DRY_RUN: process.env.DRY_RUN, + }, + }, + } as BuildkiteTriggerStep; + }); +} + +/** + * This pipeline creates Kibana artifact snapshots for all open branches. + * Should be triggered for all open branches in the versions.json: 7.x, 8.x + */ +export function getArtifactSnapshotPipelineTriggers() { + // Trigger for all named branches + const versions = getVersionsFile(); + const targetVersions = [versions.prevMajors, versions.prevMinors, versions.current].flat(); + + return targetVersions.map(({ branch }) => { + return { + trigger: pipelineSets['artifacts-snapshot'], + async: true, + label: `Triggering snapshot artifact builds for ${branch}`, + build: { + message: process.env.MESSAGE || `Snapshot artifact build for ${branch}`, + branch, + commit: 'HEAD', + env: { + DRY_RUN: process.env.DRY_RUN, + }, + }, + } as BuildkiteTriggerStep; + }); +} + +/** + * This pipeline creates Kibana artifacts for branches that are not the current main. + * Should be triggered for all open branches in the versions.json: 7.x, 8.x, but not main. + */ +export function getArtifactStagingPipelineTriggers() { + // Trigger for all branches, that are not current minor+major + const versions = getVersionsFile(); + const targetVersions = [versions.prevMajors, versions.prevMinors].flat(); + + return targetVersions.map(({ branch }) => { + return { + trigger: pipelineSets['artifacts-staging'], + async: true, + label: `Triggering staging artifact builds for ${branch}`, + build: { + message: process.env.MESSAGE || `Staging artifact build for ${branch}`, + branch, + commit: 'HEAD', + env: { + DRY_RUN: process.env.DRY_RUN, + }, + }, + } as BuildkiteTriggerStep; + }); +} + +/** + * This pipeline checks if there are any changes in the incorporated $BEATS_MANIFEST_LATEST_URL (beats version) + * and triggers a staging artifact build. + * Should be triggered only for the active minor versions that are not `main` and not `7.17`. + * + * TODO: we could basically do the check logic of .buildkite/scripts/steps/artifacts/trigger.sh in here, and remove kibana-artifacts-trigger + */ +export function getArtifactBuildTriggers() { + const versions = getVersionsFile(); + const targetVersions = versions.prevMinors; + + return targetVersions.map( + ({ branch }) => + ({ + trigger: pipelineSets['artifacts-trigger'], + async: true, + label: `Triggering artifact build for ${branch}`, + build: { + message: process.env.MESSAGE || `Artifact build for ${branch}`, + branch, + commit: 'HEAD', + env: { + DRY_RUN: process.env.DRY_RUN, + }, + }, + } as BuildkiteTriggerStep) + ); +} + +function emitPipeline(pipelineSteps: BuildkiteTriggerStep[]) { + console.log(JSON.stringify(pipelineSteps, null, 2)); +} + +if (require.main === module) { + main().catch((error) => { + console.error(error); + process.exit(1); + }); +} diff --git a/.buildkite/scripts/steps/artifacts/cloud.sh b/.buildkite/scripts/steps/artifacts/cloud.sh index e12cf7958c86e..86fa86f37bd3c 100644 --- a/.buildkite/scripts/steps/artifacts/cloud.sh +++ b/.buildkite/scripts/steps/artifacts/cloud.sh @@ -7,6 +7,11 @@ set -euo pipefail source "$(dirname "$0")/../../common/util.sh" source .buildkite/scripts/steps/artifacts/env.sh +if [[ "${DRY_RUN:-}" =~ ^(true|1)$ ]]; then + echo "--- Nothing to do in DRY_RUN mode" + exit 0 +fi + echo "--- Push docker image" mkdir -p target diff --git a/.buildkite/scripts/steps/artifacts/publish.sh b/.buildkite/scripts/steps/artifacts/publish.sh index 40ea04fc33fea..c272acac22614 100644 --- a/.buildkite/scripts/steps/artifacts/publish.sh +++ b/.buildkite/scripts/steps/artifacts/publish.sh @@ -5,6 +5,8 @@ set -euo pipefail source .buildkite/scripts/common/util.sh source .buildkite/scripts/steps/artifacts/env.sh +print_if_dry_run + echo "--- Download and verify artifacts" function download { download_artifact "$1" . --build "${KIBANA_BUILD_ID:-$BUILDKITE_BUILD_ID}" @@ -60,6 +62,7 @@ if [[ "$BUILDKITE_BRANCH" == "$KIBANA_BASE_BRANCH" ]]; then download_artifact beats_manifest.json /tmp --build "${KIBANA_BUILD_ID:-$BUILDKITE_BUILD_ID}" export BEATS_MANIFEST_URL=$(jq -r .manifest_url /tmp/beats_manifest.json) + PUBLISH_CMD=$(cat < EOF docker run --rm \ --name release-manager \ -e VAULT_ADDR \ @@ -76,6 +79,12 @@ if [[ "$BUILDKITE_BRANCH" == "$KIBANA_BASE_BRANCH" ]]; then --qualifier "$VERSION_QUALIFIER" \ --dependency "beats:$BEATS_MANIFEST_URL" \ --artifact-set main +EOF) + if [[ "${DRY_RUN:-}" =~ ^(1|true)$ ]]; then + PUBLISH_CMD+=(" --dry-run") + fi + + "${PUBLISH_CMD[@]}" KIBANA_SUMMARY=$(curl -s "$KIBANA_MANIFEST_LATEST" | jq -re '.summary_url') From 4b19cc7f17c6ebc740402783fee875f547d7d892 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Wed, 10 Jul 2024 12:19:25 +0200 Subject: [PATCH 26/82] [Discover] Add functional tests for DocViewer extension (#187742) - Closes https://github.com/elastic/kibana/issues/186265 --- .../example_data_source_profile/profile.tsx | 11 ++++ .../context_awareness/_data_source_profile.ts | 61 +++++++++++++++++++ .../context_awareness/_data_source_profile.ts | 61 +++++++++++++++++++ 3 files changed, 133 insertions(+) diff --git a/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx b/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx index 080c2ffed222b..6b705b00c1ba1 100644 --- a/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx +++ b/src/plugins/discover/public/context_awareness/profile_providers/example_data_source_profile/profile.tsx @@ -52,6 +52,17 @@ export const exampleDataSourceProfileProvider: DataSourceProfileProvider = { ); }, }), + getDocViewer: (prev) => (params) => { + const recordId = params.record.id; + const prevValue = prev(params); + return { + title: `Record #${recordId}`, + docViewsRegistry: (registry) => { + registry.enableById('doc_view_logs_overview'); + return prevValue.docViewsRegistry(registry); + }, + }; + }, }, resolve: (params) => { let indexPattern: string | undefined; diff --git a/test/functional/apps/discover/context_awareness/_data_source_profile.ts b/test/functional/apps/discover/context_awareness/_data_source_profile.ts index d203f33c887e8..f3f7e35d7030b 100644 --- a/test/functional/apps/discover/context_awareness/_data_source_profile.ts +++ b/test/functional/apps/discover/context_awareness/_data_source_profile.ts @@ -14,6 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'timePicker', 'discover', 'unifiedFieldList']); const testSubjects = getService('testSubjects'); const dataViews = getService('dataViews'); + const dataGrid = getService('dataGrid'); describe('data source profile', () => { describe('ES|QL mode', () => { @@ -58,6 +59,40 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); + + describe('doc viewer extension', () => { + it('should not render custom doc viewer view', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Result'); + }); + + it('should render custom doc viewer view', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Record #0'); + }); + }); }); describe('data view mode', () => { @@ -92,6 +127,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); + + describe('doc viewer extension', () => { + it('should not render custom doc viewer view', async () => { + await PageObjects.common.navigateToApp('discover'); + await dataViews.switchTo('my-example-*'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Document'); + }); + + it('should render custom doc viewer view', async () => { + await PageObjects.common.navigateToApp('discover'); + await dataViews.switchTo('my-example-logs'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be( + 'Record #my-example-logs::XdQFDpABfGznVC1bCHLo::' + ); + }); + }); }); }); } diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts index 317835958b0a9..9ce2e79d8f586 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/context_awareness/_data_source_profile.ts @@ -13,6 +13,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'timePicker', 'discover', 'unifiedFieldList']); const testSubjects = getService('testSubjects'); const dataViews = getService('dataViews'); + const dataGrid = getService('dataGrid'); describe('data source profile', () => { describe('ES|QL mode', () => { @@ -53,6 +54,40 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); + + describe('doc viewer extension', () => { + it('should not render custom doc viewer view', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-* | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Result'); + }); + + it('should render custom doc viewer view', async () => { + const state = kbnRison.encode({ + dataSource: { type: 'esql' }, + query: { esql: 'from my-example-logs | sort @timestamp desc' }, + }); + await PageObjects.common.navigateToApp('discover', { + hash: `/?_a=${state}`, + }); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Record #0'); + }); + }); }); describe('data view mode', () => { @@ -83,6 +118,32 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await logLevels[2].getVisibleText()).to.be('Info'); }); }); + + describe('doc viewer extension', () => { + it('should not render custom doc viewer view', async () => { + await PageObjects.common.navigateToApp('discover'); + await dataViews.switchTo('my-example-*'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.missingOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be('Document'); + }); + + it('should render custom doc viewer view', async () => { + await PageObjects.common.navigateToApp('discover'); + await dataViews.switchTo('my-example-logs'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await dataGrid.clickRowToggle({ rowIndex: 0 }); + await testSubjects.existOrFail('docViewerTab-doc_view_table'); + await testSubjects.existOrFail('docViewerTab-doc_view_source'); + await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); + expect(await testSubjects.getVisibleText('docViewerRowDetailsTitle')).to.be( + 'Record #my-example-logs::XdQFDpABfGznVC1bCHLo::' + ); + }); + }); }); }); } From 40a2bdf651b0eabe5977367ad1b875e7581f0e31 Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Wed, 10 Jul 2024 12:35:49 +0200 Subject: [PATCH 27/82] change codeownsers investigate plugin (#187939) Change ownership of investigate plugin to obs-ux-management --- .github/CODEOWNERS | 2 +- x-pack/plugins/observability_solution/investigate/kibana.jsonc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 98ff703cf0968..bb9fa9d83a5cd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -506,7 +506,7 @@ x-pack/plugins/integration_assistant @elastic/security-solution src/plugins/interactive_setup @elastic/kibana-security test/interactive_setup_api_integration/plugins/test_endpoints @elastic/kibana-security packages/kbn-interpreter @elastic/kibana-visualizations -x-pack/plugins/observability_solution/investigate @elastic/obs-ai-assistant +x-pack/plugins/observability_solution/investigate @elastic/obs-ux-management-team packages/kbn-io-ts-utils @elastic/obs-knowledge-team packages/kbn-ipynb @elastic/search-kibana packages/kbn-jest-serializers @elastic/kibana-operations diff --git a/x-pack/plugins/observability_solution/investigate/kibana.jsonc b/x-pack/plugins/observability_solution/investigate/kibana.jsonc index ff0d3a58670d8..b3421fca1541c 100644 --- a/x-pack/plugins/observability_solution/investigate/kibana.jsonc +++ b/x-pack/plugins/observability_solution/investigate/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/investigate-plugin", - "owner": "@elastic/obs-ai-assistant", + "owner": "@elastic/obs-ux-management-team", "plugin": { "id": "investigate", "server": true, From 5e4ae7f085592166edf54fa5f0264b27c17fef0a Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 10 Jul 2024 14:55:21 +0200 Subject: [PATCH 28/82] [config-schema] add `unsafe` option for `number` type (#187855) ## Summary Fix https://github.com/elastic/kibana/issues/138458 --- packages/kbn-config-schema/README.md | 1 + .../src/types/number_type.test.ts | 20 +++++++++++++++++++ .../src/types/number_type.ts | 10 +++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/packages/kbn-config-schema/README.md b/packages/kbn-config-schema/README.md index 10d96578d4689..a1e56f05cd528 100644 --- a/packages/kbn-config-schema/README.md +++ b/packages/kbn-config-schema/README.md @@ -138,6 +138,7 @@ __Options:__ * `validate: (value: number) => string | void` - defines a custom validator function, see [Custom validation](#custom-validation) section for more details. * `min: number` - defines a minimum value the number should have. * `max: number` - defines a maximum value the number should have. + * `unsafe: boolean` - if true, will accept unsafe numbers (integers > 2^53). __Usage:__ ```typescript diff --git a/packages/kbn-config-schema/src/types/number_type.test.ts b/packages/kbn-config-schema/src/types/number_type.test.ts index 3077d41d29cc5..0e1fcdd1dc028 100644 --- a/packages/kbn-config-schema/src/types/number_type.test.ts +++ b/packages/kbn-config-schema/src/types/number_type.test.ts @@ -64,6 +64,26 @@ describe('#max', () => { }); }); +describe('#unsafe', () => { + it('rejects unsafe numbers when undefined', () => { + expect(() => schema.number().validate(9007199254740992)).toThrowErrorMatchingInlineSnapshot( + `"\\"value\\" must be a safe number"` + ); + }); + + it('rejects unsafe numbers when false', () => { + expect(() => + schema.number({ unsafe: false }).validate(9007199254740992) + ).toThrowErrorMatchingInlineSnapshot(`"\\"value\\" must be a safe number"`); + }); + + it('accepts unsafe numbers when true', () => { + expect(schema.number({ unsafe: true }).validate(9007199254740992)).toBeGreaterThan( + 9007199254740991 + ); + }); +}); + describe('#defaultValue', () => { test('returns default when number is undefined', () => { expect(schema.number({ defaultValue: 2 }).validate(undefined)).toBe(2); diff --git a/packages/kbn-config-schema/src/types/number_type.ts b/packages/kbn-config-schema/src/types/number_type.ts index 6b86fe7e7fc71..195e3916feb96 100644 --- a/packages/kbn-config-schema/src/types/number_type.ts +++ b/packages/kbn-config-schema/src/types/number_type.ts @@ -13,6 +13,12 @@ import { Type, TypeOptions } from './type'; export type NumberOptions = TypeOptions & { min?: number; max?: number; + /** + * When set to true, will accept unsafe numbers (integers > 2^53). + * Otherwise, unsafe numbers will fail validation. + * Default: `false` + */ + unsafe?: boolean; }; export class NumberType extends Type { @@ -21,10 +27,12 @@ export class NumberType extends Type { if (options.min !== undefined) { schema = schema.min(options.min); } - if (options.max !== undefined) { schema = schema.max(options.max); } + if (options.unsafe === true) { + schema = schema.unsafe(true); + } super(schema, options); } From 6f168b5ea9ca2710656eea8cbca766019d6ffc04 Mon Sep 17 00:00:00 2001 From: Bharat Pasupula <123897612+bhapas@users.noreply.github.com> Date: Wed, 10 Jul 2024 15:03:10 +0200 Subject: [PATCH 29/82] [Security GenAI] [ Integration Assistant] Add missing ecs fields into the context (#187826) --- .../server/graphs/ecs/constants.ts | 476 +++++++++++++++--- 1 file changed, 398 insertions(+), 78 deletions(-) diff --git a/x-pack/plugins/integration_assistant/server/graphs/ecs/constants.ts b/x-pack/plugins/integration_assistant/server/graphs/ecs/constants.ts index 607655541ca9d..dcbe1c10356b5 100644 --- a/x-pack/plugins/integration_assistant/server/graphs/ecs/constants.ts +++ b/x-pack/plugins/integration_assistant/server/graphs/ecs/constants.ts @@ -1688,13 +1688,61 @@ export const ECS_TYPES: EcsFields = { }; export const ECS_FIELDS: EcsFields = { + 'as.number': 'Unique number allocated to the autonomous system.', + 'as.organization.name': 'Organization name of the autonomous system.', + 'client.address': 'Client network address.', + 'client.bytes': 'Bytes sent from the client to the server.', + 'client.domain': 'Client domain.', + 'client.geo.city_name': 'City name of the client.', + 'client.geo.continent_name': 'Name of the continent of the client.', + 'client.geo.country_name': 'Country name of the client.', + 'client.geo.location': 'Longitude and latitude of the client.', + 'client.geo.region_name': 'Region name of the client.', + 'client.ip': 'Client IP address.', + 'client.mac': 'MAC address of the client.', + 'client.nat.ip': 'Translated IP client address.', + 'client.nat.port': 'Translated port of client address.', + 'client.packets': 'Packets sent from the client to the server.', + 'client.port': 'Client port.', + 'client.registered_domain': 'The highest registered client domain, stripped of the subdomain.', + 'client.subdomain': 'Subdomain of the client.', + 'client.top_level_domain': 'Top level domain of the client.', + 'cloud.account.id': 'The cloud account or organization id.', + 'cloud.availability_zone': 'Availability zone in which this host is running.', + 'cloud.instance.id': 'Instance ID of the host machine.', + 'cloud.instance.name': 'Instance name of the host machine.', + 'cloud.machine.type': 'Machine type of the host machine.', + 'cloud.project.id': 'The cloud project id.', + 'cloud.project.name': 'The cloud project name.', + 'cloud.provider': 'Name of the cloud provider.', + 'cloud.region': 'Region in which this host is running.', + 'container.id': 'Unique container id.', + 'container.image.name': 'Name of the image the container is built on.', + 'container.image.tag': 'Container image tag.', + 'container.labels': 'Image labels.', + 'container.name': 'Container name.', + 'container.runtime': 'Runtime managing this container.', + 'data_stream.dataset': 'Data stream dataset.', + 'data_stream.namespace': 'Data stream namespace.', + 'data_stream.type': 'Data stream type.', 'destination.address': 'Destination network address.', 'destination.bytes': 'Bytes sent from the destination to the source.', - 'destination.domain': 'The domain name of the destination.', - 'destination.ip': 'IP address of the destination.', + 'destination.domain': 'Destination domain.', + 'destination.geo.city_name': 'City name of the destination.', + 'destination.geo.continent_name': 'Name of the continent of the destination.', + 'destination.geo.country_name': 'Country name of the destination.', + 'destination.geo.location': 'Longitude and latitude of the destination.', + 'destination.geo.region_name': 'Region name of the destination.', + 'destination.ip': 'Destination IP address.', 'destination.mac': 'MAC address of the destination.', + 'destination.nat.ip': 'Translated IP destination address.', + 'destination.nat.port': 'Translated port of destination address.', 'destination.packets': 'Packets sent from the destination to the source.', - 'destination.port': 'Port of the destination.', + 'destination.port': 'Destination port.', + 'destination.registered_domain': + 'The highest registered destination domain, stripped of the subdomain.', + 'destination.subdomain': 'Subdomain of the destination.', + 'destination.top_level_domain': 'Top level domain of the destination.', 'destination.user.domain': 'Name of the directory the user is a member of.', 'destination.user.email': 'User email address.', 'destination.user.full_name': 'Users full name, if available.', @@ -1703,92 +1751,305 @@ export const ECS_FIELDS: EcsFields = { 'destination.user.group.name': 'Name of the group.', 'destination.user.id': 'Unique identifier of the user.', 'destination.user.name': 'Short name or login of the user.', + 'dll.code_signature.status': 'Status of the DLL code signature.', + 'dll.code_signature.subject_name': 'Subject name of the DLL code signer.', + 'dll.code_signature.trusted': 'Flag indicating if the DLL code signature is trusted.', + 'dll.code_signature.valid': 'Flag indicating if the DLL code signature is valid.', + 'dll.hash.md5': 'MD5 hash of the DLL.', + 'dll.hash.sha1': 'SHA1 hash of the DLL.', + 'dll.hash.sha256': 'SHA256 hash of the DLL.', + 'dll.name': 'Name of the DLL.', + 'dll.path': 'Full path to the DLL file.', + 'dll.pe.company': 'PE company name of the DLL.', + 'dll.pe.description': 'PE description of the DLL.', + 'dll.pe.file_version': 'PE file version of the DLL.', + 'dll.pe.imphash': 'PE import hash of the DLL.', + 'dll.pe.original_file_name': 'PE original file name of the DLL.', + 'dll.pe.product': 'PE product name of the DLL.', + 'dll.size': 'Size of the DLL in bytes.', + 'dll.type': 'Type of the DLL.', + 'dns.answers': 'DNS answers.', + 'dns.header_flags': 'DNS header flags.', + 'dns.id': 'DNS message ID.', + 'dns.op_code': 'DNS operation code.', + 'dns.question.class': 'DNS question class.', + 'dns.question.name': 'DNS question name.', + 'dns.question.registered_domain': + 'The highest registered DNS question domain, stripped of the subdomain.', + 'dns.question.subdomain': 'Subdomain of the DNS question.', + 'dns.question.top_level_domain': 'Top level domain of the DNS question.', + 'dns.question.type': 'DNS question type.', + 'dns.resolved_ip': 'Resolved IP addresses from DNS query.', + 'dns.response_code': 'DNS response code.', + 'dns.type': 'DNS query type.', + 'email.attachments': 'Email attachments.', + 'email.bcc.address': 'Email addresses of BCC recipients.', + 'email.bcc.domain': 'Domain of BCC recipients.', + 'email.bcc.local': 'Local part of the BCC recipients.', + 'email.bcc.registered_domain': 'The highest registered BCC domain, stripped of the subdomain.', + 'email.bcc.subdomain': 'Subdomain of the BCC recipients.', + 'email.bcc.top_level_domain': 'Top level domain of the BCC recipients.', + 'email.cc.address': 'Email addresses of CC recipients.', + 'email.cc.domain': 'Domain of CC recipients.', + 'email.cc.local': 'Local part of the CC recipients.', + 'email.cc.registered_domain': 'The highest registered CC domain, stripped of the subdomain.', + 'email.cc.subdomain': 'Subdomain of the CC recipients.', + 'email.cc.top_level_domain': 'Top level domain of the CC recipients.', + 'email.content_type': 'Content type of the email.', + 'email.delivery_timestamp': 'Time the email was delivered.', + 'email.direction': 'Direction of the email.', + 'email.from.address': 'Email address of the sender.', + 'email.from.domain': 'Domain of the sender.', + 'email.from.local': 'Local part of the sender.', + 'email.from.registered_domain': + 'The highest registered sender domain, stripped of the subdomain.', + 'email.from.subdomain': 'Subdomain of the sender.', + 'email.from.top_level_domain': 'Top level domain of the sender.', + 'email.local_id': 'Local identifier of the email.', + 'email.message_id': 'Message ID of the email.', + 'email.origination_timestamp': 'Time the email was originated.', + 'email.reply_to.address': 'Email address of the reply-to.', + 'email.reply_to.domain': 'Domain of the reply-to.', + 'email.reply_to.local': 'Local part of the reply-to.', + 'email.reply_to.registered_domain': + 'The highest registered reply-to domain, stripped of the subdomain.', + 'email.reply_to.subdomain': 'Subdomain of the reply-to.', + 'email.reply_to.top_level_domain': 'Top level domain of the reply-to.', + 'email.sender.address': 'Email address of the sender.', + 'email.sender.domain': 'Domain of the sender.', + 'email.sender.local': 'Local part of the sender.', + 'email.sender.registered_domain': + 'The highest registered sender domain, stripped of the subdomain.', + 'email.sender.subdomain': 'Subdomain of the sender.', + 'email.sender.top_level_domain': 'Top level domain of the sender.', + 'email.size': 'Size of the email in bytes.', + 'email.subject': 'Subject of the email.', + 'email.to.address': 'Email addresses of recipients.', + 'email.to.domain': 'Domain of recipients.', + 'email.to.local': 'Local part of the recipients.', + 'email.to.registered_domain': + 'The highest registered recipient domain, stripped of the subdomain.', + 'email.to.subdomain': 'Subdomain of the recipients.', + 'email.to.top_level_domain': 'Top level domain of the recipients.', + 'error.code': 'Error code describing the error.', + 'error.id': 'Unique identifier for the error.', + 'error.stack_trace': 'Error stack trace.', + 'error.type': 'Error type.', 'event.action': 'The action captured by the event.', - 'event.created': 'Time when the event was first read by an agent or by your pipeline.', 'event.code': 'Identification code for this event.', 'event.duration': 'Duration of the event in nanoseconds.', - 'event.end': - 'event.end contains the date when the event ended or when the activity was last observed.', + 'event.end': 'Date when the event ended.', + 'event.hash': 'Hash of the event.', 'event.id': 'Unique ID to describe the event.', + 'event.module': 'Name of the module this data is coming from.', + 'event.outcome': 'The outcome of the event.', + 'event.provider': 'Source of the event.', + 'event.reason': 'Reason why this event happened.', + 'event.reference': 'Reference URL describing this event.', + 'event.result': 'The result of the event.', + 'event.risk_score': 'Risk score or priority of the event.', + 'event.risk_score_norm': 'Normalized risk score or priority of the event.', + 'event.sequence': 'Sequence number of the event.', 'event.severity': 'Numeric severity of the event.', - 'file.directory': 'Directory where the file is located.', - 'file.extension': 'File extension, excluding the leading dot.', - 'file.gid': 'Primary group ID (GID) of the file.', - 'file.group': 'Primary group name of the file.', - 'file.hash.md5': 'MD5 hash.', - 'file.hash.sha1': 'SHA1 hash.', - 'file.hash.sha256': 'SHA256 hash.', + 'event.start': 'Date when the event started.', + 'event.timezone': 'Timezone in which the event was captured.', + 'faas.coldstart': 'Indicator of a cold start invocation.', + 'faas.execution': 'Execution identifier.', + 'faas.id': 'Function ID.', + 'faas.name': 'Function name.', + 'faas.version': 'Function version.', + 'file.accessed': 'Last time the file was accessed.', + 'file.attributes': 'File attributes.', + 'file.created': 'Date/time when the file was created.', + 'file.ctime': 'Last time the file attributes or metadata changed.', + 'file.device': 'Device that is the source of the file.', + 'file.directory': 'Directory containing the file.', + 'file.drive_letter': 'Drive letter where the file is located.', + 'file.extension': 'File extension.', + 'file.gid': 'GID or group ID of the file.', + 'file.group': 'Group that owns the file.', + 'file.hash.md5': 'MD5 hash of the file.', + 'file.hash.sha1': 'SHA1 hash of the file.', + 'file.hash.sha256': 'SHA256 hash of the file.', 'file.inode': 'Inode representing the file in the filesystem.', - 'file.name': 'Name of the file including the extension, without the directory.', - 'file.path': 'Full path to the file, including the file name.', + 'file.mime_type': 'File MIME type.', + 'file.mode': 'File mode.', + 'file.mtime': 'Last time the file content was modified.', + 'file.name': 'File name.', + 'file.owner': 'File owner.', + 'file.path': 'File path.', + 'file.puid': 'PUID or platform user ID of the file.', 'file.size': 'File size in bytes.', - 'file.uid': 'The user ID (UID) or security identifier (SID) of the file owner.', - 'group.domain': 'Name of the directory the group is a member of.', + 'file.target_path': 'Target path for symbolic links.', + 'file.type': 'File type (file, dir, symlink, etc).', + 'file.uid': 'UID or user ID of the file.', + 'group.domain': 'Domain of the group.', 'group.id': 'Unique identifier for the group on the system/platform.', 'group.name': 'Name of the group.', + 'host.architecture': 'Operating system architecture.', + 'host.boot.id': 'Unique host boot identifier.', + 'host.cpu.usage': 'Percent CPU usage.', + 'host.disk.read.bytes': 'Total bytes read.', + 'host.disk.write.bytes': 'Total bytes written.', + 'host.geo.city_name': 'City name of the host.', + 'host.geo.continent_name': 'Name of the continent of the host.', + 'host.geo.country_name': 'Country name of the host.', + 'host.geo.location': 'Longitude and latitude of the host.', + 'host.geo.region_name': 'Region name of the host.', + 'host.hostname': 'Hostname of the host.', + 'host.id': 'Unique host id.', + 'host.ip': 'IP address of the host.', + 'host.mac': 'MAC address of the host.', + 'host.name': 'Name of the host.', + 'host.os.build': 'OS build information.', + 'host.os.family': 'OS family (e.g., redhat, debian, freebsd, windows).', + 'host.os.full': 'Operating system name, including the version or code name.', + 'host.os.kernel': 'Operating system kernel version.', + 'host.os.name': 'Operating system name.', + 'host.os.platform': 'Operating system platform (e.g., centos, ubuntu, windows).', + 'host.os.type': 'Operating system type (linux, macos, unix, windows).', + 'host.os.version': 'Operating system version.', + 'http.request.body.bytes': 'Size in bytes of the request body.', + 'http.request.body.content': 'The full HTTP request body.', + 'http.request.headers': 'HTTP request headers.', 'http.request.method': 'HTTP request method.', + 'http.request.mime_type': 'MIME type of the HTTP request.', + 'http.request.referrer': 'Referrer for this HTTP request.', + 'http.response.body.bytes': 'Size in bytes of the response body.', + 'http.response.body.content': 'The full HTTP response body.', + 'http.response.headers': 'HTTP response headers.', + 'http.response.mime_type': 'MIME type of the HTTP response.', 'http.response.status_code': 'HTTP response status code.', 'http.version': 'HTTP version.', - 'network.application': 'Application level protocol name.', - 'network.bytes': 'Total bytes transferred in both directions.', - 'network.direction': 'Direction of the network traffic.', - 'network.packets': 'Total packets transferred in both directions.', - 'network.protocol': 'Application protocol name.', - 'network.transport': 'Protocol Name corresponding to the field `iana_number`.', - 'network.type': 'In the OSI Model this would be the Network Layer. ipv4, ipv6, ipsec, pim, etc', + 'interface.alias': 'Interface alias name.', + 'interface.id': 'Unique identifier for the interface.', + 'interface.name': 'Interface name.', + 'interface.type': 'Interface type.', + 'log.file.path': 'Path to the log file.', + 'log.level': 'Log level of the log event.', + 'log.logger': 'Name of the logger.', + 'log.origin.file.line': + 'Line number of the file containing the source code which originated the log.', + 'log.origin.file.name': 'Name of the file containing the source code which originated the log.', + 'log.origin.function': 'Name of the function which originated the log.', + 'log.original': 'The original log message before any modification.', + 'log.syslog.facility.code': 'Syslog facility code.', + 'log.syslog.facility.name': 'Syslog facility name.', + 'log.syslog.severity.code': 'Syslog severity code.', + 'log.syslog.severity.name': 'Syslog severity name.', + 'metricset.name': 'Name of the metricset.', + 'network.application': 'Network application.', + 'network.bytes': 'Total bytes transferred in the network event.', + 'network.community_id': 'A hash of source and destination IPs, ports, and protocol.', + 'network.direction': 'Network traffic direction (inbound, outbound).', + 'network.forwarded_ip': + 'The field is used to store the original source IP when a proxy or load balancer is in place.', + 'network.iana_number': 'IANA Protocol Number.', + 'network.name': 'Name given by operators to sections of their network.', + 'network.packets': 'Total packets transferred in the network event.', + 'network.protocol': 'L7 Network protocol name.', + 'network.transport': 'L4 Network transport protocol.', + 'network.type': 'Type of the network.', 'organization.id': 'Unique identifier for the organization.', - 'organization.name': 'Organization name.', + 'organization.name': 'Name of the organization.', + 'package.architecture': 'Package architecture.', + 'package.checksum': 'Checksum of the package.', + 'package.description': 'Package description.', + 'package.install_scope': 'Scope of the package installation.', + 'package.license': 'Package license.', + 'package.name': 'Package name.', + 'package.path': 'Package path.', + 'package.reference': 'Package reference.', + 'package.size': 'Package size.', + 'package.version': 'Package version.', 'process.args': 'Array of process arguments.', 'process.args_count': 'Length of the process.args array.', + 'process.code_signature.status': 'Status of the process code signature.', + 'process.code_signature.subject_name': 'Subject name of the process code signer.', + 'process.code_signature.trusted': 'Flag indicating if the process code signature is trusted.', + 'process.code_signature.valid': 'Flag indicating if the process code signature is valid.', 'process.command_line': 'Full command line that started the process.', 'process.end': 'The time the process ended.', 'process.executable': 'Absolute path to the process executable.', - 'process.hash.md5': 'MD5 hash.', - 'process.hash.sha1': 'SHA1 hash.', - 'process.hash.sha256': 'SHA256 hash.', + 'process.exit_code': 'Exit code of the process.', + 'process.hash.md5': 'MD5 hash of the process executable.', + 'process.hash.sha1': 'SHA1 hash of the process executable.', + 'process.hash.sha256': 'SHA256 hash of the process executable.', 'process.name': 'Process name.', - 'process.parent.args': 'Array of process arguments.', + 'process.parent.args': 'Array of parent process arguments.', 'process.parent.args_count': 'Length of the process.args array.', - 'process.parent.command_line': 'Full command line that started the process.', - 'process.parent.end': 'The time the process ended.', - 'process.parent.executable': 'Absolute path to the process executable.', + 'process.parent.code_signature.status': 'Status of the parent process code signature.', + 'process.parent.code_signature.subject_name': 'Subject name of the parent process code signer.', + 'process.parent.code_signature.trusted': + 'Flag indicating if the parent process code signature is trusted.', + 'process.parent.code_signature.valid': + 'Flag indicating if the parent process code signature is valid.', + 'process.parent.command_line': 'Full command line that started the parent process.', + 'process.parent.end': 'The time the parent process ended.', + 'process.parent.executable': 'Absolute path to the parent process executable.', + 'process.parent.exit_code': 'Exit code of the parent process.', 'process.parent.group.id': 'Unique identifier for the group on the system/platform.', 'process.parent.group.name': 'Name of the group.', - 'process.parent.hash.md5': 'MD5 hash.', - 'process.parent.hash.sha1': 'SHA1 hash.', - 'process.parent.hash.sha256': 'SHA256 hash.', - 'process.parent.name': 'Process name.', + 'process.parent.hash.md5': 'MD5 hash of the parent process executable.', + 'process.parent.hash.sha1': 'SHA1 hash of the parent process executable.', + 'process.parent.hash.sha256': 'SHA256 hash of the parent process executable.', + 'process.parent.name': 'Parent process name.', 'process.parent.pgid': 'Deprecated identifier of the group of processes the process belongs to.', - 'process.parent.pid': 'Process id.', - 'process.parent.start': 'The time the process started.', - 'process.parent.thread.id': 'Thread ID.', - 'process.parent.thread.name': 'Thread name.', - 'process.parent.user.id': 'Unique identifier of the user.', + 'process.parent.pid': 'Parent process ID.', + 'process.parent.start': 'The date/time when the parent process started.', + 'process.parent.working_directory': 'The working directory of the parent process.', 'process.parent.user.name': 'Short name or login of the user.', 'process.pgid': 'Deprecated identifier of the group of processes the process belongs to.', - 'process.pid': 'Process id.', - 'process.start': 'The time the process started.', + 'process.pid': 'Process ID.', + 'process.start': 'The date/time when the process started.', 'process.thread.id': 'Thread ID.', 'process.thread.name': 'Thread name.', - 'process.user.id': 'Unique identifier of the user.', - 'process.user.name': 'Short name or login of the user.', - 'rule.author': 'Rule author', - 'rule.category': 'Rule category', - 'rule.description': 'Rule description', - 'rule.id': 'Rule ID', + 'process.title': 'Process title.', + 'process.working_directory': 'The working directory of the process.', + 'rule.author': 'Author of the rule.', + 'rule.category': 'Rule category.', + 'rule.description': 'Rule description.', + 'rule.id': 'Unique rule ID.', 'rule.license': 'Rule license', - 'rule.name': 'Rule name', + 'rule.name': 'Name of the rule.', 'rule.reference': 'Rule reference URL', - 'rule.ruleset': 'Rule ruleset', - 'rule.uuid': 'Rule UUID', 'rule.version': 'Rule version', + 'rule.ruleset': 'Rule set to which the rule belongs.', + 'rule.uuid': 'Rule UUID.', + 'server.address': 'Server network address.', + 'server.bytes': 'Bytes sent from the server to the client.', + 'server.domain': 'Server domain.', + 'server.geo.city_name': 'City name of the server.', + 'server.geo.continent_name': 'Name of the continent of the server.', + 'server.geo.country_name': 'Country name of the server.', + 'server.geo.location': 'Longitude and latitude of the server.', + 'server.geo.region_name': 'Region name of the server.', + 'server.ip': 'Server IP address.', + 'server.mac': 'MAC address of the server.', + 'server.nat.ip': 'Translated IP server address.', + 'server.nat.port': 'Translated port of server address.', + 'server.packets': 'Packets sent from the server to the client.', + 'server.port': 'Server port.', + 'server.registered_domain': 'The highest registered server domain, stripped of the subdomain.', + 'server.subdomain': 'Subdomain of the server.', + 'server.top_level_domain': 'Top level domain of the server.', 'source.address': 'Source network address.', 'source.bytes': 'Bytes sent from the source to the destination.', - 'source.domain': 'The domain name of the source.', - 'source.ip': 'IP address of the source.', + 'source.domain': 'Source domain.', + 'source.geo.city_name': 'City name of the source.', + 'source.geo.continent_name': 'Name of the continent of the source.', + 'source.geo.country_name': 'Country name of the source.', + 'source.geo.location': 'Longitude and latitude of the source.', + 'source.geo.region_name': 'Region name of the source.', + 'source.ip': 'Source IP address.', 'source.mac': 'MAC address of the source.', + 'source.nat.ip': 'Translated IP source address.', + 'source.nat.port': 'Translated port of source address.', 'source.packets': 'Packets sent from the source to the destination.', - 'source.port': 'Port of the source.', + 'source.port': 'Source port.', + 'source.registered_domain': 'The highest registered source domain, stripped of the subdomain.', + 'source.subdomain': 'Subdomain of the source.', + 'source.top_level_domain': 'Top level domain of the source.', 'source.user.domain': 'Name of the directory the user is a member of.', 'source.user.email': 'User email address.', 'source.user.full_name': 'Users full name, if available.', @@ -1798,33 +2059,92 @@ export const ECS_FIELDS: EcsFields = { 'source.user.id': 'Unique identifier of the user.', 'source.user.name': 'Short name or login of the user.', 'source.user.roles': 'Array of user roles at the time of the event.', + 'threat.framework': 'Name of the threat framework used.', + 'threat.tactic.id': 'The ID of the tactic.', + 'threat.tactic.name': 'Name of the tactic.', + 'threat.tactic.reference': 'Reference URL of the tactic.', + 'threat.technique.id': 'The ID of the technique.', + 'threat.technique.name': 'Name of the technique.', + 'threat.technique.reference': 'Reference URL of the technique.', + 'threat.technique.subtechnique.id': 'The ID of the subtechnique.', + 'threat.technique.subtechnique.name': 'Name of the subtechnique.', + 'threat.technique.subtechnique.reference': 'Reference URL of the subtechnique.', 'tls.server.x509.alternative_names': 'List of subject alternative names (SAN).', 'tls.server.x509.issuer.common_name': 'List of common name (CN) of issuing certificate authority.', - 'threat.framework': 'Threat classification framework.', - 'threat.tactic.id': 'Threat tactic id.', - 'threat.tactic.name': 'Threat tactic.', - 'threat.technique.id': 'Threat technique id.', - 'threat.technique.name': 'Threat technique name.', - 'url.domain': 'Domain of the url.', - 'url.extension': 'File extension from the request url, excluding the leading dot.', - 'url.fragment': 'Portion of the url after the `#`.', - 'url.full': 'Full unparsed URL.', - 'url.original': 'Unmodified original url as seen in the event source.', - 'url.path': 'Path of the request, such as "/search".', - 'url.port': 'Port of the request, such as 443.', - 'url.query': 'Query string of the request.', - 'url.scheme': 'Scheme of the url.', - 'user.domain': 'Name of the directory the user is a member of.', - 'user.email': 'User email address.', - 'user.full_name': 'Users full name, if available.', - 'user.group.domain': 'Name of the directory the group is a member of.', - 'user.group.id': 'Unique identifier for the group on the system/platform.', - 'user.group.name': 'Name of the group.', + 'trace.id': 'Unique identifier for a trace.', + 'transaction.id': 'Unique identifier for a transaction.', + 'url.domain': 'Domain of the URL.', + 'url.extension': 'File extension from the URL.', + 'url.fragment': 'Fragment identifier of the URL.', + 'url.full': 'Full URL.', + 'url.original': 'Original URL.', + 'url.password': 'Password from the URL.', + 'url.path': 'Path of the URL.', + 'url.port': 'Port of the URL.', + 'url.query': 'Query string of the URL.', + 'url.registered_domain': 'The highest registered domain, stripped of the subdomain.', + 'url.scheme': 'Scheme of the URL.', + 'url.subdomain': 'Subdomain of the URL.', + 'url.top_level_domain': 'Top level domain of the URL.', + 'url.username': 'Username from the URL.', + 'user.changes.domain': 'Domain of the target user.', + 'user.changes.email': "Target user's email address.", + 'user.changes.full_name': "Target user's full name.", + 'user.changes.group.id': "Unique identifier for the target user's group.", + 'user.changes.group.name': "Target user's group name.", + 'user.changes.id': 'Unique identifier of the target user.', + 'user.changes.name': "Target user's name.", + 'user.domain': 'Domain of the user.', + 'user.effective.domain': 'Domain of the effective user.', + 'user.effective.email': "Effective user's email address.", + 'user.effective.full_name': "Effective user's full name.", + 'user.effective.group.id': "Unique identifier for the effective user's group.", + 'user.effective.group.name': "Effective user's group name.", + 'user.effective.id': 'Unique identifier of the effective user.', + 'user.effective.name': "Effective user's name.", + 'user.email': "User's email address.", + 'user.full_name': "User's full name.", + 'user.group.domain': "Domain of the user's group.", + 'user.group.id': "Unique identifier for the user's group.", + 'user.group.name': "User's group name.", + 'user.hash': 'User hash.', 'user.id': 'Unique identifier of the user.', - 'user.name': 'Short name or login of the user.', - 'user.roles': 'Array of user roles at the time of the event.', - 'user_agent.original': 'Unparsed user_agent string.', + 'user.name': "User's name.", + 'user.target.domain': 'Domain of the target user.', + 'user.target.email': "Target user's email address.", + 'user.target.full_name': "Target user's full name.", + 'user.target.group.id': "Unique identifier for the target user's group.", + 'user.target.group.name': "Target user's group name.", + 'user.target.id': 'Unique identifier of the target user.', + 'user.target.name': "Target user's name.", + 'user_agent.device.name': 'Device name from the user agent string.', + 'user_agent.name': 'Name of the user agent.', + 'user_agent.original': 'Original user agent string.', + 'user_agent.os.family': 'OS family from the user agent string.', + 'user_agent.os.full': 'Full OS information from the user agent string.', + 'user_agent.os.name': 'OS name from the user agent string.', + 'user_agent.os.version': 'OS version from the user agent string.', + 'user_agent.version': 'Version of the user agent.', + 'vlan.id': 'VLAN ID.', + 'vlan.name': 'VLAN name.', + 'vulnerability.category': 'Vulnerability category.', + 'vulnerability.classification': 'Vulnerability classification.', + 'vulnerability.description': 'Vulnerability description.', + 'vulnerability.enumeration': 'Vulnerability enumeration.', + 'vulnerability.id': 'Unique vulnerability identifier.', + 'vulnerability.reference': 'Vulnerability reference URL.', + 'vulnerability.report_id': 'The report or scan identification number.', + 'vulnerability.scanner.vendor': 'Name of the vulnerability scanner vendor.', + 'vulnerability.score.base': + 'Scores can range from 0.0 to 10.0, with 10.0 being the most severe. Base scores cover an assessment for exploitability metrics (attack vector, complexity, privileges, and user interaction), impact metrics (confidentiality, integrity, and availability), and scope..', + 'vulnerability.score.environmental': + 'Scores can range from 0.0 to 10.0, with 10.0 being the most severe. Environmental scores cover an assessment for any modified Base metrics, confidentiality, integrity, and availability requirements.', + 'vulnerability.score.temporal': + 'Scores can range from 0.0 to 10.0, with 10.0 being the most severe. Temporal scores cover an assessment for code maturity, remediation level, and confidence.', + 'vulnerability.score.version': + 'The National Vulnerability Database (NVD) provides qualitative severity rankings of "Low", "Medium", and "High" for CVSS v2.0 base score ranges in addition to the severity ratings for CVSS v3.0 as they are defined in the CVSS v3.0 specification.', + 'vulnerability.severity': 'Vulnerability severity.', }; export const ECS_EXAMPLE_ANSWER = { From 77267b28ba6be1a85c7a2ee1169db48864b52ef0 Mon Sep 17 00:00:00 2001 From: Yan Savitski Date: Wed, 10 Jul 2024 15:05:59 +0200 Subject: [PATCH 30/82] [Search][Playground] Update UI (#187608) ## Summary Summarize your PR. If it involves visual changes include a screenshot or gif. ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Joseph McElroy --- .../components/playground/playground.tsx | 28 +- .../__mocks__/search_playground_mock.ts | 1 - .../public/analytics/constants.ts | 9 +- .../public/chat_playground_overview.tsx | 63 +--- .../public/components/app.tsx | 67 +++- .../public/components/chat.tsx | 20 +- .../public/components/chat_sidebar.tsx | 117 +++---- .../public/components/data_action_button.tsx | 37 +++ .../edit_context/edit_context_action.tsx | 37 --- .../edit_context/edit_context_flyout.tsx | 211 ------------ ...t.test.tsx => edit_context_panel.test.tsx} | 30 +- .../edit_context/edit_context_panel.tsx | 137 ++++++++ .../public/components/header.tsx | 103 ++++++ .../message_list/assistant_message.tsx | 25 ++ .../message_list/system_message.tsx | 11 +- .../components/message_list/user_message.tsx | 9 +- .../components/playground_header_docs.tsx | 1 + .../query_mode.test.tsx} | 31 +- .../components/query_mode/query_mode.tsx | 210 ++++++++++++ .../components/select_indices_flyout.test.tsx | 112 +++++++ .../components/select_indices_flyout.tsx | 172 ++++++++++ .../set_up_connector_panel_for_start_chat.tsx | 111 ------- .../setup_page/add_data_sources.tsx | 53 +++ .../connect_llm_button.test.tsx} | 33 +- .../setup_page/connect_llm_button.tsx | 85 +++++ .../create_index_button.test.tsx} | 8 +- .../setup_page/create_index_button.tsx | 53 +++ .../components/setup_page/setup_page.tsx | 109 +++++++ .../sources_panel/add_indices_field.tsx | 65 ---- .../sources_panel/create_index_callout.tsx | 65 ---- .../sources_panel_for_sidebar.test.tsx | 73 ----- .../sources_panel_for_start_chat.test.tsx | 108 ------- .../sources_panel_for_start_chat.tsx | 79 ----- .../sources_panel/sources_panel_sidebar.tsx | 43 --- .../public/components/start_chat_panel.tsx | 69 ---- .../public/components/start_new_chat.test.tsx | 123 ------- .../public/components/start_new_chat.tsx | 123 ------- .../include_citations_field.tsx | 2 +- .../instructions_field.tsx | 1 + .../summarization_model.test.tsx | 4 - .../summarization_model.tsx | 37 +-- .../summarization_panel.tsx | 7 +- .../public/components/toolbar.tsx | 8 +- .../components/view_code/view_code_action.tsx | 1 + .../view_query/view_query_action.tsx | 35 -- .../view_query/view_query_flyout.tsx | 302 ------------------ .../search_playground/public/embeddable.tsx | 13 +- .../public/hooks/use_indices_fields.ts | 8 +- .../public/hooks/use_query_indices.ts | 3 +- .../public/hooks/use_source_indices_field.ts | 97 +++--- .../hooks/use_source_indices_fields.test.tsx | 2 - .../search_playground/public/plugin.ts | 3 +- .../public/providers/playground_provider.tsx | 32 +- .../plugins/search_playground/public/types.ts | 2 - .../public/utils/create_query.ts | 18 ++ .../public/utils/query_client.ts | 10 + .../playground_overview.ess.ts | 28 +- .../page_objects/search_playground_page.ts | 98 +++--- .../search_playground/playground_overview.ts | 27 +- 59 files changed, 1490 insertions(+), 1879 deletions(-) create mode 100644 x-pack/plugins/search_playground/public/components/data_action_button.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/edit_context/edit_context_action.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx rename x-pack/plugins/search_playground/public/components/edit_context/{edit_context_flyout.test.tsx => edit_context_panel.test.tsx} (67%) create mode 100644 x-pack/plugins/search_playground/public/components/edit_context/edit_context_panel.tsx create mode 100644 x-pack/plugins/search_playground/public/components/header.tsx rename x-pack/plugins/search_playground/public/components/{view_query/view_query_flyout.test.tsx => query_mode/query_mode.test.tsx} (72%) create mode 100644 x-pack/plugins/search_playground/public/components/query_mode/query_mode.tsx create mode 100644 x-pack/plugins/search_playground/public/components/select_indices_flyout.test.tsx create mode 100644 x-pack/plugins/search_playground/public/components/select_indices_flyout.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx create mode 100644 x-pack/plugins/search_playground/public/components/setup_page/add_data_sources.tsx rename x-pack/plugins/search_playground/public/components/{set_up_connector_panel_for_start_chat.test.tsx => setup_page/connect_llm_button.test.tsx} (66%) create mode 100644 x-pack/plugins/search_playground/public/components/setup_page/connect_llm_button.tsx rename x-pack/plugins/search_playground/public/components/{sources_panel/create_index_callout.test.tsx => setup_page/create_index_button.test.tsx} (87%) create mode 100644 x-pack/plugins/search_playground/public/components/setup_page/create_index_button.tsx create mode 100644 x-pack/plugins/search_playground/public/components/setup_page/setup_page.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/sources_panel/add_indices_field.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/sources_panel/create_index_callout.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_sidebar.test.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.test.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_sidebar.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/start_chat_panel.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/start_new_chat.test.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/start_new_chat.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/view_query/view_query_action.tsx delete mode 100644 x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx create mode 100644 x-pack/plugins/search_playground/public/utils/query_client.ts diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx index e6882acb0ac3b..b117518d3a6e0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/playground/playground.tsx @@ -9,11 +9,8 @@ import React from 'react'; import { useValues } from 'kea'; -import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; - import { KibanaLogic } from '../../../shared/kibana'; import { EnterpriseSearchApplicationsPageTemplate } from '../layout/page_template'; @@ -31,32 +28,9 @@ export const Playground: React.FC = () => { defaultMessage: 'Playground', }), ]} - pageHeader={{ - pageTitle: ( - - - - - - - - - ), - rightSideItems: [], - }} pageViewTelemetry="Playground" restrictWidth={false} + panelled={false} customPageSections bottomBorder="extended" docLink="playground" diff --git a/x-pack/plugins/search_playground/__mocks__/search_playground_mock.ts b/x-pack/plugins/search_playground/__mocks__/search_playground_mock.ts index d1bde7eaf53a5..1a73128730324 100644 --- a/x-pack/plugins/search_playground/__mocks__/search_playground_mock.ts +++ b/x-pack/plugins/search_playground/__mocks__/search_playground_mock.ts @@ -12,7 +12,6 @@ export type Start = jest.Mocked; const createStartMock = (): Start => { const startContract: Start = { PlaygroundProvider: jest.fn(), - PlaygroundToolbar: jest.fn(), Playground: jest.fn(), PlaygroundHeaderDocs: jest.fn(), }; diff --git a/x-pack/plugins/search_playground/public/analytics/constants.ts b/x-pack/plugins/search_playground/public/analytics/constants.ts index 30347e67bac82..055b5b74b201b 100644 --- a/x-pack/plugins/search_playground/public/analytics/constants.ts +++ b/x-pack/plugins/search_playground/public/analytics/constants.ts @@ -13,24 +13,21 @@ export enum AnalyticsEvents { chatRegenerateMessages = 'chat_regenerate_messages', citationDetailsExpanded = 'citation_details_expanded', citationDetailsCollapsed = 'citation_details_collapsed', - editContextFlyoutOpened = 'edit_context_flyout_opened', editContextFieldToggled = 'edit_context_field_toggled', editContextDocSizeChanged = 'edit_context_doc_size_changed', - editContextSaved = 'edit_context_saved', genAiConnectorAdded = 'gen_ai_connector_added', genAiConnectorCreated = 'gen_ai_connector_created', genAiConnectorExists = 'gen_ai_connector_exists', genAiConnectorSetup = 'gen_ai_connector_setup', includeCitations = 'include_citations', instructionsFieldChanged = 'instructions_field_changed', + queryFieldsUpdated = 'view_query_fields_updated', + queryModeLoaded = 'query_mode_loaded', modelSelected = 'model_selected', retrievalDocsFlyoutOpened = 'retrieval_docs_flyout_opened', sourceFieldsLoaded = 'source_fields_loaded', sourceIndexUpdated = 'source_index_updated', - startNewChatPageLoaded = 'start_new_chat_page_loaded', - viewQueryFlyoutOpened = 'view_query_flyout_opened', - viewQueryFieldsUpdated = 'view_query_fields_updated', - viewQuerySaved = 'view_query_saved', + setupChatPageLoaded = 'start_new_chat_page_loaded', viewCodeFlyoutOpened = 'view_code_flyout_opened', viewCodeLanguageChange = 'view_code_language_change', } diff --git a/x-pack/plugins/search_playground/public/chat_playground_overview.tsx b/x-pack/plugins/search_playground/public/chat_playground_overview.tsx index fc350356e873a..b5d753e6044f2 100644 --- a/x-pack/plugins/search_playground/public/chat_playground_overview.tsx +++ b/x-pack/plugins/search_playground/public/chat_playground_overview.tsx @@ -5,15 +5,13 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; import React, { useMemo } from 'react'; -import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem, EuiPageTemplate, EuiTitle } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiPageTemplate } from '@elastic/eui'; +import { QueryClientProvider } from '@tanstack/react-query'; +import { queryClient } from './utils/query_client'; import { PlaygroundProvider } from './providers/playground_provider'; import { App } from './components/app'; -import { PlaygroundToolbar } from './embeddable'; -import { PlaygroundHeaderDocs } from './components/playground_header_docs'; import { useKibana } from './hooks/use_kibana'; export const ChatPlaygroundOverview: React.FC = () => { @@ -27,46 +25,19 @@ export const ChatPlaygroundOverview: React.FC = () => { ); return ( - - - .euiFlexGroup': { flexWrap: 'wrap' } }} - pageTitle={ - - - -

- -

-
-
- - - -
- } - data-test-subj="chat-playground-home-page" - rightSideItems={[, ]} - /> - - {embeddableConsole} -
-
+ + + + + {embeddableConsole} + + + ); }; diff --git a/x-pack/plugins/search_playground/public/components/app.tsx b/x-pack/plugins/search_playground/public/components/app.tsx index 854be8d3ac760..b779897dc4afa 100644 --- a/x-pack/plugins/search_playground/public/components/app.tsx +++ b/x-pack/plugins/search_playground/public/components/app.tsx @@ -5,28 +5,61 @@ * 2.0. */ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; -import { StartNewChat } from './start_new_chat'; +import { useFormContext } from 'react-hook-form'; +import { QueryMode } from './query_mode/query_mode'; +import { SetupPage } from './setup_page/setup_page'; +import { Header } from './header'; +import { useLoadConnectors } from '../hooks/use_load_connectors'; +import { ChatForm, ChatFormFields } from '../types'; import { Chat } from './chat'; -export const App: React.FC = () => { - const [showStartPage, setShowStartPage] = useState(true); +export interface AppProps { + showDocs?: boolean; +} + +export enum ViewMode { + chat = 'chat', + query = 'query', +} + +export const App: React.FC = ({ showDocs = false }) => { + const [showSetupPage, setShowSetupPage] = useState(true); + const [selectedMode, setSelectedMode] = useState(ViewMode.chat); + const { watch } = useFormContext(); + const { data: connectors } = useLoadConnectors(); + const hasSelectedIndices = watch(ChatFormFields.indices).length; + const handleModeChange = (id: string) => setSelectedMode(id as ViewMode); + + useEffect(() => { + if (showSetupPage && connectors?.length && hasSelectedIndices) { + setShowSetupPage(false); + } + }, [connectors, hasSelectedIndices, showSetupPage]); return ( - - {showStartPage ? setShowStartPage(false)} /> : } - + <> +
+ + {showSetupPage ? : selectedMode === ViewMode.chat ? : } + + ); }; diff --git a/x-pack/plugins/search_playground/public/components/chat.tsx b/x-pack/plugins/search_playground/public/components/chat.tsx index de0a296e162b0..cc4c0b1ccdff2 100644 --- a/x-pack/plugins/search_playground/public/components/chat.tsx +++ b/x-pack/plugins/search_playground/public/components/chat.tsx @@ -13,6 +13,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiForm, + EuiHideFor, EuiHorizontalRule, EuiSpacer, useEuiTheme, @@ -50,14 +51,12 @@ export const Chat = () => { const { euiTheme } = useEuiTheme(); const { control, - watch, formState: { isValid, isSubmitting }, resetField, handleSubmit, getValues, } = useFormContext(); const { messages, append, stop: stopRequest, setMessages, reload, error } = useChat(); - const selectedIndicesCount = watch(ChatFormFields.indices, []).length; const messagesRef = useAutoBottomScroll(); const [isRegenerating, setIsRegenerating] = useState(false); const usageTracker = useUsageTracker(); @@ -123,7 +122,6 @@ export const Chat = () => { { > - + - + { iconType="refresh" disabled={isToolBarActionsDisabled} onClick={handleClearChat} + size="xs" data-test-subj="clearChatActionButton" > { - + { - - - + + + + + ); diff --git a/x-pack/plugins/search_playground/public/components/chat_sidebar.tsx b/x-pack/plugins/search_playground/public/components/chat_sidebar.tsx index 2172ee8831ead..5686a2d14b642 100644 --- a/x-pack/plugins/search_playground/public/components/chat_sidebar.tsx +++ b/x-pack/plugins/search_playground/public/components/chat_sidebar.tsx @@ -6,84 +6,91 @@ */ import { - EuiAccordion, + EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, - EuiSpacer, - EuiText, + EuiLink, EuiTitle, useEuiTheme, - useGeneratedHtmlId, } from '@elastic/eui'; -import React, { useState } from 'react'; +import React from 'react'; import { i18n } from '@kbn/i18n'; -import { SourcesPanelSidebar } from './sources_panel/sources_panel_sidebar'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { useWatch } from 'react-hook-form'; +import { docLinks } from '../../common/doc_links'; +import { EditContextPanel } from './edit_context/edit_context_panel'; +import { ChatForm, ChatFormFields } from '../types'; +import { useManagementLink } from '../hooks/use_management_link'; import { SummarizationPanel } from './summarization_panel/summarization_panel'; -interface ChatSidebarProps { - selectedIndicesCount: number; -} - -export const ChatSidebar: React.FC = ({ selectedIndicesCount }) => { +export const ChatSidebar: React.FC = () => { const { euiTheme } = useEuiTheme(); - const accordions = [ + const selectedModel = useWatch({ + name: ChatFormFields.summarizationModel, + }); + const managementLink = useManagementLink(selectedModel?.connectorId); + const panels = [ { - id: useGeneratedHtmlId({ prefix: 'summarizationAccordion' }), title: i18n.translate('xpack.searchPlayground.sidebar.summarizationTitle', { defaultMessage: 'Model settings', }), children: , - dataTestId: 'summarizationAccordion', + extraAction: ( + + + + ), }, { - id: useGeneratedHtmlId({ prefix: 'sourcesAccordion' }), - title: i18n.translate('xpack.searchPlayground.sidebar.sourceTitle', { - defaultMessage: 'Indices', + title: i18n.translate('xpack.searchPlayground.sidebar.contextTitle', { + defaultMessage: 'Context', }), - extraAction: !!selectedIndicesCount && ( - -

- {i18n.translate('xpack.searchPlayground.sidebar.sourceIndicesCount', { - defaultMessage: '{count, number} {count, plural, one {Index} other {Indices}}', - values: { count: Number(selectedIndicesCount) }, - })} -

-
+ extraAction: ( + + + ), - children: , - dataTestId: 'sourcesAccordion', + children: , }, ]; - const [openAccordionId, setOpenAccordionId] = useState(accordions[0].id); return ( - {accordions.map(({ id, title, extraAction, children, dataTestId }, index) => ( - - -
{title}
- - } - extraAction={extraAction} - buttonProps={{ paddingSize: 'l' }} - forceState={openAccordionId === id ? 'open' : 'closed'} - onToggle={() => setOpenAccordionId(openAccordionId === id ? '' : id)} - data-test-subj={dataTestId} - > - {children} - -
+ {panels?.map(({ title, children, extraAction }) => ( + + + + + +

{title}

+
+ {extraAction && {extraAction}} +
+
+ {children} +
))}
diff --git a/x-pack/plugins/search_playground/public/components/data_action_button.tsx b/x-pack/plugins/search_playground/public/components/data_action_button.tsx new file mode 100644 index 0000000000000..abc2a0c265cf9 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/data_action_button.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiButton } from '@elastic/eui'; +import { useWatch } from 'react-hook-form'; +import { ChatForm, ChatFormFields } from '../types'; +import { SelectIndicesFlyout } from './select_indices_flyout'; + +export const DataActionButton: React.FC = () => { + const selectedIndices = useWatch({ + name: ChatFormFields.indices, + }); + const [showFlyout, setShowFlyout] = useState(false); + const handleFlyoutClose = () => setShowFlyout(false); + const handleShowFlyout = () => setShowFlyout(true); + + return ( + <> + {showFlyout && } + + + + + ); +}; diff --git a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_action.tsx b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_action.tsx deleted file mode 100644 index 6e9a638248660..0000000000000 --- a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_action.tsx +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useState } from 'react'; -import { EuiButtonEmpty } from '@elastic/eui'; -import { useFormContext } from 'react-hook-form'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { ChatForm } from '../../types'; -import { EditContextFlyout } from './edit_context_flyout'; - -export const EditContextAction: React.FC = () => { - const { watch } = useFormContext(); - const [showFlyout, setShowFlyout] = useState(false); - const selectedIndices: string[] = watch('indices'); - - const closeFlyout = () => setShowFlyout(false); - - return ( - <> - {showFlyout && } - setShowFlyout(true)} - disabled={selectedIndices?.length === 0} - data-test-subj="editContextActionButton" - > - - - - ); -}; diff --git a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx deleted file mode 100644 index cb6968dcce6e4..0000000000000 --- a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.tsx +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import React, { useEffect, useState } from 'react'; -import { - EuiFlyout, - EuiFlyoutHeader, - EuiFlyoutBody, - EuiTitle, - EuiFlexItem, - EuiFlexGroup, - EuiButtonEmpty, - EuiButton, - EuiFlyoutFooter, - EuiLink, - EuiSpacer, - EuiText, - EuiSelect, - EuiSuperSelect, - EuiFormRow, -} from '@elastic/eui'; -import { useController, useFormContext } from 'react-hook-form'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { docLinks } from '../../../common/doc_links'; -import { useUsageTracker } from '../../hooks/use_usage_tracker'; -import { ChatForm, ChatFormFields } from '../../types'; -import { useIndicesFields } from '../../hooks/use_indices_fields'; -import { getDefaultSourceFields } from '../../utils/create_query'; -import { AnalyticsEvents } from '../../analytics/constants'; - -interface EditContextFlyoutProps { - onClose: () => void; -} - -export const EditContextFlyout: React.FC = ({ onClose }) => { - const usageTracker = useUsageTracker(); - const { getValues } = useFormContext(); - const selectedIndices: string[] = getValues(ChatFormFields.indices); - const { fields } = useIndicesFields(selectedIndices); - const defaultFields = getDefaultSourceFields(fields); - - const { - field: { onChange: onChangeSize, value: docSizeInitialValue }, - } = useController({ - name: ChatFormFields.docSize, - }); - - const [docSize, setDocSize] = useState(docSizeInitialValue); - - const { - field: { onChange: onChangeSourceFields, value: sourceFields }, - } = useController({ - name: ChatFormFields.sourceFields, - defaultValue: defaultFields, - }); - - const [tempSourceFields, setTempSourceFields] = useState(sourceFields); - - const updateSourceField = (index: string, field: string) => { - setTempSourceFields({ - ...tempSourceFields, - [index]: [field], - }); - usageTracker?.click(AnalyticsEvents.editContextFieldToggled); - }; - - const saveSourceFields = () => { - usageTracker?.click(AnalyticsEvents.editContextSaved); - onChangeSourceFields(tempSourceFields); - onChangeSize(docSize); - onClose(); - }; - - const handleDocSizeChange = (e: React.ChangeEvent) => { - usageTracker?.click(AnalyticsEvents.editContextDocSizeChanged); - setDocSize(Number(e.target.value)); - }; - - useEffect(() => { - usageTracker?.load(AnalyticsEvents.editContextFlyoutOpened); - }, [usageTracker]); - - return ( - - - -

- -

-
- - -

- - - - -

-
-
- - - - - - - - - - - - - -
- -
-
-
- {Object.entries(fields).map(([index, group]) => ( - - - ({ - value: field, - inputDisplay: field, - 'data-test-subj': 'contextField', - }))} - valueOfSelected={tempSourceFields[index]?.[0]} - onChange={(value) => updateSourceField(index, value)} - /> - - - ))} -
-
-
-
-
-
- - - - - - - - - - - - - - -
- ); -}; diff --git a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.test.tsx b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_panel.test.tsx similarity index 67% rename from x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.test.tsx rename to x-pack/plugins/search_playground/public/components/edit_context/edit_context_panel.test.tsx index de82892b167be..ac86efd665b27 100644 --- a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_flyout.test.tsx +++ b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_panel.test.tsx @@ -7,12 +7,13 @@ import React from 'react'; import { render, fireEvent, screen } from '@testing-library/react'; -import { EditContextFlyout } from './edit_context_flyout'; +import { EditContextPanel } from './edit_context_panel'; import { FormProvider, useForm } from 'react-hook-form'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import { ChatFormFields } from '../../types'; -jest.mock('../../hooks/use_indices_fields', () => ({ - useIndicesFields: () => ({ +jest.mock('../../hooks/use_source_indices_field', () => ({ + useSourceIndicesFields: () => ({ fields: { index1: { elser_query_fields: [], @@ -43,9 +44,9 @@ jest.mock('../../hooks/use_usage_tracker', () => ({ const MockFormProvider = ({ children }: { children: React.ReactElement }) => { const methods = useForm({ values: { - indices: ['index1'], - docSize: 1, - sourceFields: { + [ChatFormFields.indices]: ['index1'], + [ChatFormFields.docSize]: 1, + [ChatFormFields.sourceFields]: { index1: ['context_field1'], index2: ['context_field2'], }, @@ -55,27 +56,20 @@ const MockFormProvider = ({ children }: { children: React.ReactElement }) => { }; describe('EditContextFlyout component tests', () => { - const onCloseMock = jest.fn(); - beforeEach(() => { render( - + ); }); - it('calls onClose when the close button is clicked', () => { - fireEvent.click(screen.getByRole('button', { name: 'Close' })); - expect(onCloseMock).toHaveBeenCalledTimes(1); - }); - it('should see the context fields', async () => { - expect(screen.getByTestId('contextFieldsSelectable_index1')).toBeInTheDocument(); - fireEvent.click(screen.getByTestId('contextFieldsSelectable_index1')); - expect(screen.getByRole('option', { name: 'context_field1' })).toBeInTheDocument(); - expect(screen.getByRole('option', { name: 'context_field2' })).toBeInTheDocument(); + expect(screen.getByTestId('contextFieldsSelectable-0')).toBeInTheDocument(); + fireEvent.click(screen.getByTestId('contextFieldsSelectable-0')); + const fields = await screen.findAllByTestId('contextField'); + expect(fields.length).toBe(2); }); }); diff --git a/x-pack/plugins/search_playground/public/components/edit_context/edit_context_panel.tsx b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_panel.tsx new file mode 100644 index 0000000000000..1283730efa9cc --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/edit_context/edit_context_panel.tsx @@ -0,0 +1,137 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiPanel, + EuiSelect, + EuiSuperSelect, + EuiText, + EuiCallOut, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { useController } from 'react-hook-form'; +import { useSourceIndicesFields } from '../../hooks/use_source_indices_field'; +import { useUsageTracker } from '../../hooks/use_usage_tracker'; +import { ChatForm, ChatFormFields } from '../../types'; +import { AnalyticsEvents } from '../../analytics/constants'; + +export const EditContextPanel: React.FC = () => { + const usageTracker = useUsageTracker(); + const { fields } = useSourceIndicesFields(); + + const { + field: { onChange: onChangeSize, value: docSize }, + } = useController({ + name: ChatFormFields.docSize, + }); + + const { + field: { onChange: onChangeSourceFields, value: sourceFields }, + } = useController({ + name: ChatFormFields.sourceFields, + }); + + const updateSourceField = (index: string, field: string) => { + onChangeSourceFields({ + ...sourceFields, + [index]: [field], + }); + usageTracker?.click(AnalyticsEvents.editContextFieldToggled); + }; + + const handleDocSizeChange = (e: React.ChangeEvent) => { + usageTracker?.click(AnalyticsEvents.editContextDocSizeChanged); + onChangeSize(Number(e.target.value)); + }; + + return ( + + + + + + + + + + + +
+ +
+
+
+ {Object.entries(fields).map(([index, group], indexNum) => ( + + + {!!group.source_fields?.length ? ( + ({ + value: field, + inputDisplay: field, + 'data-test-subj': 'contextField', + }))} + valueOfSelected={sourceFields[index]?.[0]} + onChange={(value) => updateSourceField(index, value)} + fullWidth + /> + ) : ( + + )} + + + ))} +
+
+
+
+ ); +}; diff --git a/x-pack/plugins/search_playground/public/components/header.tsx b/x-pack/plugins/search_playground/public/components/header.tsx new file mode 100644 index 0000000000000..bc468a0e4be87 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/header.tsx @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiBetaBadge, + EuiButtonGroup, + EuiFlexGroup, + EuiPageHeaderSection, + EuiPageTemplate, + EuiTitle, + useEuiTheme, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { PlaygroundHeaderDocs } from './playground_header_docs'; +import { Toolbar } from './toolbar'; +import { ViewMode } from './app'; + +interface HeaderProps { + showDocs?: boolean; + selectedMode: string; + onModeChange: (mode: string) => void; + isActionsDisabled?: boolean; +} + +export const Header: React.FC = ({ + selectedMode, + onModeChange, + showDocs = false, + isActionsDisabled = false, +}) => { + const { euiTheme } = useEuiTheme(); + const options = [ + { + id: ViewMode.chat, + label: i18n.translate('xpack.searchPlayground.header.view.chat', { + defaultMessage: 'Chat', + }), + 'data-test-subj': 'chatMode', + }, + { + id: ViewMode.query, + label: i18n.translate('xpack.searchPlayground.header.view.query', { + defaultMessage: 'Query', + }), + 'data-test-subj': 'queryMode', + }, + ]; + + return ( + .euiFlexGroup': { flexWrap: 'wrap' }, + backgroundColor: euiTheme.colors.ghost, + }} + paddingSize="s" + data-test-subj="chat-playground-home-page" + > + + + +

+ +

+
+ +
+
+ + + + + + {showDocs && } + + + +
+ ); +}; diff --git a/x-pack/plugins/search_playground/public/components/message_list/assistant_message.tsx b/x-pack/plugins/search_playground/public/components/message_list/assistant_message.tsx index 3aa90f188a9cf..7e94059bdc272 100644 --- a/x-pack/plugins/search_playground/public/components/message_list/assistant_message.tsx +++ b/x-pack/plugins/search_playground/public/components/message_list/assistant_message.tsx @@ -17,6 +17,7 @@ import { EuiSpacer, EuiText, EuiTitle, + useEuiTheme, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -42,6 +43,7 @@ const AIMessageCSS = css` `; export const AssistantMessage: React.FC = ({ message }) => { + const { euiTheme } = useEuiTheme(); const [isDocsFlyoutOpen, setIsDocsFlyoutOpen] = useState(false); const { content, createdAt, citations, retrievalDocs, inputTokens } = message; const username = i18n.translate('xpack.searchPlayground.chat.message.assistant.username', { @@ -55,6 +57,14 @@ export const AssistantMessage: React.FC = ({ message }) = username={username} timelineAvatar="dot" data-test-subj="retrieval-docs-comment" + eventColor="subdued" + css={{ + '.euiAvatar': { backgroundColor: euiTheme.colors.ghost }, + '.euiCommentEvent': { + border: euiTheme.border.thin, + borderRadius: euiTheme.border.radius.medium, + }, + }} event={ <> @@ -96,6 +106,14 @@ export const AssistantMessage: React.FC = ({ message }) = username={username} timelineAvatar="dot" data-test-subj="retrieval-docs-comment-no-docs" + eventColor="subdued" + css={{ + '.euiAvatar': { backgroundColor: euiTheme.colors.ghost }, + '.euiCommentEvent': { + border: euiTheme.border.thin, + borderRadius: euiTheme.border.radius.medium, + }, + }} event={ <> @@ -144,6 +162,13 @@ export const AssistantMessage: React.FC = ({ message }) = }, }) } + css={{ + '.euiAvatar': { backgroundColor: euiTheme.colors.ghost }, + '.euiCommentEvent__body': { + backgroundColor: euiTheme.colors.ghost, + }, + }} + eventColor="subdued" timelineAvatar="compute" timelineAvatarAriaLabel={i18n.translate( 'xpack.searchPlayground.chat.message.assistant.avatarAriaLabel', diff --git a/x-pack/plugins/search_playground/public/components/message_list/system_message.tsx b/x-pack/plugins/search_playground/public/components/message_list/system_message.tsx index 16295299a914c..e973bea3c8a14 100644 --- a/x-pack/plugins/search_playground/public/components/message_list/system_message.tsx +++ b/x-pack/plugins/search_playground/public/components/message_list/system_message.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { EuiComment } from '@elastic/eui'; +import { EuiComment, useEuiTheme } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; interface SystemMessageProps { @@ -15,6 +15,8 @@ interface SystemMessageProps { } export const SystemMessage: React.FC = ({ content }) => { + const { euiTheme } = useEuiTheme(); + return ( = ({ content }) => { event={content} timelineAvatar="dot" eventColor="subdued" + css={{ + '.euiAvatar': { backgroundColor: euiTheme.colors.ghost }, + '.euiCommentEvent': { + border: euiTheme.border.thin, + borderRadius: euiTheme.border.radius.medium, + }, + }} /> ); }; diff --git a/x-pack/plugins/search_playground/public/components/message_list/user_message.tsx b/x-pack/plugins/search_playground/public/components/message_list/user_message.tsx index 12c1d86283404..8c15ca1b6b69e 100644 --- a/x-pack/plugins/search_playground/public/components/message_list/user_message.tsx +++ b/x-pack/plugins/search_playground/public/components/message_list/user_message.tsx @@ -9,7 +9,7 @@ import React from 'react'; import moment from 'moment'; -import { EuiComment, EuiText } from '@elastic/eui'; +import { EuiComment, EuiText, useEuiTheme } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { UserAvatar } from '@kbn/user-profile-components'; @@ -26,10 +26,17 @@ const UserMessageCSS = css` `; export const UserMessage: React.FC = ({ content, createdAt }) => { + const { euiTheme } = useEuiTheme(); const currentUserProfile = useUserProfile(); return ( ( href={docLinks.chatPlayground} target="_blank" iconType="documents" + size="s" > {i18n.translate('xpack.searchPlayground.pageTitle.header.docLink', { defaultMessage: 'Playground Docs', diff --git a/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.test.tsx b/x-pack/plugins/search_playground/public/components/query_mode/query_mode.test.tsx similarity index 72% rename from x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.test.tsx rename to x-pack/plugins/search_playground/public/components/query_mode/query_mode.test.tsx index 39136e2557296..ca92bb229e38f 100644 --- a/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.test.tsx +++ b/x-pack/plugins/search_playground/public/components/query_mode/query_mode.test.tsx @@ -6,14 +6,14 @@ */ import React from 'react'; -import { render, fireEvent, screen } from '@testing-library/react'; -import { ViewQueryFlyout } from './view_query_flyout'; +import { render, screen } from '@testing-library/react'; +import { QueryMode } from './query_mode'; import { FormProvider, useForm } from 'react-hook-form'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import { ChatFormFields } from '../../types'; -jest.mock('../../hooks/use_indices_fields', () => ({ - useIndicesFields: () => ({ +jest.mock('../../hooks/use_source_indices_field', () => ({ + useSourceIndicesFields: () => ({ fields: { index1: { elser_query_fields: [], @@ -30,6 +30,7 @@ jest.mock('../../hooks/use_indices_fields', () => ({ semantic_fields: [], }, }, + isFieldsLoading: false, }), })); @@ -45,6 +46,7 @@ const MockFormProvider = ({ children }: { children: React.ReactElement }) => { const methods = useForm({ values: { [ChatFormFields.indices]: ['index1', 'index2'], + [ChatFormFields.queryFields]: { index1: ['field1'], index2: ['field1'] }, [ChatFormFields.sourceFields]: { index1: ['field1'], index2: ['field1'], @@ -54,24 +56,17 @@ const MockFormProvider = ({ children }: { children: React.ReactElement }) => { return {children}; }; -describe('ViewQueryFlyout component tests', () => { - const onCloseMock = jest.fn(); - +describe('QueryMode component tests', () => { beforeEach(() => { render( - + ); }); - it('calls onClose when the close button is clicked', () => { - fireEvent.click(screen.getByTestId('euiFlyoutCloseButton')); - expect(onCloseMock).toHaveBeenCalledTimes(1); - }); - it('should see the view elasticsearch query', async () => { expect(screen.getByTestId('ViewElasticsearchQueryResult')).toBeInTheDocument(); expect(screen.getByTestId('ViewElasticsearchQueryResult')).toHaveTextContent( @@ -80,14 +75,14 @@ describe('ViewQueryFlyout component tests', () => { }); it('displays query fields and indicates hidden fields', () => { - expect(screen.getByTestId('queryFieldsSelectable_index1')).toBeInTheDocument(); - expect(screen.getByTestId('queryFieldsSelectable_index2')).toBeInTheDocument(); + expect(screen.getByTestId('fieldsAccordion-0')).toBeInTheDocument(); + expect(screen.getByTestId('fieldsAccordion-1')).toBeInTheDocument(); // Check if hidden fields indicator is shown - expect(screen.getByTestId('skipped_fields_index1')).toBeInTheDocument(); - expect(screen.getByTestId('skipped_fields_index1')).toHaveTextContent('1 fields are hidden.'); + expect(screen.getByTestId('skippedFields-0')).toBeInTheDocument(); + expect(screen.getByTestId('skippedFields-0')).toHaveTextContent('1 fields are hidden.'); // Check if hidden fields indicator is shown - expect(screen.queryByTestId('skipped_fields_index2')).not.toBeInTheDocument(); + expect(screen.queryByTestId('skippedFields-1')).not.toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/search_playground/public/components/query_mode/query_mode.tsx b/x-pack/plugins/search_playground/public/components/query_mode/query_mode.tsx new file mode 100644 index 0000000000000..5027f0ac432a2 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/query_mode/query_mode.tsx @@ -0,0 +1,210 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiAccordion, + EuiBasicTable, + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiPanel, + EuiSpacer, + EuiSwitch, + EuiText, + useEuiTheme, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React, { useEffect, useMemo } from 'react'; +import { useController, useWatch } from 'react-hook-form'; +import { useSourceIndicesFields } from '../../hooks/use_source_indices_field'; +import { useUsageTracker } from '../../hooks/use_usage_tracker'; +import { ChatForm, ChatFormFields } from '../../types'; +import { AnalyticsEvents } from '../../analytics/constants'; +import { docLinks } from '../../../common/doc_links'; +import { createQuery } from '../../utils/create_query'; + +const isQueryFieldSelected = ( + queryFields: ChatForm[ChatFormFields.queryFields], + index: string, + field: string +): boolean => { + return Boolean(queryFields[index]?.includes(field)); +}; + +export const QueryMode: React.FC = () => { + const { euiTheme } = useEuiTheme(); + const usageTracker = useUsageTracker(); + const { fields, isFieldsLoading } = useSourceIndicesFields(); + const sourceFields = useWatch({ + name: ChatFormFields.sourceFields, + }); + const { + field: { onChange: queryFieldsOnChange, value: queryFields }, + } = useController({ + name: ChatFormFields.queryFields, + }); + + const { + field: { onChange: elasticsearchQueryChange }, + } = useController({ + name: ChatFormFields.elasticsearchQuery, + }); + + const updateFields = (index: string, fieldName: string, checked: boolean) => { + const currentIndexFields = checked + ? [...queryFields[index], fieldName] + : queryFields[index].filter((field) => fieldName !== field); + const updatedQueryFields = { ...queryFields, [index]: currentIndexFields }; + + queryFieldsOnChange(updatedQueryFields); + elasticsearchQueryChange(createQuery(updatedQueryFields, sourceFields, fields)); + usageTracker?.count(AnalyticsEvents.queryFieldsUpdated, currentIndexFields.length); + }; + + useEffect(() => { + usageTracker?.load(AnalyticsEvents.queryModeLoaded); + }, [usageTracker]); + + const query = useMemo( + () => + !isFieldsLoading && JSON.stringify(createQuery(queryFields, sourceFields, fields), null, 2), + [isFieldsLoading, queryFields, sourceFields, fields] + ); + + return ( + + + + {query} + + + + + +
+ +
+
+ {Object.entries(fields).map(([index, group], indexNum) => ( + + + +
{index}
+
+ } + initialIsOpen + data-test-subj={`fieldsAccordion-${indexNum}`} + > + + + ({ + name: typeof field === 'string' ? field : field.field, + checked: isQueryFieldSelected( + queryFields, + index, + typeof field === 'string' ? field : field.field + ), + }))} + rowHeader="name" + columns={[ + { + field: 'name', + name: 'Field', + 'data-test-subj': 'fieldName', + }, + { + field: 'checked', + name: 'Enabled', + align: 'right', + render: (checked, field) => { + return ( + updateFields(index, field.name, e.target.checked)} + compressed + /> + ); + }, + }, + ]} + /> + + {group.skipped_fields > 0 && ( + <> + + + + + + {` `} + + + + + + + + + + + )} + + + + ))} + + + + ); +}; diff --git a/x-pack/plugins/search_playground/public/components/select_indices_flyout.test.tsx b/x-pack/plugins/search_playground/public/components/select_indices_flyout.test.tsx new file mode 100644 index 0000000000000..94dc1ad037401 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/select_indices_flyout.test.tsx @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC, PropsWithChildren } from 'react'; +import { render, fireEvent, waitFor } from '@testing-library/react'; +import { SelectIndicesFlyout } from './select_indices_flyout'; +import { useSourceIndicesFields } from '../hooks/use_source_indices_field'; +import { useQueryIndices } from '../hooks/use_query_indices'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; + +jest.mock('../hooks/use_source_indices_field'); +jest.mock('../hooks/use_query_indices'); +jest.mock('../hooks/use_indices_fields', () => ({ + useIndicesFields: () => ({ fields: {} }), +})); + +const Wrapper: FC> = ({ children }) => { + return ( + <> + {children} + + ); +}; + +const mockedUseSourceIndicesFields = useSourceIndicesFields as jest.MockedFunction< + typeof useSourceIndicesFields +>; +const mockedUseQueryIndices = useQueryIndices as jest.MockedFunction; + +describe('SelectIndicesFlyout', () => { + const onCloseMock = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + + mockedUseSourceIndicesFields.mockReturnValue({ + indices: ['index1', 'index2'], + setIndices: jest.fn(), + fields: {}, + loading: false, + addIndex: () => {}, + removeIndex: () => {}, + isFieldsLoading: false, + }); + + mockedUseQueryIndices.mockReturnValue({ + indices: ['index1', 'index2', 'index3'], + isLoading: false, + }); + }); + + it('renders correctly', () => { + const { getByTestId } = render(, { + wrapper: Wrapper, + }); + + expect(getByTestId('indicesTable')).toBeInTheDocument(); + expect(getByTestId('saveButton')).toBeInTheDocument(); + expect(getByTestId('closeButton')).toBeInTheDocument(); + }); + + it('selecting indices and saving', async () => { + const { getByTestId } = render(, { + wrapper: Wrapper, + }); + + fireEvent.click(getByTestId('sourceIndex-2')); + fireEvent.click(getByTestId('saveButton')); + + await waitFor(() => { + expect(mockedUseSourceIndicesFields().setIndices).toHaveBeenCalledWith([ + 'index1', + 'index2', + 'index3', + ]); + expect(onCloseMock).toHaveBeenCalled(); + }); + }); + + it('closing flyout without saving', () => { + const { getByTestId } = render(, { + wrapper: Wrapper, + }); + + fireEvent.click(getByTestId('closeButton')); + + expect(onCloseMock).toHaveBeenCalled(); + }); + + it('save button is disabled when no indices are selected', () => { + mockedUseSourceIndicesFields.mockReturnValueOnce({ + indices: [], + setIndices: jest.fn(), + fields: {}, + loading: false, + addIndex: () => {}, + removeIndex: () => {}, + isFieldsLoading: false, + }); + + const { getByTestId } = render(, { + wrapper: Wrapper, + }); + + const saveButton = getByTestId('saveButton'); + expect(saveButton).toBeDisabled(); + }); +}); diff --git a/x-pack/plugins/search_playground/public/components/select_indices_flyout.tsx b/x-pack/plugins/search_playground/public/components/select_indices_flyout.tsx new file mode 100644 index 0000000000000..d98a6fc9de8b7 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/select_indices_flyout.tsx @@ -0,0 +1,172 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { + EuiButton, + EuiButtonEmpty, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiSelectable, + EuiSpacer, + EuiTabbedContent, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { EuiSelectableOption } from '@elastic/eui/src/components/selectable/selectable_option'; +import { getIndicesWithNoSourceFields } from '../utils/create_query'; +import { useIndicesFields } from '../hooks/use_indices_fields'; +import { useSourceIndicesFields } from '../hooks/use_source_indices_field'; +import { useQueryIndices } from '../hooks/use_query_indices'; + +interface SelectIndicesFlyout { + onClose: () => void; +} + +export const SelectIndicesFlyout: React.FC = ({ onClose }) => { + const [query, setQuery] = useState(''); + const { indices, isLoading: isIndicesLoading } = useQueryIndices(query); + const { indices: selectedIndices, setIndices: setSelectedIndices } = useSourceIndicesFields(); + const [selectedTempIndices, setSelectedTempIndices] = useState(selectedIndices); + const handleSelectOptions = (options: EuiSelectableOption[]) => { + setSelectedTempIndices( + options.filter((option) => option.checked === 'on').map((option) => option.label) + ); + }; + const handleSearchChange = (searchValue: string) => { + setQuery(searchValue); + }; + + const handleSaveQuery = () => { + setSelectedIndices(selectedTempIndices); + onClose(); + }; + const tabs = [ + { + id: 'indices', + name: i18n.translate('xpack.searchPlayground.setupPage.addDataSource.flyout.tabName', { + defaultMessage: 'Indices', + }), + content: ( + <> + + + ({ + label: index, + checked: selectedTempIndices.includes(index) ? 'on' : '', + 'data-test-subj': `sourceIndex-${num}`, + } as EuiSelectableOption) + ), + ]} + onChange={handleSelectOptions} + listProps={{ + showIcons: true, + bordered: false, + }} + isLoading={isIndicesLoading} + renderOption={undefined} + > + {(list, search) => ( + <> + {search} + {list} + + )} + + + ), + }, + ]; + const { fields, isLoading: isFieldsLoading } = useIndicesFields(selectedTempIndices); + const noSourceFieldsWarning = getIndicesWithNoSourceFields(fields); + + return ( + + + +

+ +

+
+
+ + + {!isFieldsLoading && !!noSourceFieldsWarning && ( + +

+ +

+
+ )} +
+ + + + + + + + + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx b/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx deleted file mode 100644 index 2430cd4e6c7a0..0000000000000 --- a/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.tsx +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useEffect, useState } from 'react'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiButton, EuiCallOut, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { GenerativeAIForSearchPlaygroundConnectorFeatureId } from '@kbn/actions-plugin/common'; -import { AnalyticsEvents } from '../analytics/constants'; -import { useUsageTracker } from '../hooks/use_usage_tracker'; -import { useKibana } from '../hooks/use_kibana'; -import { useLoadConnectors } from '../hooks/use_load_connectors'; -import { StartChatPanel } from './start_chat_panel'; - -export const SetUpConnectorPanelForStartChat: React.FC = () => { - const [connectorFlyoutOpen, setConnectorFlyoutOpen] = useState(false); - const [showCallout, setShowAddedCallout] = useState(false); - const { - services: { - triggersActionsUi: { getAddConnectorFlyout: ConnectorFlyout }, - }, - } = useKibana(); - const { - data: connectors, - refetch: refetchConnectors, - isLoading: isConnectorListLoading, - } = useLoadConnectors(); - const usageTracker = useUsageTracker(); - const handleConnectorCreated = () => { - refetchConnectors(); - setShowAddedCallout(true); - setConnectorFlyoutOpen(false); - }; - const handleSetupGenAiConnector = () => { - usageTracker?.click(AnalyticsEvents.genAiConnectorCreated); - setConnectorFlyoutOpen(true); - }; - - useEffect(() => { - if (connectors?.length) { - if (showCallout) { - usageTracker?.load(AnalyticsEvents.genAiConnectorAdded); - } else { - usageTracker?.load(AnalyticsEvents.genAiConnectorExists); - } - } else { - usageTracker?.load(AnalyticsEvents.genAiConnectorSetup); - } - }, [connectors?.length, showCallout, usageTracker]); - - if (isConnectorListLoading) { - return null; - } - - return connectors?.length ? ( - showCallout ? ( - - ) : null - ) : ( - <> - - } - dataTestSubj="connectToLLMChatPanel" - > - - - - - - - - - {connectorFlyoutOpen && ( - setConnectorFlyoutOpen(false)} - /> - )} - - ); -}; diff --git a/x-pack/plugins/search_playground/public/components/setup_page/add_data_sources.tsx b/x-pack/plugins/search_playground/public/components/setup_page/add_data_sources.tsx new file mode 100644 index 0000000000000..77d8114866592 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/setup_page/add_data_sources.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { useFormContext } from 'react-hook-form'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { ChatForm, ChatFormFields } from '../../types'; +import { SelectIndicesFlyout } from '../select_indices_flyout'; + +export const AddDataSources: React.FC = () => { + const [showFlyout, setShowFlyout] = useState(false); + const { getValues } = useFormContext(); + const hasSelectedIndices: boolean = !!getValues(ChatFormFields.indices)?.length; + const handleFlyoutClose = () => { + setShowFlyout(false); + }; + + return ( + <> + {showFlyout && } + {hasSelectedIndices ? ( + setShowFlyout(true)} + data-test-subj="dataSourcesSuccessButton" + > + + + ) : ( + setShowFlyout(true)} + data-test-subj="addDataSourcesButton" + > + + + )} + + ); +}; diff --git a/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.test.tsx b/x-pack/plugins/search_playground/public/components/setup_page/connect_llm_button.test.tsx similarity index 66% rename from x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.test.tsx rename to x-pack/plugins/search_playground/public/components/setup_page/connect_llm_button.test.tsx index 7ed41e946a91f..65be856d77eb3 100644 --- a/x-pack/plugins/search_playground/public/components/set_up_connector_panel_for_start_chat.test.tsx +++ b/x-pack/plugins/search_playground/public/components/setup_page/connect_llm_button.test.tsx @@ -7,17 +7,17 @@ import React from 'react'; import { fireEvent, render as testingLibraryRender, waitFor } from '@testing-library/react'; -import { SetUpConnectorPanelForStartChat } from './set_up_connector_panel_for_start_chat'; -import { useKibana } from '../hooks/use_kibana'; -import { useLoadConnectors } from '../hooks/use_load_connectors'; +import { ConnectLLMButton } from './connect_llm_button'; +import { useKibana } from '../../hooks/use_kibana'; +import { useLoadConnectors } from '../../hooks/use_load_connectors'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; const render = (children: React.ReactNode) => testingLibraryRender({children}); -jest.mock('../hooks/use_kibana'); -jest.mock('../hooks/use_load_connectors'); -jest.mock('../hooks/use_usage_tracker', () => ({ +jest.mock('../../hooks/use_kibana'); +jest.mock('../../hooks/use_load_connectors'); +jest.mock('../../hooks/use_usage_tracker', () => ({ useUsageTracker: () => ({ count: jest.fn(), load: jest.fn(), @@ -30,7 +30,7 @@ const mockConnectors = { '2': { title: 'Connector 2' }, }; -describe('SetUpConnectorPanelForStartChat', () => { +describe('ConnectLLMButton', () => { beforeEach(() => { (useKibana as jest.Mock).mockReturnValue({ services: { @@ -59,8 +59,8 @@ describe('SetUpConnectorPanelForStartChat', () => { isLoading: false, isSuccess: true, }); - const { getByTestId } = render(); - expect(getByTestId('setupGenAIConnectorButton')).toBeInTheDocument(); + const { getByTestId } = render(); + expect(getByTestId('connectLLMButton')).toBeInTheDocument(); }); it('show the flyout when the button is clicked', async () => { @@ -69,11 +69,22 @@ describe('SetUpConnectorPanelForStartChat', () => { isLoading: false, isSuccess: true, }); - const { getByTestId, queryByTestId } = render(); + const { getByTestId, queryByTestId } = render(); expect(queryByTestId('addConnectorFlyout')).not.toBeInTheDocument(); - fireEvent.click(getByTestId('setupGenAIConnectorButton')); + fireEvent.click(getByTestId('connectLLMButton')); await waitFor(() => expect(getByTestId('addConnectorFlyout')).toBeInTheDocument()); }); + + it('show success button when connector exists', async () => { + (useLoadConnectors as jest.Mock).mockReturnValue({ + data: [{}], + isLoading: false, + isSuccess: true, + }); + const { queryByTestId } = render(); + + expect(queryByTestId('successConnectLLMButton')).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/search_playground/public/components/setup_page/connect_llm_button.tsx b/x-pack/plugins/search_playground/public/components/setup_page/connect_llm_button.tsx new file mode 100644 index 0000000000000..579715e79ea55 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/setup_page/connect_llm_button.tsx @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiButtonEmpty } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React, { useEffect, useState } from 'react'; +import { GenerativeAIForSearchPlaygroundConnectorFeatureId } from '@kbn/actions-plugin/common'; +import { useKibana } from '../../hooks/use_kibana'; +import { useLoadConnectors } from '../../hooks/use_load_connectors'; +import { useUsageTracker } from '../../hooks/use_usage_tracker'; +import { AnalyticsEvents } from '../../analytics/constants'; + +export const ConnectLLMButton: React.FC = () => { + const [connectorFlyoutOpen, setConnectorFlyoutOpen] = useState(false); + const [showCallout, setShowAddedCallout] = useState(false); + const { + services: { + triggersActionsUi: { getAddConnectorFlyout: ConnectorFlyout }, + }, + } = useKibana(); + const { data: connectors, refetch: refetchConnectors } = useLoadConnectors(); + const usageTracker = useUsageTracker(); + const handleConnectorCreated = () => { + refetchConnectors(); + setShowAddedCallout(true); + setConnectorFlyoutOpen(false); + }; + const handleSetupGenAiConnector = () => { + usageTracker?.click(AnalyticsEvents.genAiConnectorCreated); + setConnectorFlyoutOpen(true); + }; + + useEffect(() => { + if (connectors?.length) { + if (showCallout) { + usageTracker?.load(AnalyticsEvents.genAiConnectorAdded); + } else { + usageTracker?.load(AnalyticsEvents.genAiConnectorExists); + } + } else { + usageTracker?.load(AnalyticsEvents.genAiConnectorSetup); + } + }, [connectors?.length, showCallout, usageTracker]); + + return ( + <> + {connectors?.length ? ( + + + + ) : ( + + + + )} + {connectorFlyoutOpen && ( + setConnectorFlyoutOpen(false)} + /> + )} + + ); +}; diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/create_index_callout.test.tsx b/x-pack/plugins/search_playground/public/components/setup_page/create_index_button.test.tsx similarity index 87% rename from x-pack/plugins/search_playground/public/components/sources_panel/create_index_callout.test.tsx rename to x-pack/plugins/search_playground/public/components/setup_page/create_index_button.test.tsx index d75d5385cc3f8..485bb5eb5df55 100644 --- a/x-pack/plugins/search_playground/public/components/sources_panel/create_index_callout.test.tsx +++ b/x-pack/plugins/search_playground/public/components/setup_page/create_index_button.test.tsx @@ -7,9 +7,9 @@ import React, { FC, PropsWithChildren } from 'react'; import { render, fireEvent, waitFor } from '@testing-library/react'; -import { CreateIndexCallout } from './create_index_callout'; import { useKibana } from '../../hooks/use_kibana'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import { CreateIndexButton } from './create_index_button'; // Mocking the useKibana hook jest.mock('../../hooks/use_kibana', () => ({ @@ -37,9 +37,9 @@ const Wrapper: FC> = ({ children }) => { ); }; -describe('CreateIndexCallout', () => { +describe('CreateIndexButton', () => { it('renders correctly when there is no locator', async () => { - const { queryByTestId } = render(, { wrapper: Wrapper }); + const { queryByTestId } = render(, { wrapper: Wrapper }); expect(queryByTestId('createIndexButton')).not.toBeInTheDocument(); }); @@ -64,7 +64,7 @@ describe('CreateIndexCallout', () => { }, })); - const { getByTestId } = render(, { wrapper: Wrapper }); + const { getByTestId } = render(, { wrapper: Wrapper }); const createIndexButton = getByTestId('createIndexButton'); expect(createIndexButton).toBeInTheDocument(); diff --git a/x-pack/plugins/search_playground/public/components/setup_page/create_index_button.tsx b/x-pack/plugins/search_playground/public/components/setup_page/create_index_button.tsx new file mode 100644 index 0000000000000..d4a165f56266c --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/setup_page/create_index_button.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiButton, EuiCallOut } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React, { useCallback, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { useKibana } from '../../hooks/use_kibana'; + +export const CreateIndexButton: React.FC = () => { + const { + services: { application, share }, + } = useKibana(); + const createIndexLocator = useMemo( + () => share.url.locators.get('CREATE_INDEX_LOCATOR_ID'), + [share.url.locators] + ); + const handleNavigateToIndex = useCallback(async () => { + const createIndexUrl = await createIndexLocator?.getUrl({}); + + if (createIndexUrl) { + application?.navigateToUrl(createIndexUrl); + } + }, [application, createIndexLocator]); + + return createIndexLocator ? ( + + + + ) : ( + + ); +}; diff --git a/x-pack/plugins/search_playground/public/components/setup_page/setup_page.tsx b/x-pack/plugins/search_playground/public/components/setup_page/setup_page.tsx new file mode 100644 index 0000000000000..6dc4d80cc8b15 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/setup_page/setup_page.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + EuiLink, + EuiLoadingSpinner, + EuiTitle, +} from '@elastic/eui'; +import React, { useEffect, useMemo } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { useSearchParams } from 'react-router-dom-v5-compat'; +import { CreateIndexButton } from './create_index_button'; +import { useQueryIndices } from '../../hooks/use_query_indices'; +import { docLinks } from '../../../common/doc_links'; +import { useSourceIndicesFields } from '../../hooks/use_source_indices_field'; +import { useUsageTracker } from '../../hooks/use_usage_tracker'; +import { AnalyticsEvents } from '../../analytics/constants'; +import { ConnectLLMButton } from './connect_llm_button'; +import { AddDataSources } from './add_data_sources'; + +export const SetupPage: React.FC = () => { + const usageTracker = useUsageTracker(); + const [searchParams] = useSearchParams(); + const { indices, isLoading: isIndicesLoading } = useQueryIndices(); + const index = useMemo(() => searchParams.get('default-index'), [searchParams]); + const { addIndex } = useSourceIndicesFields(); + + useEffect(() => { + if (index) { + addIndex(index); + } + }, [index, addIndex]); + + useEffect(() => { + usageTracker?.load(AnalyticsEvents.setupChatPageLoaded); + }, [usageTracker]); + + return ( + + + + } + body={ + <> +

+ +

+

+ +

+ + } + actions={ + + {isIndicesLoading ? ( + + ) : ( + <> + + + + + {indices.length ? : } + + + )} + + } + footer={ + <> + + + + + {' '} + + + + + } + /> + ); +}; diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/add_indices_field.tsx b/x-pack/plugins/search_playground/public/components/sources_panel/add_indices_field.tsx deleted file mode 100644 index 786a9db0c8238..0000000000000 --- a/x-pack/plugins/search_playground/public/components/sources_panel/add_indices_field.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiComboBox, EuiFormRow } from '@elastic/eui'; -import React, { useState } from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiComboBoxOptionOption } from '@elastic/eui/src/components/combo_box/types'; -import { IndexName } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { useQueryIndices } from '../../hooks/use_query_indices'; - -interface AddIndicesFieldProps { - selectedIndices: IndexName[]; - onIndexSelect: (index: IndexName) => void; - loading: boolean; -} - -export const AddIndicesField: React.FC = ({ - selectedIndices, - onIndexSelect, - loading, -}) => { - const [query, setQuery] = useState(''); - const { indices, isLoading } = useQueryIndices(query); - const handleChange = (value: Array>) => { - if (value?.[0]?.label) { - onIndexSelect(value[0].label); - } - }; - const handleSearchChange = (searchValue: string) => { - setQuery(searchValue); - }; - - return ( - - ({ - label: index, - disabled: selectedIndices.includes(index), - }))} - isClearable={false} - data-test-subj="selectIndicesComboBox" - /> - - ); -}; diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/create_index_callout.tsx b/x-pack/plugins/search_playground/public/components/sources_panel/create_index_callout.tsx deleted file mode 100644 index 4294272946f76..0000000000000 --- a/x-pack/plugins/search_playground/public/components/sources_panel/create_index_callout.tsx +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiButton, EuiCallOut, EuiSpacer, EuiText } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useCallback, useMemo } from 'react'; -import { useKibana } from '../../hooks/use_kibana'; - -export const CreateIndexCallout: React.FC = () => { - const { - services: { application, share }, - } = useKibana(); - const createIndexLocator = useMemo( - () => share.url.locators.get('CREATE_INDEX_LOCATOR_ID'), - [share.url.locators] - ); - const handleNavigateToIndex = useCallback(async () => { - const createIndexUrl = await createIndexLocator?.getUrl({}); - - if (createIndexUrl) { - application?.navigateToUrl(createIndexUrl); - } - }, [application, createIndexLocator]); - - return ( - - -

- -

-
- - {createIndexLocator && ( - - - - )} -
- ); -}; diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_sidebar.test.tsx b/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_sidebar.test.tsx deleted file mode 100644 index 194b451ccd1fb..0000000000000 --- a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_sidebar.test.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { FC, PropsWithChildren } from 'react'; -import { render, screen } from '@testing-library/react'; -import { SourcesPanelSidebar } from './sources_panel_sidebar'; -import { useSourceIndicesFields } from '../../hooks/use_source_indices_field'; -import { useQueryIndices } from '../../hooks/use_query_indices'; -import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; - -jest.mock('../../hooks/use_source_indices_field', () => ({ - useSourceIndicesFields: jest.fn(), -})); -jest.mock('../../hooks/use_query_indices', () => ({ - useQueryIndices: jest.fn(), -})); - -const Wrapper: FC> = ({ children }) => { - return ( - <> - {children} - - ); -}; - -describe('SourcesPanelSidebar component', () => { - afterEach(jest.clearAllMocks); - - it('shows the "AddIndicesField" component when there are indices and not loading', () => { - (useQueryIndices as jest.Mock).mockReturnValue({ indices: ['index1'], isLoading: false }); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: [], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - }); - - render(, { wrapper: Wrapper }); - expect(screen.queryByTestId('indicesLoading')).not.toBeInTheDocument(); - }); - - it('displays IndicesTable when there are selected indices', () => { - (useQueryIndices as jest.Mock).mockReturnValue({ indices: ['index1'], isLoading: false }); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: ['index1', 'index2'], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - }); - - render(, { wrapper: Wrapper }); - expect(screen.getAllByTestId('removeIndexButton')).toHaveLength(2); - expect(screen.getAllByTestId('removeIndexButton')[0]).not.toBeDisabled(); - expect(screen.getAllByTestId('removeIndexButton')[1]).not.toBeDisabled(); - }); - - it('does not allow to remove all indices', () => { - (useQueryIndices as jest.Mock).mockReturnValue({ indices: ['index1'], isLoading: false }); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: ['index1'], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - }); - - render(, { wrapper: Wrapper }); - expect(screen.getByTestId('removeIndexButton')).toBeDisabled(); - }); -}); diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.test.tsx b/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.test.tsx deleted file mode 100644 index 72c0aadfdb708..0000000000000 --- a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.test.tsx +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { FC, PropsWithChildren } from 'react'; -import { render, screen } from '@testing-library/react'; -import { SourcesPanelForStartChat } from './sources_panel_for_start_chat'; -import { useSourceIndicesFields } from '../../hooks/use_source_indices_field'; -import { useQueryIndices } from '../../hooks/use_query_indices'; -import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; - -jest.mock('../../hooks/use_source_indices_field', () => ({ - useSourceIndicesFields: jest.fn(), -})); -jest.mock('../../hooks/use_query_indices', () => ({ - useQueryIndices: jest.fn(), -})); - -jest.mock('../../hooks/use_kibana', () => ({ - useKibana: jest.fn(() => ({ - services: { - application: { navigateToUrl: jest.fn() }, - share: { url: { locators: { get: jest.fn() } } }, - }, - })), -})); - -const Wrapper: FC> = ({ children }) => { - return ( - <> - {children} - - ); -}; - -describe('SourcesPanelForStartChat component', () => { - afterEach(jest.clearAllMocks); - - it('shows a loading spinner when query is loading', () => { - (useQueryIndices as jest.Mock).mockReturnValue({ indices: [], isLoading: true }); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: [], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - }); - - render(, { wrapper: Wrapper }); - expect(screen.getByTestId('indicesLoading')).toBeInTheDocument(); - }); - - it('shows the "AddIndicesField" component when there are indices and not loading', () => { - (useQueryIndices as jest.Mock).mockReturnValue({ indices: ['index1'], isLoading: false }); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: [], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - }); - - render(, { wrapper: Wrapper }); - expect(screen.queryByTestId('indicesLoading')).not.toBeInTheDocument(); - }); - - it('displays IndicesTable when there are selected indices', () => { - (useQueryIndices as jest.Mock).mockReturnValue({ indices: ['index1'], isLoading: false }); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: ['index1'], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - }); - - render(, { wrapper: Wrapper }); - expect(screen.getAllByText('index1')).toHaveLength(1); - expect(screen.getByTestId('removeIndexButton')).toBeInTheDocument(); - }); - - it('displays "CreateIndexCallout" when no indices are found and not loading', () => { - (useQueryIndices as jest.Mock).mockReturnValue({ indices: [], isLoading: false }); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: [], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - }); - - render(, { wrapper: Wrapper }); - expect(screen.getByTestId('createIndexCallout')).toBeInTheDocument(); - }); - - it('renders warning callout', () => { - (useSourceIndicesFields as jest.Mock).mockReturnValue({ - indices: ['index1'], - removeIndex: jest.fn(), - addIndex: jest.fn(), - loading: false, - noFieldsIndicesWarning: 'index1', - }); - - render(, { wrapper: Wrapper }); - expect(screen.getByTestId('NoIndicesFieldsMessage')).toBeInTheDocument(); - expect(screen.getByTestId('NoIndicesFieldsMessage')).toHaveTextContent('index1'); - }); -}); diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx b/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx deleted file mode 100644 index 992ae7e574658..0000000000000 --- a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_for_start_chat.tsx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { AddIndicesField } from './add_indices_field'; -import { IndicesTable } from './indices_table'; -import { StartChatPanel } from '../start_chat_panel'; -import { CreateIndexCallout } from './create_index_callout'; -import { useQueryIndices } from '../../hooks/use_query_indices'; -import { useSourceIndicesFields } from '../../hooks/use_source_indices_field'; - -export const SourcesPanelForStartChat: React.FC = () => { - const { - indices: selectedIndices, - removeIndex, - addIndex, - loading: fieldIndicesLoading, - noFieldsIndicesWarning, - } = useSourceIndicesFields(); - const { indices, isLoading } = useQueryIndices(); - - return ( - - {!!selectedIndices?.length && ( - - - - )} - - {noFieldsIndicesWarning && ( - -

- {i18n.translate('xpack.searchPlayground.emptyPrompts.sources.warningCallout', { - defaultMessage: - 'No fields found for {errorMessage}. Try adding data to these indices.', - values: { - errorMessage: noFieldsIndicesWarning, - }, - })} -

-
- )} - - {isLoading && ( - - - - )} - - {!isLoading && !!indices?.length && ( - - - - )} - - {!isLoading && !indices?.length && } -
- ); -}; diff --git a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_sidebar.tsx b/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_sidebar.tsx deleted file mode 100644 index 813c98641ff29..0000000000000 --- a/x-pack/plugins/search_playground/public/components/sources_panel/sources_panel_sidebar.tsx +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiCallOut, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { useSourceIndicesFields } from '../../hooks/use_source_indices_field'; -import { AddIndicesField } from './add_indices_field'; -import { IndicesList } from './indices_list'; - -export const SourcesPanelSidebar: React.FC = () => { - const { indices: selectedIndices, removeIndex, addIndex, loading } = useSourceIndicesFields(); - - return ( - - - - - - - - - - - - - - ); -}; diff --git a/x-pack/plugins/search_playground/public/components/start_chat_panel.tsx b/x-pack/plugins/search_playground/public/components/start_chat_panel.tsx deleted file mode 100644 index 996f088090d29..0000000000000 --- a/x-pack/plugins/search_playground/public/components/start_chat_panel.tsx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiPanel, - EuiSpacer, - EuiText, - EuiTitle, -} from '@elastic/eui'; -import React, { FC, PropsWithChildren } from 'react'; -import { FormattedMessage } from '@kbn/i18n-react'; - -interface StartChatPanelProps { - children: React.ReactNode; - title: string; - description: string | React.ReactNode; - isValid?: boolean; - dataTestSubj: string; -} - -export const StartChatPanel: FC> = ({ - title, - description, - children, - isValid, - dataTestSubj, -}) => ( - - - -
{title}
-
- - {isValid && ( - - - - - -

- -

-
-
-
- )} -
- - - - - -

{description}

-
- - {children} -
-
-); diff --git a/x-pack/plugins/search_playground/public/components/start_new_chat.test.tsx b/x-pack/plugins/search_playground/public/components/start_new_chat.test.tsx deleted file mode 100644 index ed380e00eb1da..0000000000000 --- a/x-pack/plugins/search_playground/public/components/start_new_chat.test.tsx +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; - -import React from 'react'; -import { render, screen } from '@testing-library/react'; -import { MemoryRouter, useSearchParams } from 'react-router-dom-v5-compat'; -import { StartNewChat } from './start_new_chat'; -import { useLoadConnectors } from '../hooks/use_load_connectors'; -import { useUsageTracker } from '../hooks/use_usage_tracker'; -import { AnalyticsEvents } from '../analytics/constants'; -import { useSourceIndicesFields } from '../hooks/use_source_indices_field'; -import { useKibana } from '../hooks/use_kibana'; -import { PlaygroundProvider } from '../providers/playground_provider'; - -jest.mock('../hooks/use_load_connectors'); -jest.mock('../hooks/use_usage_tracker'); -jest.mock('../hooks/use_source_indices_field', () => ({ - useSourceIndicesFields: jest.fn(() => ({ addIndex: jest.fn() })), -})); -jest.mock('react-router-dom-v5-compat', () => ({ - ...jest.requireActual('react-router-dom-v5-compat'), - useSearchParams: jest.fn(), -})); -jest.mock('../hooks/use_kibana'); - -const mockUseLoadConnectors = useLoadConnectors as jest.Mock; -const mockUseUsageTracker = useUsageTracker as jest.Mock; -const mockUseSearchParams = useSearchParams as jest.Mock; - -const renderWithForm = (ui: React.ReactElement) => { - const Wrapper: React.FC = ({ children }) => { - return ( - - {children} - - ); - }; - return render(ui, { wrapper: Wrapper }); -}; - -const mockConnectors = { - '1': { title: 'Connector 1' }, - '2': { title: 'Connector 2' }, -}; - -describe('StartNewChat', () => { - beforeEach(() => { - mockUseLoadConnectors.mockReturnValue({ data: [] }); - mockUseUsageTracker.mockReturnValue({ load: jest.fn() }); - mockUseSearchParams.mockReturnValue([new URLSearchParams()]); - - (useKibana as jest.Mock).mockReturnValue({ - services: { - triggersActionsUi: { - getAddConnectorFlyout: () => ( -
Add Connector Flyout
- ), - }, - }, - }); - (useLoadConnectors as jest.Mock).mockReturnValue({ - data: mockConnectors, - refetch: jest.fn(), - isLoading: false, - isSuccess: true, - }); - }); - - it('renders correctly', () => { - renderWithForm( - - - - ); - - expect(screen.getByTestId('startNewChatTitle')).toBeInTheDocument(); - }); - - it('disables the start button when form conditions are not met', () => { - renderWithForm( - - - - ); - - const startButton = screen.getByTestId('startChatButton'); - expect(startButton).toBeDisabled(); - }); - - it('tracks the page load event', () => { - const usageTracker = { load: jest.fn() }; - mockUseUsageTracker.mockReturnValue(usageTracker); - - renderWithForm( - - - - ); - - expect(usageTracker.load).toHaveBeenCalledWith(AnalyticsEvents.startNewChatPageLoaded); - }); - - it('calls addIndex when default-index is present in searchParams', () => { - const addIndex = jest.fn(); - (useSourceIndicesFields as jest.Mock).mockReturnValue({ addIndex }); - const searchParams = new URLSearchParams({ 'default-index': 'test-index' }); - mockUseSearchParams.mockReturnValue([searchParams]); - - renderWithForm( - - - - ); - - expect(addIndex).toHaveBeenCalledWith('test-index'); - }); -}); diff --git a/x-pack/plugins/search_playground/public/components/start_new_chat.tsx b/x-pack/plugins/search_playground/public/components/start_new_chat.tsx deleted file mode 100644 index 0df4485ec858c..0000000000000 --- a/x-pack/plugins/search_playground/public/components/start_new_chat.tsx +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiButton, - EuiFlexGroup, - EuiFlexItem, - EuiIcon, - EuiText, - EuiTitle, - useEuiTheme, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useEffect, useMemo } from 'react'; -import { useFormContext } from 'react-hook-form'; -import { useSearchParams } from 'react-router-dom-v5-compat'; -import { useUsageTracker } from '../hooks/use_usage_tracker'; -import { useLoadConnectors } from '../hooks/use_load_connectors'; -import { SourcesPanelForStartChat } from './sources_panel/sources_panel_for_start_chat'; -import { SetUpConnectorPanelForStartChat } from './set_up_connector_panel_for_start_chat'; -import { ChatFormFields } from '../types'; -import { AnalyticsEvents } from '../analytics/constants'; -import { useSourceIndicesFields } from '../hooks/use_source_indices_field'; - -const maxWidthPage = 640; - -interface StartNewChatProps { - onStartClick: () => void; -} - -export const StartNewChat: React.FC = ({ onStartClick }) => { - const { euiTheme } = useEuiTheme(); - const { data: connectors } = useLoadConnectors(); - const { watch } = useFormContext(); - const usageTracker = useUsageTracker(); - - const [searchParams] = useSearchParams(); - const index = useMemo(() => searchParams.get('default-index'), [searchParams]); - const { addIndex } = useSourceIndicesFields(); - - useEffect(() => { - if (index) { - addIndex(index); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [index]); - - useEffect(() => { - usageTracker?.load(AnalyticsEvents.startNewChatPageLoaded); - }, [usageTracker]); - - return ( - - - - - -

- -

-
- - -
-
- - -

- -

-
-
- - - - - - - - - - - - - - -
-
- ); -}; diff --git a/x-pack/plugins/search_playground/public/components/summarization_panel/include_citations_field.tsx b/x-pack/plugins/search_playground/public/components/summarization_panel/include_citations_field.tsx index 75212a2ba9cc3..6ab49bea16c3d 100644 --- a/x-pack/plugins/search_playground/public/components/summarization_panel/include_citations_field.tsx +++ b/x-pack/plugins/search_playground/public/components/summarization_panel/include_citations_field.tsx @@ -27,7 +27,7 @@ export const IncludeCitationsField: React.FC = ({ }; return ( - + = ({ value, onC } + fullWidth > { ); expect(getByTestId('summarizationModelSelect')).toBeInTheDocument(); - expect(getByTestId('manageConnectorsLink')).toHaveAttribute( - 'href', - 'http://example.com/manage-connectors' - ); }); }); diff --git a/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx b/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx index f60436025e0d1..e13823d87fd8d 100644 --- a/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx +++ b/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_model.tsx @@ -8,7 +8,6 @@ import React, { useEffect, useMemo } from 'react'; import { - EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiFormRow, @@ -16,18 +15,15 @@ import { EuiSuperSelect, type EuiSuperSelectOption, EuiText, - EuiToolTip, } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { AnalyticsEvents } from '../../analytics/constants'; import { useUsageTracker } from '../../hooks/use_usage_tracker'; import type { LLMModel } from '../../types'; -import { useManagementLink } from '../../hooks/use_management_link'; interface SummarizationModelProps { - selectedModel: LLMModel; + selectedModel?: LLMModel; onSelect: (model: LLMModel) => void; models: LLMModel[]; } @@ -40,7 +36,6 @@ export const SummarizationModel: React.FC = ({ onSelect, }) => { const usageTracker = useUsageTracker(); - const managementLink = useManagementLink(selectedModel.connectorId); const onChange = (modelValue: string) => { const newSelectedModel = models.find((model) => getOptionValue(model) === modelValue); @@ -98,7 +93,7 @@ export const SummarizationModel: React.FC = ({ useEffect(() => { usageTracker?.click( - `${AnalyticsEvents.modelSelected}_${selectedModel.value || selectedModel.connectorType}` + `${AnalyticsEvents.modelSelected}_${selectedModel!.value || selectedModel!.connectorType}` ); }, [usageTracker, selectedModel]); @@ -113,36 +108,14 @@ export const SummarizationModel: React.FC = ({ />{' '} } - labelAppend={ - - - - } + fullWidth > ); diff --git a/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_panel.tsx b/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_panel.tsx index 77b152121f5b0..4a199f7d98b18 100644 --- a/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_panel.tsx +++ b/x-pack/plugins/search_playground/public/components/summarization_panel/summarization_panel.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { Controller, useFormContext } from 'react-hook-form'; +import { EuiPanel } from '@elastic/eui'; import { useLLMsModels } from '../../hooks/use_llms_models'; import { IncludeCitationsField } from './include_citations_field'; import { InstructionsField } from './instructions_field'; @@ -17,13 +18,11 @@ import { SummarizationModel } from './summarization_model'; export const SummarizationPanel: React.FC = () => { const { control } = useFormContext(); const models = useLLMsModels(); - const defaultModel = models.find((model) => !model.disabled); return ( - <> + ( @@ -51,6 +50,6 @@ export const SummarizationPanel: React.FC = () => { )} /> - + ); }; diff --git a/x-pack/plugins/search_playground/public/components/toolbar.tsx b/x-pack/plugins/search_playground/public/components/toolbar.tsx index e322c9c6bb3ff..31ea3345cdcbe 100644 --- a/x-pack/plugins/search_playground/public/components/toolbar.tsx +++ b/x-pack/plugins/search_playground/public/components/toolbar.tsx @@ -7,15 +7,13 @@ import { EuiFlexGroup } from '@elastic/eui'; import React from 'react'; +import { DataActionButton } from './data_action_button'; import { ViewCodeAction } from './view_code/view_code_action'; -import { ViewQueryAction } from './view_query/view_query_action'; -import { EditContextAction } from './edit_context/edit_context_action'; export const Toolbar: React.FC = () => { return ( - - - + + ); diff --git a/x-pack/plugins/search_playground/public/components/view_code/view_code_action.tsx b/x-pack/plugins/search_playground/public/components/view_code/view_code_action.tsx index 01ddc3d789dc5..13b6a2119757a 100644 --- a/x-pack/plugins/search_playground/public/components/view_code/view_code_action.tsx +++ b/x-pack/plugins/search_playground/public/components/view_code/view_code_action.tsx @@ -27,6 +27,7 @@ export const ViewCodeAction: React.FC = () => { onClick={() => setShowFlyout(true)} disabled={!selectedIndices || selectedIndices?.length === 0} data-test-subj="viewCodeActionButton" + size="s" > { - const [showFlyout, setShowFlyout] = useState(false); - const { watch } = useFormContext(); - const selectedIndices: string[] = watch(ChatFormFields.indices); - - return ( - <> - {showFlyout && setShowFlyout(false)} />} - setShowFlyout(true)} - disabled={selectedIndices?.length === 0} - data-test-subj="viewQueryActionButton" - > - - - - ); -}; diff --git a/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx b/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx deleted file mode 100644 index 2fd64f073eac7..0000000000000 --- a/x-pack/plugins/search_playground/public/components/view_query/view_query_flyout.tsx +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - EuiAccordion, - EuiSelectable, - EuiButton, - EuiButtonEmpty, - EuiCodeBlock, - EuiFlexGroup, - EuiFlexItem, - EuiFlyout, - EuiFlyoutBody, - EuiFlyoutFooter, - EuiFlyoutHeader, - EuiPanel, - EuiSpacer, - EuiSelectableOption, - EuiText, - EuiTitle, - EuiCheckbox, - EuiLink, - EuiIcon, -} from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useEffect, useState } from 'react'; -import { useFormContext } from 'react-hook-form'; -import { useController } from 'react-hook-form'; -import { AnalyticsEvents } from '../../analytics/constants'; -import { docLinks } from '../../../common/doc_links'; -import { useIndicesFields } from '../../hooks/use_indices_fields'; -import { useUsageTracker } from '../../hooks/use_usage_tracker'; -import { ChatForm, ChatFormFields, IndicesQuerySourceFields } from '../../types'; -import { createQuery, getDefaultQueryFields, IndexFields } from '../../utils/create_query'; - -const groupTypeQueryFields = ( - fields: IndicesQuerySourceFields, - queryFields: IndexFields -): string[] => - Object.entries(queryFields).map(([index, selectedFields]) => { - const indexFields = fields[index]; - let typeQueryFields = ''; - - if (selectedFields.some((field) => indexFields.bm25_query_fields.includes(field))) { - typeQueryFields = 'BM25'; - } - - if ( - selectedFields.some((field) => - indexFields.dense_vector_query_fields.find((vectorField) => vectorField.field === field) - ) - ) { - typeQueryFields += (typeQueryFields ? '_' : '') + 'DENSE'; - } - - if ( - selectedFields.some((field) => - indexFields.elser_query_fields.find((elserField) => elserField.field === field) - ) - ) { - typeQueryFields += (typeQueryFields ? '_' : '') + 'SPARSE'; - } - - if ( - selectedFields.some((field) => indexFields.semantic_fields.find((f) => f.field === field)) - ) { - typeQueryFields += (typeQueryFields ? '_' : '') + 'SEMANTIC'; - } - - return typeQueryFields; - }); - -interface ViewQueryFlyoutProps { - onClose: () => void; -} - -export const ViewQueryFlyout: React.FC = ({ onClose }) => { - const usageTracker = useUsageTracker(); - const { getValues } = useFormContext(); - const selectedIndices: string[] = getValues(ChatFormFields.indices); - const sourceFields = getValues(ChatFormFields.sourceFields); - const { fields } = useIndicesFields(selectedIndices); - const defaultFields = getDefaultQueryFields(fields); - - const { - field: { onChange: queryFieldsOnChange, value: queryFields }, - } = useController({ - name: ChatFormFields.queryFields, - defaultValue: defaultFields, - }); - - const [tempQueryFields, setTempQueryFields] = useState(queryFields); - - const { - field: { onChange: elasticsearchQueryChange }, - } = useController({ - name: ChatFormFields.elasticsearchQuery, - }); - - const isQueryFieldSelected = (index: string, field: string) => { - return tempQueryFields[index].includes(field); - }; - - const updateFields = (index: string, options: EuiSelectableOption[]) => { - const newFields = options - .filter((option) => option.checked === 'on') - .map((option) => option.label); - setTempQueryFields({ - ...tempQueryFields, - [index]: newFields, - }); - usageTracker?.count(AnalyticsEvents.viewQueryFieldsUpdated, newFields.length); - }; - - const saveQuery = () => { - queryFieldsOnChange(tempQueryFields); - elasticsearchQueryChange(createQuery(tempQueryFields, sourceFields, fields)); - onClose(); - - const groupedQueryFields = groupTypeQueryFields(fields, tempQueryFields); - - groupedQueryFields.forEach((typeQueryFields) => - usageTracker?.click(`${AnalyticsEvents.viewQuerySaved}_${typeQueryFields}`) - ); - }; - - useEffect(() => { - usageTracker?.load(AnalyticsEvents.viewQueryFlyoutOpened); - }, [usageTracker]); - - return ( - - - -

- -

-
- - -

- - {` `} - - - -

-
-
- - - - - {JSON.stringify(createQuery(tempQueryFields, sourceFields, fields), null, 2)} - - - - - -
- -
-
- {Object.entries(fields).map(([index, group]) => ( - - - -
{index}
-
- } - > - - { - const checked = isQueryFieldSelected( - index, - typeof field === 'string' ? field : field.field - ); - return { - label: typeof field === 'string' ? field : field.field, - prepend: ( - {}} - /> - ), - checked: checked ? 'on' : undefined, - 'data-test-subj': 'queryField', - }; - })} - listProps={{ - bordered: false, - showIcons: false, - }} - onChange={(newOptions) => updateFields(index, newOptions)} - > - {(list) => list} - - {group.skipped_fields > 0 && ( - <> - - - - - - {` `} - - - - - - - - - - - )} - - - - ))} - - - - - - - - - - - - - - - - - - - - ); -}; diff --git a/x-pack/plugins/search_playground/public/embeddable.tsx b/x-pack/plugins/search_playground/public/embeddable.tsx index f21c0c0f667eb..10eaec93fab8a 100644 --- a/x-pack/plugins/search_playground/public/embeddable.tsx +++ b/x-pack/plugins/search_playground/public/embeddable.tsx @@ -9,16 +9,15 @@ import React from 'react'; import { dynamic } from '@kbn/shared-ux-utility'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { CoreStart } from '@kbn/core-lifecycle-browser'; +import { QueryClientProvider } from '@tanstack/react-query'; import { AppPluginStartDependencies } from './types'; +import { queryClient } from './utils/query_client'; +import { AppProps } from './components/app'; -export const Playground = dynamic(async () => ({ +export const Playground = dynamic>(async () => ({ default: (await import('./components/app')).App, })); -export const PlaygroundToolbar = dynamic(async () => ({ - default: (await import('./components/toolbar')).Toolbar, -})); - export const PlaygroundProvider = dynamic(async () => ({ default: (await import('./providers/playground_provider')).PlaygroundProvider, })); @@ -32,6 +31,8 @@ export const getPlaygroundProvider = (props: React.ComponentProps) => ( - + + + ); diff --git a/x-pack/plugins/search_playground/public/hooks/use_indices_fields.ts b/x-pack/plugins/search_playground/public/hooks/use_indices_fields.ts index f78ea3accf206..e2ca982f2dc3f 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_indices_fields.ts +++ b/x-pack/plugins/search_playground/public/hooks/use_indices_fields.ts @@ -9,13 +9,15 @@ import { useQuery } from '@tanstack/react-query'; import { useKibana } from './use_kibana'; import { APIRoutes, IndicesQuerySourceFields } from '../types'; +const initialData = {}; + export const useIndicesFields = (indices: string[] = []) => { const { services } = useKibana(); - const { data, isLoading } = useQuery({ + const { data, isLoading, isFetching } = useQuery({ enabled: indices.length > 0, queryKey: ['fields', indices.toString()], - initialData: {}, + initialData, queryFn: async () => { const response = await services.http.post( APIRoutes.POST_QUERY_SOURCE_FIELDS, @@ -30,5 +32,5 @@ export const useIndicesFields = (indices: string[] = []) => { }, }); - return { fields: data!, isLoading }; + return { fields: data, isLoading: isLoading || isFetching }; }; diff --git a/x-pack/plugins/search_playground/public/hooks/use_query_indices.ts b/x-pack/plugins/search_playground/public/hooks/use_query_indices.ts index 6740928ac903c..d011b471a68d6 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_query_indices.ts +++ b/x-pack/plugins/search_playground/public/hooks/use_query_indices.ts @@ -29,7 +29,8 @@ export const useQueryIndices = ( return response.indices; }, + initialData: [], }); - return { indices: data || [], isLoading }; + return { indices: data, isLoading }; }; diff --git a/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts b/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts index bc9a37060fb6f..2fe9fbc237ff3 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts +++ b/x-pack/plugins/search_playground/public/hooks/use_source_indices_field.ts @@ -5,12 +5,11 @@ * 2.0. */ -import { useQuery } from '@tanstack/react-query'; -import { useController, useFormContext } from 'react-hook-form'; +import { useController } from 'react-hook-form'; import { IndexName } from '@elastic/elasticsearch/lib/api/types'; -import { useEffect, useState } from 'react'; -import { useKibana } from './use_kibana'; -import { APIRoutes, IndicesQuerySourceFields } from '../types'; +import { useCallback, useEffect, useState } from 'react'; +import { merge } from 'lodash'; +import { useIndicesFields } from './use_indices_fields'; import { ChatForm, ChatFormFields } from '../types'; import { createQuery, @@ -36,10 +35,7 @@ export const getIndicesWithNoSourceFields = ( export const useSourceIndicesFields = () => { const usageTracker = useUsageTracker(); - const { services } = useKibana(); const [loading, setLoading] = useState(false); - const [noFieldsIndicesWarning, setNoFieldsIndicesWarning] = useState(null); - const { resetField } = useFormContext(); const { field: { value: selectedIndices, onChange: onIndicesChange }, @@ -55,73 +51,74 @@ export const useSourceIndicesFields = () => { }); const { - field: { onChange: onSourceFieldsChange }, - } = useController({ - name: ChatFormFields.sourceFields, + field: { onChange: onQueryFieldsOnChange, value: queryFields }, + } = useController({ + name: ChatFormFields.queryFields, }); - const { data: fields } = useQuery({ - enabled: selectedIndices.length > 0, - queryKey: ['fields', selectedIndices.toString()], - queryFn: async () => { - const response = await services.http.post( - APIRoutes.POST_QUERY_SOURCE_FIELDS, - { - body: JSON.stringify({ indices: selectedIndices }), - } - ); - return response; - }, + const { + field: { onChange: onSourceFieldsChange, value: sourceFields }, + } = useController({ + name: ChatFormFields.sourceFields, }); + const { fields, isLoading: isFieldsLoading } = useIndicesFields(selectedIndices); useEffect(() => { if (fields) { - resetField(ChatFormFields.queryFields); - const defaultFields = getDefaultQueryFields(fields); const defaultSourceFields = getDefaultSourceFields(fields); + const mergedQueryFields = merge(defaultFields, queryFields); + const mergedSourceFields = merge(defaultSourceFields, sourceFields); - const indicesWithNoSourceFields = getIndicesWithNoSourceFields(defaultSourceFields); + onElasticsearchQueryChange(createQuery(mergedQueryFields, mergedSourceFields, fields)); + onQueryFieldsOnChange(mergedQueryFields); - if (indicesWithNoSourceFields) { - setNoFieldsIndicesWarning(indicesWithNoSourceFields); - } else { - setNoFieldsIndicesWarning(null); - } - - onElasticsearchQueryChange(createQuery(defaultFields, defaultSourceFields, fields)); - onSourceFieldsChange(defaultSourceFields); + onSourceFieldsChange(mergedSourceFields); usageTracker?.count( AnalyticsEvents.sourceFieldsLoaded, Object.values(fields)?.flat()?.length ); - } else { - setNoFieldsIndicesWarning(null); } setLoading(false); // eslint-disable-next-line react-hooks/exhaustive-deps }, [fields]); - const addIndex = (newIndex: IndexName) => { - const newIndices = [...selectedIndices, newIndex]; - setLoading(true); - onIndicesChange(newIndices); - usageTracker?.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); - }; - - const removeIndex = (index: IndexName) => { - const newIndices = selectedIndices.filter((indexName: string) => indexName !== index); - setLoading(true); - onIndicesChange(newIndices); - usageTracker?.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); - }; + const addIndex = useCallback( + (newIndex: IndexName) => { + const newIndices = [...selectedIndices, newIndex]; + setLoading(true); + onIndicesChange(newIndices); + usageTracker?.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); + }, + [onIndicesChange, selectedIndices, usageTracker] + ); + + const removeIndex = useCallback( + (index: IndexName) => { + const newIndices = selectedIndices.filter((indexName: string) => indexName !== index); + setLoading(true); + onIndicesChange(newIndices); + usageTracker?.count(AnalyticsEvents.sourceIndexUpdated, newIndices.length); + }, + [onIndicesChange, selectedIndices, usageTracker] + ); + + const setIndices = useCallback( + (indices: IndexName[]) => { + setLoading(true); + onIndicesChange(indices); + usageTracker?.count(AnalyticsEvents.sourceIndexUpdated, indices.length); + }, + [onIndicesChange, usageTracker] + ); return { indices: selectedIndices, fields, loading, + isFieldsLoading, addIndex, removeIndex, - noFieldsIndicesWarning, + setIndices, }; }; diff --git a/x-pack/plugins/search_playground/public/hooks/use_source_indices_fields.test.tsx b/x-pack/plugins/search_playground/public/hooks/use_source_indices_fields.test.tsx index 7dd1a43d6fc01..431eab3cd943c 100644 --- a/x-pack/plugins/search_playground/public/hooks/use_source_indices_fields.test.tsx +++ b/x-pack/plugins/search_playground/public/hooks/use_source_indices_fields.test.tsx @@ -165,7 +165,6 @@ describe.skip('useSourceIndicesFields Hook', () => { expect(postMock).toHaveBeenCalled(); await act(async () => { - expect(result.current.noFieldsIndicesWarning).toEqual('missing_fields_index'); expect(result.current.loading).toBe(false); expect(getValues()).toMatchInlineSnapshot(` Object { @@ -219,7 +218,6 @@ describe.skip('useSourceIndicesFields Hook', () => { expect(postMock).toHaveBeenCalled(); await act(async () => { - expect(result.current.noFieldsIndicesWarning).toBeNull(); expect(result.current.loading).toBe(false); expect(getValues()).toMatchInlineSnapshot(` Object { diff --git a/x-pack/plugins/search_playground/public/plugin.ts b/x-pack/plugins/search_playground/public/plugin.ts index bb8403366a6ed..8b2976cab10c9 100644 --- a/x-pack/plugins/search_playground/public/plugin.ts +++ b/x-pack/plugins/search_playground/public/plugin.ts @@ -15,7 +15,7 @@ import { import { PLUGIN_ID, PLUGIN_NAME } from '../common'; import { docLinks } from '../common/doc_links'; import { PlaygroundHeaderDocs } from './components/playground_header_docs'; -import { PlaygroundToolbar, Playground, getPlaygroundProvider } from './embeddable'; +import { Playground, getPlaygroundProvider } from './embeddable'; import { AppPluginStartDependencies, SearchPlaygroundConfigType, @@ -60,7 +60,6 @@ export class SearchPlaygroundPlugin docLinks.setDocLinks(core.docLinks.links); return { PlaygroundProvider: getPlaygroundProvider(core, deps), - PlaygroundToolbar, Playground, PlaygroundHeaderDocs, }; diff --git a/x-pack/plugins/search_playground/public/providers/playground_provider.tsx b/x-pack/plugins/search_playground/public/providers/playground_provider.tsx index 562658b4b8bd5..6700bb4c66a57 100644 --- a/x-pack/plugins/search_playground/public/providers/playground_provider.tsx +++ b/x-pack/plugins/search_playground/public/providers/playground_provider.tsx @@ -5,32 +5,30 @@ * 2.0. */ -import React, { FC, PropsWithChildren } from 'react'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import React, { FC, useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; -import { ChatForm } from '../types'; +import { useLLMsModels } from '../hooks/use_llms_models'; +import { ChatForm, ChatFormFields } from '../types'; -const queryClient = new QueryClient({}); - -export interface PlaygroundProviderProps { - children: React.ReactNode; -} - -export const PlaygroundProvider: FC> = ({ - children, -}) => { +export const PlaygroundProvider: FC = ({ children }) => { + const models = useLLMsModels(); const form = useForm({ defaultValues: { prompt: 'You are an assistant for question-answering tasks.', doc_size: 3, source_fields: {}, indices: [], + summarization_model: {}, }, }); - return ( - - {children} - - ); + useEffect(() => { + const defaultModel = models.find((model) => !model.disabled); + + if (defaultModel) { + form.setValue(ChatFormFields.summarizationModel, defaultModel); + } + }, [form, models]); + + return {children}; }; diff --git a/x-pack/plugins/search_playground/public/types.ts b/x-pack/plugins/search_playground/public/types.ts index eea41aae96d59..2076ac2190b99 100644 --- a/x-pack/plugins/search_playground/public/types.ts +++ b/x-pack/plugins/search_playground/public/types.ts @@ -25,7 +25,6 @@ import type { ConsolePluginStart } from '@kbn/console-plugin/public'; import { ChatRequestData } from '../common/types'; import type { App } from './components/app'; import type { PlaygroundProvider as PlaygroundProviderComponent } from './providers/playground_provider'; -import type { Toolbar } from './components/toolbar'; import { PlaygroundHeaderDocs } from './components/playground_header_docs'; export * from '../common/types'; @@ -34,7 +33,6 @@ export * from '../common/types'; export interface SearchPlaygroundPluginSetup {} export interface SearchPlaygroundPluginStart { PlaygroundProvider: React.FC>; - PlaygroundToolbar: React.FC>; Playground: React.FC>; PlaygroundHeaderDocs: React.FC>; } diff --git a/x-pack/plugins/search_playground/public/utils/create_query.ts b/x-pack/plugins/search_playground/public/utils/create_query.ts index fadf15f291abd..1f3fee0e35104 100644 --- a/x-pack/plugins/search_playground/public/utils/create_query.ts +++ b/x-pack/plugins/search_playground/public/utils/create_query.ts @@ -55,6 +55,9 @@ export function createQuery( const indices = Object.keys(fieldDescriptors); const boolMatches = Object.keys(fields).reduce( (acc, index) => { + if (!fieldDescriptors[index]) { + return acc; + } const indexFields: string[] = fields[index]; const indexFieldDescriptors: QuerySourceFields = fieldDescriptors[index]; @@ -320,6 +323,21 @@ export function getDefaultSourceFields(fieldDescriptors: IndicesQuerySourceField return indexFields; } +export const getIndicesWithNoSourceFields = ( + fields: IndicesQuerySourceFields +): string | undefined => { + const defaultSourceFields = getDefaultSourceFields(fields); + const indices = Object.keys(defaultSourceFields).reduce((result, index: string) => { + if (defaultSourceFields[index].length === 0) { + result.push(index); + } + + return result; + }, []); + + return indices.length === 0 ? undefined : indices.join(); +}; + export function getDefaultQueryFields(fieldDescriptors: IndicesQuerySourceFields): IndexFields { const indexFields = Object.keys(fieldDescriptors).reduce( (acc: IndexFields, index: string) => { diff --git a/x-pack/plugins/search_playground/public/utils/query_client.ts b/x-pack/plugins/search_playground/public/utils/query_client.ts new file mode 100644 index 0000000000000..c5d9874fe71ef --- /dev/null +++ b/x-pack/plugins/search_playground/public/utils/query_client.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { QueryClient } from '@tanstack/react-query'; + +export const queryClient = new QueryClient({}); diff --git a/x-pack/test/functional/apps/search_playground/playground_overview.ess.ts b/x-pack/test/functional/apps/search_playground/playground_overview.ess.ts index 0afa2979a6c15..0fb7675882016 100644 --- a/x-pack/test/functional/apps/search_playground/playground_overview.ess.ts +++ b/x-pack/test/functional/apps/search_playground/playground_overview.ess.ts @@ -15,7 +15,6 @@ import { LlmProxy, } from '../../../observability_ai_assistant_api_integration/common/create_llm_proxy'; -const indexName = 'basic_index'; const esArchiveIndex = 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index'; export default function (ftrContext: FtrProviderContext) { @@ -56,6 +55,7 @@ export default function (ftrContext: FtrProviderContext) { await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundHeaderComponentsToExist(); await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundHeaderComponentsToDisabled(); await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundStartChatPageComponentsToExist(); + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundStartChatPageIndexButtonExists(); }); describe('with gen ai connectors', () => { @@ -68,8 +68,8 @@ export default function (ftrContext: FtrProviderContext) { await removeOpenAIConnector?.(); await browser.refresh(); }); - it('hide gen ai panel', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectHideGenAIPanelConnector(); + it('show success llm button', async () => { + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectShowSuccessLLMButton(); }); }); @@ -80,7 +80,7 @@ export default function (ftrContext: FtrProviderContext) { it('creates a connector successfully', async () => { await pageObjects.searchPlayground.PlaygroundStartChatPage.expectOpenConnectorPagePlayground(); - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectHideGenAIPanelConnectorAfterCreatingConnector( + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectSuccessButtonAfterCreatingConnector( createConnector ); }); @@ -92,18 +92,16 @@ export default function (ftrContext: FtrProviderContext) { }); describe('without any indices', () => { - it('show no index callout', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectNoIndexCalloutExists(); + it('show create index button', async () => { await pageObjects.searchPlayground.PlaygroundStartChatPage.expectCreateIndexButtonToExists(); }); - it('hide no index callout when index added', async () => { + it('show success button when index added', async () => { await createIndex(); - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectSelectIndex(indexName); + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectOpenFlyoutAndSelectIndex(); }); after(async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.removeIndexFromComboBox(); await esArchiver.unload(esArchiveIndex); await browser.refresh(); }); @@ -116,14 +114,8 @@ export default function (ftrContext: FtrProviderContext) { await browser.refresh(); }); - it('dropdown shows up', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectIndicesInDropdown(); - }); - - it('can select index from dropdown and navigate to chat window', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectToSelectIndicesAndStartButtonEnabled( - indexName - ); + it('can select index from dropdown and load chat page', async () => { + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectToSelectIndicesAndLoadChat(); }); after(async () => { @@ -139,7 +131,7 @@ export default function (ftrContext: FtrProviderContext) { await createConnector(); await createIndex(); await browser.refresh(); - await pageObjects.searchPlayground.PlaygroundChatPage.navigateToChatPage(indexName); + await pageObjects.searchPlayground.PlaygroundChatPage.navigateToChatPage(); }); it('loads successfully', async () => { await pageObjects.searchPlayground.PlaygroundChatPage.expectChatWindowLoaded(); diff --git a/x-pack/test/functional/page_objects/search_playground_page.ts b/x-pack/test/functional/page_objects/search_playground_page.ts index 89bffc8bbd841..01f50245a1a90 100644 --- a/x-pack/test/functional/page_objects/search_playground_page.ts +++ b/x-pack/test/functional/page_objects/search_playground_page.ts @@ -10,16 +10,28 @@ import { FtrProviderContext } from '../ftr_provider_context'; export function SearchPlaygroundPageProvider({ getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); - const comboBox = getService('comboBox'); const browser = getService('browser'); + const selectIndex = async () => { + await testSubjects.existOrFail('addDataSourcesButton'); + await testSubjects.click('addDataSourcesButton'); + await testSubjects.existOrFail('selectIndicesFlyout'); + await testSubjects.click('sourceIndex-0'); + await testSubjects.click('saveButton'); + }; return { PlaygroundStartChatPage: { async expectPlaygroundStartChatPageComponentsToExist() { - await testSubjects.existOrFail('startChatPage'); - await testSubjects.existOrFail('connectToLLMChatPanel'); - await testSubjects.existOrFail('selectIndicesChatPanel'); - await testSubjects.existOrFail('startChatButton'); + await testSubjects.existOrFail('setupPage'); + await testSubjects.existOrFail('connectLLMButton'); + }, + + async expectPlaygroundStartChatPageIndexButtonExists() { + await testSubjects.existOrFail('createIndexButton'); + }, + + async expectPlaygroundStartChatPageIndexCalloutExists() { + await testSubjects.existOrFail('createIndexCallout'); }, async expectPlaygroundHeaderComponentsToExist() { @@ -28,8 +40,8 @@ export function SearchPlaygroundPageProvider({ getService }: FtrProviderContext) }, async expectPlaygroundHeaderComponentsToDisabled() { - expect(await testSubjects.isEnabled('editContextActionButton')).to.be(false); - expect(await testSubjects.isEnabled('viewQueryActionButton')).to.be(false); + expect(await testSubjects.getAttribute('viewModeSelector', 'disabled')).to.be('true'); + expect(await testSubjects.isEnabled('dataSourceActionButton')).to.be(false); expect(await testSubjects.isEnabled('viewCodeActionButton')).to.be(false); }, @@ -37,66 +49,45 @@ export function SearchPlaygroundPageProvider({ getService }: FtrProviderContext) await testSubjects.existOrFail('createIndexButton'); }, - async expectNoIndexCalloutExists() { - await testSubjects.existOrFail('createIndexCallout'); - }, - - async expectSelectIndex(indexName: string) { + async expectOpenFlyoutAndSelectIndex() { await browser.refresh(); - await testSubjects.missingOrFail('createIndexCallout'); - await testSubjects.existOrFail('selectIndicesComboBox'); - await comboBox.setCustom('selectIndicesComboBox', indexName); + await selectIndex(); + await testSubjects.existOrFail('dataSourcesSuccessButton'); }, - async expectIndicesInDropdown() { - await testSubjects.existOrFail('selectIndicesComboBox'); - }, - - async removeIndexFromComboBox() { - await testSubjects.click('removeIndexButton'); - }, - - async expectToSelectIndicesAndStartButtonEnabled(indexName: string) { - await comboBox.setCustom('selectIndicesComboBox', indexName); - expect(await testSubjects.isEnabled('startChatButton')).to.be(true); - expect(await testSubjects.isEnabled('editContextActionButton')).to.be(true); - expect(await testSubjects.isEnabled('viewQueryActionButton')).to.be(true); - expect(await testSubjects.isEnabled('viewCodeActionButton')).to.be(true); - - await testSubjects.click('startChatButton'); + async expectToSelectIndicesAndLoadChat() { + await selectIndex(); await testSubjects.existOrFail('chatPage'); }, async expectAddConnectorButtonExists() { - await testSubjects.existOrFail('setupGenAIConnectorButton'); + await testSubjects.existOrFail('connectLLMButton'); }, async expectOpenConnectorPagePlayground() { - await testSubjects.click('setupGenAIConnectorButton'); + await testSubjects.click('connectLLMButton'); await testSubjects.existOrFail('create-connector-flyout'); }, - async expectHideGenAIPanelConnectorAfterCreatingConnector( - createConnector: () => Promise - ) { + async expectSuccessButtonAfterCreatingConnector(createConnector: () => Promise) { await createConnector(); await browser.refresh(); - await testSubjects.missingOrFail('connectToLLMChatPanel'); + await testSubjects.existOrFail('successConnectLLMButton'); }, - async expectHideGenAIPanelConnector() { - await testSubjects.missingOrFail('connectToLLMChatPanel'); + async expectShowSuccessLLMButton() { + await testSubjects.existOrFail('successConnectLLMButton'); }, }, PlaygroundChatPage: { - async navigateToChatPage(indexName: string) { - await comboBox.setCustom('selectIndicesComboBox', indexName); - await testSubjects.click('startChatButton'); + async navigateToChatPage() { + await selectIndex(); + await testSubjects.existOrFail('chatPage'); }, async expectChatWindowLoaded() { - expect(await testSubjects.isEnabled('editContextActionButton')).to.be(true); - expect(await testSubjects.isEnabled('viewQueryActionButton')).to.be(true); + expect(await testSubjects.getAttribute('viewModeSelector', 'disabled')).to.be(null); + expect(await testSubjects.isEnabled('dataSourceActionButton')).to.be(true); expect(await testSubjects.isEnabled('viewCodeActionButton')).to.be(true); expect(await testSubjects.isEnabled('regenerateActionButton')).to.be(false); @@ -114,9 +105,8 @@ export function SearchPlaygroundPageProvider({ getService }: FtrProviderContext) await (await testSubjects.find('manageConnectorsLink')).getAttribute('href') ).to.contain('/app/management/insightsAndAlerting/triggersActionsConnectors/connectors/'); - await testSubjects.click('sourcesAccordion'); - - expect(await testSubjects.findAll('indicesInAccordian')).to.have.length(1); + await testSubjects.existOrFail('editContextPanel'); + await testSubjects.existOrFail('summarizationPanel'); }, async sendQuestion() { @@ -145,9 +135,9 @@ export function SearchPlaygroundPageProvider({ getService }: FtrProviderContext) }, async expectViewQueryHasFields() { - await testSubjects.click('viewQueryActionButton'); - await testSubjects.existOrFail('viewQueryFlyout'); - const fields = await testSubjects.findAll('queryField'); + await testSubjects.existOrFail('queryMode'); + await testSubjects.click('queryMode'); + const fields = await testSubjects.findAll('fieldName'); expect(fields.length).to.be(1); @@ -156,18 +146,16 @@ export function SearchPlaygroundPageProvider({ getService }: FtrProviderContext) expect(code.replace(/ /g, '')).to.be( '{\n"retriever":{\n"standard":{\n"query":{\n"multi_match":{\n"query":"{query}",\n"fields":[\n"baz"\n]\n}\n}\n}\n}\n}' ); - await testSubjects.click('euiFlyoutCloseButton'); }, async expectEditContextOpens() { - await testSubjects.click('editContextActionButton'); - await testSubjects.existOrFail('editContextFlyout'); - await testSubjects.click('contextFieldsSelectable_basic_index'); + await testSubjects.click('chatMode'); + await testSubjects.existOrFail('contextFieldsSelectable-0'); + await testSubjects.click('contextFieldsSelectable-0'); await testSubjects.existOrFail('contextField'); const fields = await testSubjects.findAll('contextField'); expect(fields.length).to.be(1); - await testSubjects.click('euiFlyoutCloseButton'); }, }, }; diff --git a/x-pack/test_serverless/functional/test_suites/search/search_playground/playground_overview.ts b/x-pack/test_serverless/functional/test_suites/search/search_playground/playground_overview.ts index 33e2e9883b38b..b600da8ae4343 100644 --- a/x-pack/test_serverless/functional/test_suites/search/search_playground/playground_overview.ts +++ b/x-pack/test_serverless/functional/test_suites/search/search_playground/playground_overview.ts @@ -12,7 +12,6 @@ import { RoleCredentials } from '../../../../shared/services'; import { createOpenAIConnector } from './utils/create_openai_connector'; import { createLlmProxy, LlmProxy } from './utils/create_llm_proxy'; -const indexName = 'basic_index'; const esArchiveIndex = 'test/api_integration/fixtures/es_archiver/index_patterns/basic_index'; export default function ({ getPageObjects, getService }: FtrProviderContext) { @@ -66,6 +65,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundHeaderComponentsToExist(); await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundHeaderComponentsToDisabled(); await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundStartChatPageComponentsToExist(); + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectPlaygroundStartChatPageIndexCalloutExists(); }); describe('with gen ai connectors', () => { @@ -78,8 +78,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await removeOpenAIConnector?.(); await browser.refresh(); }); - it('hide gen ai panel', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectHideGenAIPanelConnector(); + it('show success llm button', async () => { + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectShowSuccessLLMButton(); }); }); @@ -90,7 +90,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('creates a connector successfully', async () => { await pageObjects.searchPlayground.PlaygroundStartChatPage.expectOpenConnectorPagePlayground(); - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectHideGenAIPanelConnectorAfterCreatingConnector( + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectSuccessButtonAfterCreatingConnector( createConnector ); }); @@ -102,17 +102,12 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); describe('without any indices', () => { - it('show no index callout', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectNoIndexCalloutExists(); - }); - it('hide no index callout when index added', async () => { await createIndex(); - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectSelectIndex(indexName); + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectOpenFlyoutAndSelectIndex(); }); after(async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.removeIndexFromComboBox(); await esArchiver.unload(esArchiveIndex); await browser.refresh(); }); @@ -125,14 +120,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await browser.refresh(); }); - it('dropdown shows up', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectIndicesInDropdown(); - }); - - it('can select index from dropdown and navigate to chat window', async () => { - await pageObjects.searchPlayground.PlaygroundStartChatPage.expectToSelectIndicesAndStartButtonEnabled( - indexName - ); + it('can select index from dropdown and load chat page', async () => { + await pageObjects.searchPlayground.PlaygroundStartChatPage.expectToSelectIndicesAndLoadChat(); }); after(async () => { @@ -148,7 +137,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await createConnector(); await createIndex(); await browser.refresh(); - await pageObjects.searchPlayground.PlaygroundChatPage.navigateToChatPage(indexName); + await pageObjects.searchPlayground.PlaygroundChatPage.navigateToChatPage(); }); it('loads successfully', async () => { await pageObjects.searchPlayground.PlaygroundChatPage.expectChatWindowLoaded(); From 54ff3bf24984d354e3b9f8e805fb30e9e7a8409d Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 10 Jul 2024 15:50:10 +0200 Subject: [PATCH 31/82] [CI] Fix heredoc typos (#187971) ## Summary I've introduced a typo to the artifact publish script in #184018 - this PR fixes it. --- .buildkite/scripts/steps/artifacts/publish.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.buildkite/scripts/steps/artifacts/publish.sh b/.buildkite/scripts/steps/artifacts/publish.sh index c272acac22614..08c6ecc1e25ad 100644 --- a/.buildkite/scripts/steps/artifacts/publish.sh +++ b/.buildkite/scripts/steps/artifacts/publish.sh @@ -62,7 +62,7 @@ if [[ "$BUILDKITE_BRANCH" == "$KIBANA_BASE_BRANCH" ]]; then download_artifact beats_manifest.json /tmp --build "${KIBANA_BUILD_ID:-$BUILDKITE_BUILD_ID}" export BEATS_MANIFEST_URL=$(jq -r .manifest_url /tmp/beats_manifest.json) - PUBLISH_CMD=$(cat < EOF + PUBLISH_CMD=$(cat << EOF docker run --rm \ --name release-manager \ -e VAULT_ADDR \ @@ -79,7 +79,8 @@ if [[ "$BUILDKITE_BRANCH" == "$KIBANA_BASE_BRANCH" ]]; then --qualifier "$VERSION_QUALIFIER" \ --dependency "beats:$BEATS_MANIFEST_URL" \ --artifact-set main -EOF) +EOF +) if [[ "${DRY_RUN:-}" =~ ^(1|true)$ ]]; then PUBLISH_CMD+=(" --dry-run") fi From 32f6a78933883d42f8228ef5192f762b18b968ab Mon Sep 17 00:00:00 2001 From: Carson Ip Date: Wed, 10 Jul 2024 14:50:47 +0100 Subject: [PATCH 32/82] Fix typo in stack monitoring apm (#187875) Fix typo in stack monitoring apm --- .../server/lib/metrics/__snapshots__/metrics.test.js.snap | 2 +- x-pack/plugins/monitoring/server/lib/metrics/apm/metrics.ts | 2 +- .../api_integration/apis/monitoring/apm/fixtures/instance.json | 2 +- .../test/monitoring_api_integration/fixtures/apm/instance.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/monitoring/server/lib/metrics/__snapshots__/metrics.test.js.snap b/x-pack/plugins/monitoring/server/lib/metrics/__snapshots__/metrics.test.js.snap index 6e0623564bab3..24d9d52224fa4 100644 --- a/x-pack/plugins/monitoring/server/lib/metrics/__snapshots__/metrics.test.js.snap +++ b/x-pack/plugins/monitoring/server/lib/metrics/__snapshots__/metrics.test.js.snap @@ -36,7 +36,7 @@ Object { "dateHistogramSubAggs": undefined, "derivative": true, "derivativeNormalizedUnits": true, - "description": "HTTP Requests received by agent configuration managemen", + "description": "HTTP Requests received by agent configuration management", "docType": undefined, "field": "beats_stats.metrics.apm-server.acm.request.count", "fieldSource": undefined, diff --git a/x-pack/plugins/monitoring/server/lib/metrics/apm/metrics.ts b/x-pack/plugins/monitoring/server/lib/metrics/apm/metrics.ts index 8cd3941be1338..1593ecd2beba4 100644 --- a/x-pack/plugins/monitoring/server/lib/metrics/apm/metrics.ts +++ b/x-pack/plugins/monitoring/server/lib/metrics/apm/metrics.ts @@ -612,7 +612,7 @@ export const metrics = { defaultMessage: 'Count', }), description: i18n.translate('xpack.monitoring.metrics.apm.acmRequest.countTitleDescription', { - defaultMessage: 'HTTP Requests received by agent configuration managemen', + defaultMessage: 'HTTP Requests received by agent configuration management', }), }), apm_cgroup_memory_usage: new ApmMetric({ diff --git a/x-pack/test/api_integration/apis/monitoring/apm/fixtures/instance.json b/x-pack/test/api_integration/apis/monitoring/apm/fixtures/instance.json index 74abc5de82dbf..ccfb82f5212a8 100644 --- a/x-pack/test/api_integration/apis/monitoring/apm/fixtures/instance.json +++ b/x-pack/test/api_integration/apis/monitoring/apm/fixtures/instance.json @@ -872,7 +872,7 @@ "metricAgg": "max", "label": "Count", "title": "Requests Agent Configuration Management", - "description": "HTTP Requests received by agent configuration managemen", + "description": "HTTP Requests received by agent configuration management", "units": "/s", "format": "0,0.[00]", "hasCalculation": false, diff --git a/x-pack/test/monitoring_api_integration/fixtures/apm/instance.json b/x-pack/test/monitoring_api_integration/fixtures/apm/instance.json index a8294f495166f..43d078b2b5b40 100644 --- a/x-pack/test/monitoring_api_integration/fixtures/apm/instance.json +++ b/x-pack/test/monitoring_api_integration/fixtures/apm/instance.json @@ -1 +1 @@ -{"metrics":{"apm_cpu":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.cpu.total.value","metricAgg":"max","label":"Total","title":"CPU Utilization","description":"Percentage of CPU time spent executing (user+kernel mode) for the APM process","units":"%","format":"0.[00]","hasCalculation":true,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0.6],[1679500660000,0.6],[1679500670000,0.6],[1679500680000,0.7000000000000001],[1679500690000,0.6],[1679500700000,0.8],[1679500710000,1],[1679500720000,0.6],[1679500730000,0.5],[1679500740000,0.8],[1679500750000,0.6],[1679500760000,0.6],[1679500770000,0.6],[1679500780000,1],[1679500790000,0.7000000000000001],[1679500800000,0.5],[1679500810000,0.6],[1679500820000,0.6],[1679500830000,0.5],[1679500840000,0.7000000000000001],[1679500850000,1],[1679500860000,0.7000000000000001],[1679500870000,0.8]]}],"apm_os_load":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.system.load.1","metricAgg":"max","label":"1m","title":"System Load","description":"Load average over the last 1 minute","units":"","format":"0,0.[00]","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,2.54],[1679500650000,3.03],[1679500660000,2.71],[1679500670000,2.44],[1679500680000,2.22],[1679500690000,2.03],[1679500700000,2.35],[1679500710000,2.06],[1679500720000,1.98],[1679500730000,1.75],[1679500740000,1.64],[1679500750000,1.39],[1679500760000,1.17],[1679500770000,1.07],[1679500780000,0.91],[1679500790000,1.08],[1679500800000,1.14],[1679500810000,0.96],[1679500820000,0.81],[1679500830000,1.06],[1679500840000,1.05],[1679500850000,1.13],[1679500860000,1.35],[1679500870000,1.14]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.system.load.5","metricAgg":"max","label":"5m","title":"System Load","description":"Load average over the last 5 minutes","units":"","format":"0,0.[00]","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,2.05],[1679500650000,2.17],[1679500660000,2.13],[1679500670000,2.09],[1679500680000,2.05],[1679500690000,2.02],[1679500700000,2.08],[1679500710000,2.03],[1679500720000,2.01],[1679500730000,1.96],[1679500740000,1.93],[1679500750000,1.87],[1679500760000,1.8],[1679500770000,1.76],[1679500780000,1.7],[1679500790000,1.71],[1679500800000,1.71],[1679500810000,1.65],[1679500820000,1.59],[1679500830000,1.62],[1679500840000,1.6],[1679500850000,1.6],[1679500860000,1.63],[1679500870000,1.57]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.system.load.15","metricAgg":"max","label":"15m","title":"System Load","description":"Load average over the last 15 minutes","units":"","format":"0,0.[00]","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,1.47],[1679500650000,1.51],[1679500660000,1.5],[1679500670000,1.5],[1679500680000,1.49],[1679500690000,1.49],[1679500700000,1.51],[1679500710000,1.5],[1679500720000,1.5],[1679500730000,1.49],[1679500740000,1.49],[1679500750000,1.47],[1679500760000,1.45],[1679500770000,1.44],[1679500780000,1.43],[1679500790000,1.43],[1679500800000,1.43],[1679500810000,1.42],[1679500820000,1.4],[1679500830000,1.41],[1679500840000,1.41],[1679500850000,1.41],[1679500860000,1.42],[1679500870000,1.41]]}],"apm_memory":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.memory_alloc","metricAgg":"max","label":"Allocated Memory","title":"Memory","description":"Allocated memory","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,37395216],[1679500650000,41615536],[1679500660000,45549872],[1679500670000,48639824],[1679500680000,52503144],[1679500690000,55889632],[1679500700000,59721688],[1679500710000,38234784],[1679500720000,41191920],[1679500730000,45048264],[1679500740000,49664736],[1679500750000,53688584],[1679500760000,57633520],[1679500770000,61293528],[1679500780000,39092008],[1679500790000,43694136],[1679500800000,46895384],[1679500810000,50130024],[1679500820000,53510976],[1679500830000,57166128],[1679500840000,61012360],[1679500850000,39088512],[1679500860000,43863416],[1679500870000,47825208]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.rss","metricAgg":"max","label":"Process Total","title":"Memory","description":"Resident set size of memory reserved by the APM service from the OS","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,62275584],[1679500650000,62472192],[1679500660000,62685184],[1679500670000,65806336],[1679500680000,70074368],[1679500690000,73576448],[1679500700000,77508608],[1679500710000,80875520],[1679500720000,80875520],[1679500730000,80875520],[1679500740000,81080320],[1679500750000,81289216],[1679500760000,81289216],[1679500770000,81289216],[1679500780000,81502208],[1679500790000,81502208],[1679500800000,81502208],[1679500810000,81502208],[1679500820000,81502208],[1679500830000,81502208],[1679500840000,81653760],[1679500850000,81653760],[1679500860000,81653760],[1679500870000,82456576]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.gc_next","metricAgg":"max","label":"GC Next","title":"Memory","description":"Limit of allocated memory at which garbage collection will occur","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,73697880],[1679500650000,73697880],[1679500660000,73697880],[1679500670000,73697880],[1679500680000,73697880],[1679500690000,73697880],[1679500700000,73697880],[1679500710000,74066896],[1679500720000,74066896],[1679500730000,74066896],[1679500740000,74066896],[1679500750000,74066896],[1679500760000,74066896],[1679500770000,74066896],[1679500780000,73968024],[1679500790000,73968024],[1679500800000,73968024],[1679500810000,73968024],[1679500820000,73968024],[1679500830000,73968024],[1679500840000,73968024],[1679500850000,73963784],[1679500860000,73963784],[1679500870000,73963784]]}],"apm_memory_cgroup":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.cgroup.memory.mem.usage.bytes","metricAgg":"max","label":"Memory Utilization (cgroup)","title":"Memory","description":"Memory usage of the container","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,32874496],[1679500650000,33325056],[1679500660000,33345536],[1679500670000,36667392],[1679500680000,40730624],[1679500690000,44462080],[1679500700000,48246784],[1679500710000,51675136],[1679500720000,51695616],[1679500730000,51720192],[1679500740000,51822592],[1679500750000,52109312],[1679500760000,52174848],[1679500770000,52101120],[1679500780000,52178944],[1679500790000,52215808],[1679500800000,52228096],[1679500810000,52248576],[1679500820000,52264960],[1679500830000,52400128],[1679500840000,52289536],[1679500850000,52518912],[1679500860000,52428800],[1679500870000,52580352]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.cgroup.memory.mem.limit.bytes","metricAgg":"max","label":"Memory Limit","title":"Memory","description":"Memory limit of the container","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,1073741824],[1679500650000,1073741824],[1679500660000,1073741824],[1679500670000,1073741824],[1679500680000,1073741824],[1679500690000,1073741824],[1679500700000,1073741824],[1679500710000,1073741824],[1679500720000,1073741824],[1679500730000,1073741824],[1679500740000,1073741824],[1679500750000,1073741824],[1679500760000,1073741824],[1679500770000,1073741824],[1679500780000,1073741824],[1679500790000,1073741824],[1679500800000,1073741824],[1679500810000,1073741824],[1679500820000,1073741824],[1679500830000,1073741824],[1679500840000,1073741824],[1679500850000,1073741824],[1679500860000,1073741824],[1679500870000,1073741824]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.gc_next","metricAgg":"max","label":"GC Next","title":"Memory","description":"Limit of allocated memory at which garbage collection will occur","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,73697880],[1679500650000,73697880],[1679500660000,73697880],[1679500670000,73697880],[1679500680000,73697880],[1679500690000,73697880],[1679500700000,73697880],[1679500710000,74066896],[1679500720000,74066896],[1679500730000,74066896],[1679500740000,74066896],[1679500750000,74066896],[1679500760000,74066896],[1679500770000,74066896],[1679500780000,73968024],[1679500790000,73968024],[1679500800000,73968024],[1679500810000,73968024],[1679500820000,73968024],[1679500830000,73968024],[1679500840000,73968024],[1679500850000,73963784],[1679500860000,73963784],[1679500870000,73963784]]}],"apm_output_events_rate_success":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.total","metricAgg":"max","label":"Total","title":"Output Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,8.4],[1679500660000,8.8],[1679500670000,6.8],[1679500680000,7.7],[1679500690000,7.6],[1679500700000,8],[1679500710000,8.4],[1679500720000,6.4],[1679500730000,8.4],[1679500740000,10.5],[1679500750000,8.4],[1679500760000,8.4],[1679500770000,7.6],[1679500780000,8],[1679500790000,10],[1679500800000,6.5],[1679500810000,6.8],[1679500820000,7.2],[1679500830000,7.6],[1679500840000,8.4],[1679500850000,8],[1679500860000,10.5],[1679500870000,9.2]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.active","metricAgg":"max","label":"Active","title":"Output Active Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,null],[1679500660000,0.8],[1679500670000,0],[1679500680000,null],[1679500690000,0.4],[1679500700000,0.4],[1679500710000,0.8],[1679500720000,null],[1679500730000,0.8],[1679500740000,0.4],[1679500750000,null],[1679500760000,0],[1679500770000,null],[1679500780000,0.8],[1679500790000,null],[1679500800000,0],[1679500810000,null],[1679500820000,0],[1679500830000,1.6],[1679500840000,null],[1679500850000,null],[1679500860000,0.8],[1679500870000,null]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.acked","metricAgg":"max","label":"Acked","title":"Output Acked Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,9.2],[1679500660000,8],[1679500670000,6.8],[1679500680000,8.5],[1679500690000,7.2],[1679500700000,7.6],[1679500710000,7.6],[1679500720000,8],[1679500730000,7.6],[1679500740000,10.1],[1679500750000,9.2],[1679500760000,8.4],[1679500770000,8],[1679500780000,7.2],[1679500790000,10.4],[1679500800000,6.5],[1679500810000,7.2],[1679500820000,7.2],[1679500830000,6],[1679500840000,9.6],[1679500850000,8.4],[1679500860000,9.7],[1679500870000,10]]}],"apm_output_events_rate_failure":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.failed","metricAgg":"max","label":"Failed","title":"Output Failed Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.dropped","metricAgg":"max","label":"Dropped","title":"Output Dropped Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_responses_valid":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.count","metricAgg":"max","label":"Total","title":"Response Count Intake API","description":"HTTP Requests responded to by server","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.valid.ok","metricAgg":"max","label":"Ok","title":"Ok","description":"200 OK response count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.valid.accepted","metricAgg":"max","label":"Accepted","title":"Accepted","description":"HTTP Requests successfully reporting new events","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]}],"apm_responses_errors":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.toolarge","metricAgg":"max","label":"Too large","title":"Response Errors Intake API","description":"HTTP Requests rejected due to excessive payload size","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.validate","metricAgg":"max","label":"Validate","title":"Validate","description":"HTTP Requests rejected due to payload validation error","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.method","metricAgg":"max","label":"Method","title":"Method","description":"HTTP Requests rejected due to incorrect HTTP method","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.unauthorized","metricAgg":"max","label":"Unauthorized","title":"Unauthorized","description":"HTTP Requests rejected due to invalid secret token","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.ratelimit","metricAgg":"max","label":"Rate limit","title":"Rate limit","description":"HTTP Requests rejected to due excessive rate limit","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.queue","metricAgg":"max","label":"Queue","title":"Queue","description":"HTTP Requests rejected to due internal queue filling up","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.decode","metricAgg":"max","label":"Decode","title":"Decode","description":"HTTP Requests rejected to due decoding errors - invalid json, incorrect data type for entity","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.forbidden","metricAgg":"max","label":"Forbidden","title":"Forbidden","description":"Forbidden HTTP Requests rejected - CORS violation, disabled enpoint","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.concurrency","metricAgg":"max","label":"Concurrency","title":"Concurrency","description":"HTTP Requests rejected due to overall concurrency limit breach","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.closed","metricAgg":"max","label":"Closed","title":"Closed","description":"HTTP Requests rejected during server shutdown","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.internal","metricAgg":"max","label":"Internal","title":"Internal","description":"HTTP Requests rejected due to a miscellaneous internal error","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_requests":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.request.count","metricAgg":"max","label":"Requested","title":"Request Count Intake API","description":"HTTP Requests received by server","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]}],"apm_transformations":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.transaction.transformations","metricAgg":"max","label":"Transaction","title":"Processed Events","description":"Transaction events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.span.transformations","metricAgg":"max","label":"Span","title":"Transformations","description":"Span events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.error.transformations","metricAgg":"max","label":"Error","title":"Transformations","description":"Error events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.metric.transformations","metricAgg":"max","label":"Metric","title":"Transformations","description":"Metric events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,2.3],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,3],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,2],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,3],[1679500870000,2.3]]}],"apm_acm_response":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.count","metricAgg":"max","label":"Count","title":"Response Count Agent Configuration Management","description":"HTTP requests responded to by APM Server","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.count","metricAgg":"max","label":"Error Count","title":"Response Error Count Agent Configuration Management","description":"HTTP errors count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.valid.ok","metricAgg":"max","label":"OK","title":"Response OK Count Agent Configuration Management","description":"200 OK response count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.valid.notmodified","metricAgg":"max","label":"Not Modified","title":"Response Not Modified Agent Configuration Management","description":"304 Not modified response count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_acm_response_errors":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.forbidden","metricAgg":"max","label":"Count","title":"Response Errors Agent Configuration Management","description":"Forbidden HTTP requests rejected count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.unauthorized","metricAgg":"max","label":"Unauthorized","title":"Response Unauthorized Errors Agent Configuration Management","description":"Unauthorized HTTP requests rejected count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.unavailable","metricAgg":"max","label":"Unavailable","title":"Response Unavailable Errors Agent Configuration Management","description":"Unavailable HTTP response count. Possible misconfiguration or unsupported version of Kibana","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.method","metricAgg":"max","label":"Method","title":"Response Method Errors Agent Configuration Management","description":"HTTP requests rejected due to incorrect HTTP method","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.invalidquery","metricAgg":"max","label":"Invalid Query","title":"Response Invalid Query Errors Agent Configuration Management","description":"Invalid HTTP query","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_acm_request_count":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.request.count","metricAgg":"max","label":"Count","title":"Requests Agent Configuration Management","description":"HTTP Requests received by agent configuration managemen","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}]},"apmSummary":{"uuid":"ccf6c4d9-37bc-4dd0-bf57-2ae3ee296a39","transportAddress":"3031a4a32eea","version":"8.7.0","name":"3031a4a32eea","type":"Apm-server","output":"Elasticsearch","configReloads":null,"uptime":271879,"eventsTotal":2020,"eventsEmitted":null,"eventsDropped":null,"bytesWritten":739360,"config":{"container":false},"timeOfLastEvent":"2023-03-22T16:01:37.064Z"}} +{"metrics":{"apm_cpu":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.cpu.total.value","metricAgg":"max","label":"Total","title":"CPU Utilization","description":"Percentage of CPU time spent executing (user+kernel mode) for the APM process","units":"%","format":"0.[00]","hasCalculation":true,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0.6],[1679500660000,0.6],[1679500670000,0.6],[1679500680000,0.7000000000000001],[1679500690000,0.6],[1679500700000,0.8],[1679500710000,1],[1679500720000,0.6],[1679500730000,0.5],[1679500740000,0.8],[1679500750000,0.6],[1679500760000,0.6],[1679500770000,0.6],[1679500780000,1],[1679500790000,0.7000000000000001],[1679500800000,0.5],[1679500810000,0.6],[1679500820000,0.6],[1679500830000,0.5],[1679500840000,0.7000000000000001],[1679500850000,1],[1679500860000,0.7000000000000001],[1679500870000,0.8]]}],"apm_os_load":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.system.load.1","metricAgg":"max","label":"1m","title":"System Load","description":"Load average over the last 1 minute","units":"","format":"0,0.[00]","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,2.54],[1679500650000,3.03],[1679500660000,2.71],[1679500670000,2.44],[1679500680000,2.22],[1679500690000,2.03],[1679500700000,2.35],[1679500710000,2.06],[1679500720000,1.98],[1679500730000,1.75],[1679500740000,1.64],[1679500750000,1.39],[1679500760000,1.17],[1679500770000,1.07],[1679500780000,0.91],[1679500790000,1.08],[1679500800000,1.14],[1679500810000,0.96],[1679500820000,0.81],[1679500830000,1.06],[1679500840000,1.05],[1679500850000,1.13],[1679500860000,1.35],[1679500870000,1.14]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.system.load.5","metricAgg":"max","label":"5m","title":"System Load","description":"Load average over the last 5 minutes","units":"","format":"0,0.[00]","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,2.05],[1679500650000,2.17],[1679500660000,2.13],[1679500670000,2.09],[1679500680000,2.05],[1679500690000,2.02],[1679500700000,2.08],[1679500710000,2.03],[1679500720000,2.01],[1679500730000,1.96],[1679500740000,1.93],[1679500750000,1.87],[1679500760000,1.8],[1679500770000,1.76],[1679500780000,1.7],[1679500790000,1.71],[1679500800000,1.71],[1679500810000,1.65],[1679500820000,1.59],[1679500830000,1.62],[1679500840000,1.6],[1679500850000,1.6],[1679500860000,1.63],[1679500870000,1.57]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.system.load.15","metricAgg":"max","label":"15m","title":"System Load","description":"Load average over the last 15 minutes","units":"","format":"0,0.[00]","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,1.47],[1679500650000,1.51],[1679500660000,1.5],[1679500670000,1.5],[1679500680000,1.49],[1679500690000,1.49],[1679500700000,1.51],[1679500710000,1.5],[1679500720000,1.5],[1679500730000,1.49],[1679500740000,1.49],[1679500750000,1.47],[1679500760000,1.45],[1679500770000,1.44],[1679500780000,1.43],[1679500790000,1.43],[1679500800000,1.43],[1679500810000,1.42],[1679500820000,1.4],[1679500830000,1.41],[1679500840000,1.41],[1679500850000,1.41],[1679500860000,1.42],[1679500870000,1.41]]}],"apm_memory":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.memory_alloc","metricAgg":"max","label":"Allocated Memory","title":"Memory","description":"Allocated memory","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,37395216],[1679500650000,41615536],[1679500660000,45549872],[1679500670000,48639824],[1679500680000,52503144],[1679500690000,55889632],[1679500700000,59721688],[1679500710000,38234784],[1679500720000,41191920],[1679500730000,45048264],[1679500740000,49664736],[1679500750000,53688584],[1679500760000,57633520],[1679500770000,61293528],[1679500780000,39092008],[1679500790000,43694136],[1679500800000,46895384],[1679500810000,50130024],[1679500820000,53510976],[1679500830000,57166128],[1679500840000,61012360],[1679500850000,39088512],[1679500860000,43863416],[1679500870000,47825208]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.rss","metricAgg":"max","label":"Process Total","title":"Memory","description":"Resident set size of memory reserved by the APM service from the OS","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,62275584],[1679500650000,62472192],[1679500660000,62685184],[1679500670000,65806336],[1679500680000,70074368],[1679500690000,73576448],[1679500700000,77508608],[1679500710000,80875520],[1679500720000,80875520],[1679500730000,80875520],[1679500740000,81080320],[1679500750000,81289216],[1679500760000,81289216],[1679500770000,81289216],[1679500780000,81502208],[1679500790000,81502208],[1679500800000,81502208],[1679500810000,81502208],[1679500820000,81502208],[1679500830000,81502208],[1679500840000,81653760],[1679500850000,81653760],[1679500860000,81653760],[1679500870000,82456576]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.gc_next","metricAgg":"max","label":"GC Next","title":"Memory","description":"Limit of allocated memory at which garbage collection will occur","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,73697880],[1679500650000,73697880],[1679500660000,73697880],[1679500670000,73697880],[1679500680000,73697880],[1679500690000,73697880],[1679500700000,73697880],[1679500710000,74066896],[1679500720000,74066896],[1679500730000,74066896],[1679500740000,74066896],[1679500750000,74066896],[1679500760000,74066896],[1679500770000,74066896],[1679500780000,73968024],[1679500790000,73968024],[1679500800000,73968024],[1679500810000,73968024],[1679500820000,73968024],[1679500830000,73968024],[1679500840000,73968024],[1679500850000,73963784],[1679500860000,73963784],[1679500870000,73963784]]}],"apm_memory_cgroup":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.cgroup.memory.mem.usage.bytes","metricAgg":"max","label":"Memory Utilization (cgroup)","title":"Memory","description":"Memory usage of the container","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,32874496],[1679500650000,33325056],[1679500660000,33345536],[1679500670000,36667392],[1679500680000,40730624],[1679500690000,44462080],[1679500700000,48246784],[1679500710000,51675136],[1679500720000,51695616],[1679500730000,51720192],[1679500740000,51822592],[1679500750000,52109312],[1679500760000,52174848],[1679500770000,52101120],[1679500780000,52178944],[1679500790000,52215808],[1679500800000,52228096],[1679500810000,52248576],[1679500820000,52264960],[1679500830000,52400128],[1679500840000,52289536],[1679500850000,52518912],[1679500860000,52428800],[1679500870000,52580352]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.cgroup.memory.mem.limit.bytes","metricAgg":"max","label":"Memory Limit","title":"Memory","description":"Memory limit of the container","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,1073741824],[1679500650000,1073741824],[1679500660000,1073741824],[1679500670000,1073741824],[1679500680000,1073741824],[1679500690000,1073741824],[1679500700000,1073741824],[1679500710000,1073741824],[1679500720000,1073741824],[1679500730000,1073741824],[1679500740000,1073741824],[1679500750000,1073741824],[1679500760000,1073741824],[1679500770000,1073741824],[1679500780000,1073741824],[1679500790000,1073741824],[1679500800000,1073741824],[1679500810000,1073741824],[1679500820000,1073741824],[1679500830000,1073741824],[1679500840000,1073741824],[1679500850000,1073741824],[1679500860000,1073741824],[1679500870000,1073741824]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.beat.memstats.gc_next","metricAgg":"max","label":"GC Next","title":"Memory","description":"Limit of allocated memory at which garbage collection will occur","units":"B","format":"0,0.0 b","hasCalculation":false,"isDerivative":false},"data":[[1679500640000,73697880],[1679500650000,73697880],[1679500660000,73697880],[1679500670000,73697880],[1679500680000,73697880],[1679500690000,73697880],[1679500700000,73697880],[1679500710000,74066896],[1679500720000,74066896],[1679500730000,74066896],[1679500740000,74066896],[1679500750000,74066896],[1679500760000,74066896],[1679500770000,74066896],[1679500780000,73968024],[1679500790000,73968024],[1679500800000,73968024],[1679500810000,73968024],[1679500820000,73968024],[1679500830000,73968024],[1679500840000,73968024],[1679500850000,73963784],[1679500860000,73963784],[1679500870000,73963784]]}],"apm_output_events_rate_success":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.total","metricAgg":"max","label":"Total","title":"Output Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,8.4],[1679500660000,8.8],[1679500670000,6.8],[1679500680000,7.7],[1679500690000,7.6],[1679500700000,8],[1679500710000,8.4],[1679500720000,6.4],[1679500730000,8.4],[1679500740000,10.5],[1679500750000,8.4],[1679500760000,8.4],[1679500770000,7.6],[1679500780000,8],[1679500790000,10],[1679500800000,6.5],[1679500810000,6.8],[1679500820000,7.2],[1679500830000,7.6],[1679500840000,8.4],[1679500850000,8],[1679500860000,10.5],[1679500870000,9.2]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.active","metricAgg":"max","label":"Active","title":"Output Active Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,null],[1679500660000,0.8],[1679500670000,0],[1679500680000,null],[1679500690000,0.4],[1679500700000,0.4],[1679500710000,0.8],[1679500720000,null],[1679500730000,0.8],[1679500740000,0.4],[1679500750000,null],[1679500760000,0],[1679500770000,null],[1679500780000,0.8],[1679500790000,null],[1679500800000,0],[1679500810000,null],[1679500820000,0],[1679500830000,1.6],[1679500840000,null],[1679500850000,null],[1679500860000,0.8],[1679500870000,null]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.acked","metricAgg":"max","label":"Acked","title":"Output Acked Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,9.2],[1679500660000,8],[1679500670000,6.8],[1679500680000,8.5],[1679500690000,7.2],[1679500700000,7.6],[1679500710000,7.6],[1679500720000,8],[1679500730000,7.6],[1679500740000,10.1],[1679500750000,9.2],[1679500760000,8.4],[1679500770000,8],[1679500780000,7.2],[1679500790000,10.4],[1679500800000,6.5],[1679500810000,7.2],[1679500820000,7.2],[1679500830000,6],[1679500840000,9.6],[1679500850000,8.4],[1679500860000,9.7],[1679500870000,10]]}],"apm_output_events_rate_failure":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.failed","metricAgg":"max","label":"Failed","title":"Output Failed Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.libbeat.output.events.dropped","metricAgg":"max","label":"Dropped","title":"Output Dropped Events Rate","description":"Events processed by the output (including retries)","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_responses_valid":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.count","metricAgg":"max","label":"Total","title":"Response Count Intake API","description":"HTTP Requests responded to by server","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.valid.ok","metricAgg":"max","label":"Ok","title":"Ok","description":"200 OK response count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.valid.accepted","metricAgg":"max","label":"Accepted","title":"Accepted","description":"HTTP Requests successfully reporting new events","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]}],"apm_responses_errors":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.toolarge","metricAgg":"max","label":"Too large","title":"Response Errors Intake API","description":"HTTP Requests rejected due to excessive payload size","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.validate","metricAgg":"max","label":"Validate","title":"Validate","description":"HTTP Requests rejected due to payload validation error","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.method","metricAgg":"max","label":"Method","title":"Method","description":"HTTP Requests rejected due to incorrect HTTP method","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.unauthorized","metricAgg":"max","label":"Unauthorized","title":"Unauthorized","description":"HTTP Requests rejected due to invalid secret token","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.ratelimit","metricAgg":"max","label":"Rate limit","title":"Rate limit","description":"HTTP Requests rejected to due excessive rate limit","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.queue","metricAgg":"max","label":"Queue","title":"Queue","description":"HTTP Requests rejected to due internal queue filling up","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.decode","metricAgg":"max","label":"Decode","title":"Decode","description":"HTTP Requests rejected to due decoding errors - invalid json, incorrect data type for entity","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.forbidden","metricAgg":"max","label":"Forbidden","title":"Forbidden","description":"Forbidden HTTP Requests rejected - CORS violation, disabled enpoint","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.concurrency","metricAgg":"max","label":"Concurrency","title":"Concurrency","description":"HTTP Requests rejected due to overall concurrency limit breach","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.closed","metricAgg":"max","label":"Closed","title":"Closed","description":"HTTP Requests rejected during server shutdown","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.response.errors.internal","metricAgg":"max","label":"Internal","title":"Internal","description":"HTTP Requests rejected due to a miscellaneous internal error","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_requests":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.server.request.count","metricAgg":"max","label":"Requested","title":"Request Count Intake API","description":"HTTP Requests received by server","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]}],"apm_transformations":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.transaction.transformations","metricAgg":"max","label":"Transaction","title":"Processed Events","description":"Transaction events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.span.transformations","metricAgg":"max","label":"Span","title":"Transformations","description":"Span events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.error.transformations","metricAgg":"max","label":"Error","title":"Transformations","description":"Error events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,1.8],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,2.5],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,1.5],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,2.5],[1679500870000,2.3]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.processor.metric.transformations","metricAgg":"max","label":"Metric","title":"Transformations","description":"Metric events processed","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,2.1],[1679500660000,2.2],[1679500670000,1.7],[1679500680000,2.3],[1679500690000,1.9],[1679500700000,2],[1679500710000,2.1],[1679500720000,1.6],[1679500730000,2.1],[1679500740000,3],[1679500750000,2.1],[1679500760000,2.1],[1679500770000,1.9],[1679500780000,2],[1679500790000,2.5],[1679500800000,2],[1679500810000,1.7],[1679500820000,1.8],[1679500830000,1.9],[1679500840000,2.1],[1679500850000,2],[1679500860000,3],[1679500870000,2.3]]}],"apm_acm_response":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.count","metricAgg":"max","label":"Count","title":"Response Count Agent Configuration Management","description":"HTTP requests responded to by APM Server","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.count","metricAgg":"max","label":"Error Count","title":"Response Error Count Agent Configuration Management","description":"HTTP errors count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.valid.ok","metricAgg":"max","label":"OK","title":"Response OK Count Agent Configuration Management","description":"200 OK response count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.valid.notmodified","metricAgg":"max","label":"Not Modified","title":"Response Not Modified Agent Configuration Management","description":"304 Not modified response count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_acm_response_errors":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.forbidden","metricAgg":"max","label":"Count","title":"Response Errors Agent Configuration Management","description":"Forbidden HTTP requests rejected count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.unauthorized","metricAgg":"max","label":"Unauthorized","title":"Response Unauthorized Errors Agent Configuration Management","description":"Unauthorized HTTP requests rejected count","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.unavailable","metricAgg":"max","label":"Unavailable","title":"Response Unavailable Errors Agent Configuration Management","description":"Unavailable HTTP response count. Possible misconfiguration or unsupported version of Kibana","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.method","metricAgg":"max","label":"Method","title":"Response Method Errors Agent Configuration Management","description":"HTTP requests rejected due to incorrect HTTP method","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]},{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.response.errors.invalidquery","metricAgg":"max","label":"Invalid Query","title":"Response Invalid Query Errors Agent Configuration Management","description":"Invalid HTTP query","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}],"apm_acm_request_count":[{"bucket_size":"10 seconds","timeRange":{"min":1679500640000,"max":1679500880000},"metric":{"app":"apm","field":"beats_stats.metrics.apm-server.acm.request.count","metricAgg":"max","label":"Count","title":"Requests Agent Configuration Management","description":"HTTP Requests received by agent configuration management","units":"/s","format":"0,0.[00]","hasCalculation":false,"isDerivative":true},"data":[[1679500640000,null],[1679500650000,0],[1679500660000,0],[1679500670000,0],[1679500680000,0],[1679500690000,0],[1679500700000,0],[1679500710000,0],[1679500720000,0],[1679500730000,0],[1679500740000,0],[1679500750000,0],[1679500760000,0],[1679500770000,0],[1679500780000,0],[1679500790000,0],[1679500800000,0],[1679500810000,0],[1679500820000,0],[1679500830000,0],[1679500840000,0],[1679500850000,0],[1679500860000,0],[1679500870000,0]]}]},"apmSummary":{"uuid":"ccf6c4d9-37bc-4dd0-bf57-2ae3ee296a39","transportAddress":"3031a4a32eea","version":"8.7.0","name":"3031a4a32eea","type":"Apm-server","output":"Elasticsearch","configReloads":null,"uptime":271879,"eventsTotal":2020,"eventsEmitted":null,"eventsDropped":null,"bytesWritten":739360,"config":{"container":false},"timeOfLastEvent":"2023-03-22T16:01:37.064Z"}} From 209b0c52cb905cc0b62db9ef9f425d1119cdc549 Mon Sep 17 00:00:00 2001 From: Kevin Qualters <56408403+kqualters-elastic@users.noreply.github.com> Date: Wed, 10 Jul 2024 09:55:02 -0400 Subject: [PATCH 33/82] [Security Solution] [Timelines] Notes table links (#187868) ## Summary This pr changes the timeline id cell to be a link to open the saved timeline a note is a part of if timelineId exists, instead of just showing the id as a plain string. Also updates the event column to a link that opens a new timeline containing just the event a note is associated with. ![image](https://github.com/elastic/kibana/assets/56408403/e1c577e6-deb6-4daf-8d94-78fcc400c041) ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) --- .../components/open_event_in_timeline.tsx | 24 ++++++ .../public/notes/components/translations.ts | 20 ++++- .../notes/pages/note_management_page.tsx | 77 +++++++++++-------- .../open_timeline/open_timeline.tsx | 2 +- .../public/timelines/links.ts | 2 - .../public/timelines/routes.tsx | 32 +------- 6 files changed, 91 insertions(+), 66 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/notes/components/open_event_in_timeline.tsx diff --git a/x-pack/plugins/security_solution/public/notes/components/open_event_in_timeline.tsx b/x-pack/plugins/security_solution/public/notes/components/open_event_in_timeline.tsx new file mode 100644 index 0000000000000..43f039836ccad --- /dev/null +++ b/x-pack/plugins/security_solution/public/notes/components/open_event_in_timeline.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React, { memo } from 'react'; +import { EuiLink } from '@elastic/eui'; +import type { EcsSecurityExtension as Ecs } from '@kbn/securitysolution-ecs'; +import { useInvestigateInTimeline } from '../../detections/components/alerts_table/timeline_actions/use_investigate_in_timeline'; +import * as i18n from './translations'; + +export const OpenEventInTimeline: React.FC<{ eventId?: string | null }> = memo(({ eventId }) => { + const ecsRowData = { event: { id: [eventId] }, _id: eventId } as Ecs; + const { investigateInTimelineAlertClick } = useInvestigateInTimeline({ ecsRowData }); + + return ( + + {i18n.VIEW_EVENT_IN_TIMELINE} + + ); +}); + +OpenEventInTimeline.displayName = 'OpenEventInTimeline'; diff --git a/x-pack/plugins/security_solution/public/notes/components/translations.ts b/x-pack/plugins/security_solution/public/notes/components/translations.ts index 471c28cbc9d4c..e952e5e4ac715 100644 --- a/x-pack/plugins/security_solution/public/notes/components/translations.ts +++ b/x-pack/plugins/security_solution/public/notes/components/translations.ts @@ -31,14 +31,14 @@ export const CREATED_BY_COLUMN = i18n.translate( export const EVENT_ID_COLUMN = i18n.translate( 'xpack.securitySolution.notes.management.eventIdColumnTitle', { - defaultMessage: 'Document ID', + defaultMessage: 'View Document', } ); export const TIMELINE_ID_COLUMN = i18n.translate( - 'xpack.securitySolution.notes.management.timelineIdColumnTitle', + 'xpack.securitySolution.notes.management.timelineColumnTitle', { - defaultMessage: 'Timeline ID', + defaultMessage: 'Timeline', } ); @@ -102,3 +102,17 @@ export const DELETE_SELECTED = i18n.translate( export const REFRESH = i18n.translate('xpack.securitySolution.notes.management.refresh', { defaultMessage: 'Refresh', }); + +export const OPEN_TIMELINE = i18n.translate( + 'xpack.securitySolution.notes.management.openTimeline', + { + defaultMessage: 'Open timeline', + } +); + +export const VIEW_EVENT_IN_TIMELINE = i18n.translate( + 'xpack.securitySolution.notes.management.viewEventInTimeline', + { + defaultMessage: 'View event in timeline', + } +); diff --git a/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx b/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx index 1c39265a1b02f..4e3f776d26027 100644 --- a/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx +++ b/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx @@ -7,7 +7,7 @@ import React, { useCallback, useMemo, useEffect } from 'react'; import type { DefaultItemAction, EuiBasicTableColumn } from '@elastic/eui'; -import { EuiBasicTable, EuiEmptyPrompt } from '@elastic/eui'; +import { EuiBasicTable, EuiEmptyPrompt, EuiLink } from '@elastic/eui'; import { useDispatch, useSelector } from 'react-redux'; // TODO unify this type from the api with the one in public/common/lib/note import type { Note } from '../../../common/api/timeline'; @@ -33,32 +33,45 @@ import { SearchRow } from '../components/search_row'; import { NotesUtilityBar } from '../components/utility_bar'; import { DeleteConfirmModal } from '../components/delete_confirm_modal'; import * as i18n from '../components/translations'; - -const columns: Array> = [ - { - field: 'created', - name: i18n.CREATED_COLUMN, - sortable: true, - render: (created: Note['created']) => , - }, - { - field: 'createdBy', - name: i18n.CREATED_BY_COLUMN, - }, - { - field: 'eventId', - name: i18n.EVENT_ID_COLUMN, - sortable: true, - }, - { - field: 'timelineId', - name: i18n.TIMELINE_ID_COLUMN, - }, - { - field: 'note', - name: i18n.NOTE_CONTENT_COLUMN, - }, -]; +import type { OpenTimelineProps } from '../../timelines/components/open_timeline/types'; +import { OpenEventInTimeline } from '../components/open_event_in_timeline'; + +const columns: ( + onOpenTimeline: OpenTimelineProps['onOpenTimeline'] +) => Array> = (onOpenTimeline) => { + return [ + { + field: 'created', + name: i18n.CREATED_COLUMN, + sortable: true, + render: (created: Note['created']) => , + }, + { + field: 'createdBy', + name: i18n.CREATED_BY_COLUMN, + }, + { + field: 'eventId', + name: i18n.EVENT_ID_COLUMN, + sortable: true, + render: (eventId: Note['eventId']) => , + }, + { + field: 'timelineId', + name: i18n.TIMELINE_ID_COLUMN, + render: (timelineId: Note['timelineId']) => + timelineId ? ( + onOpenTimeline({ timelineId, duplicate: false })}> + {i18n.OPEN_TIMELINE} + + ) : null, + }, + { + field: 'note', + name: i18n.NOTE_CONTENT_COLUMN, + }, + ]; +}; const pageSizeOptions = [50, 25, 10, 0]; @@ -67,7 +80,11 @@ const pageSizeOptions = [50, 25, 10, 0]; * This component uses the same slices of state as the notes functionality of the rest of the Security Solution applicaiton. * Therefore, changes made in this page (like fetching or deleting notes) will have an impact everywhere. */ -export const NoteManagementPage = () => { +export const NoteManagementPage = ({ + onOpenTimeline, +}: { + onOpenTimeline: OpenTimelineProps['onOpenTimeline']; +}) => { const dispatch = useDispatch(); const notes = useSelector(selectAllNotes); const pagination = useSelector(selectNotesPagination); @@ -147,13 +164,13 @@ export const NoteManagementPage = () => { }, ]; return [ - ...columns, + ...columns(onOpenTimeline), { name: 'actions', actions, }, ]; - }, [selectRowForDeletion]); + }, [selectRowForDeletion, onOpenTimeline]); const currentPagination = useMemo(() => { return { diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx index 3dc686229e4fa..015a36717475e 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/open_timeline.tsx @@ -312,7 +312,7 @@ export const OpenTimeline = React.memo( /> ) : ( - + )}
diff --git a/x-pack/plugins/security_solution/public/timelines/links.ts b/x-pack/plugins/security_solution/public/timelines/links.ts index 97667c0ce8aa3..169ef6da01910 100644 --- a/x-pack/plugins/security_solution/public/timelines/links.ts +++ b/x-pack/plugins/security_solution/public/timelines/links.ts @@ -37,8 +37,6 @@ export const links: LinkItem = { defaultMessage: 'Visualize and delete notes.', }), path: `${TIMELINES_PATH}/notes`, - skipUrlState: true, - hideTimeline: true, experimentalKey: 'securitySolutionNotesEnabled', }, ], diff --git a/x-pack/plugins/security_solution/public/timelines/routes.tsx b/x-pack/plugins/security_solution/public/timelines/routes.tsx index a7d6373007192..e7f28eb9d71e3 100644 --- a/x-pack/plugins/security_solution/public/timelines/routes.tsx +++ b/x-pack/plugins/security_solution/public/timelines/routes.tsx @@ -5,39 +5,15 @@ * 2.0. */ -import React, { memo } from 'react'; +import React from 'react'; import { TrackApplicationView } from '@kbn/usage-collection-plugin/public'; -import { Switch } from 'react-router-dom'; -import { Route } from '@kbn/shared-ux-router'; -import { SpyRoute } from '../common/utils/route/spy_routes'; -import { NotFoundPage } from '../app/404'; -import { NoteManagementPage } from '../notes/pages/note_management_page'; import { PluginTemplateWrapper } from '../common/components/plugin_template_wrapper'; import { SecurityPageName } from '../app/types'; import type { SecuritySubPluginRoutes } from '../app/types'; -import { NOTES_MANAGEMENT_PATH, TIMELINES_PATH } from '../../common/constants'; +import { TIMELINES_PATH } from '../../common/constants'; import { Timelines } from './pages'; -const NoteManagementTelemetry = () => ( - - - - - - -); - -const NoteManagementContainer = memo(() => { - return ( - - - - - ); -}); -NoteManagementContainer.displayName = 'NoteManagementContainer'; - const TimelinesRoutes = () => ( @@ -51,8 +27,4 @@ export const routes: SecuritySubPluginRoutes = [ path: TIMELINES_PATH, component: TimelinesRoutes, }, - { - path: NOTES_MANAGEMENT_PATH, - component: NoteManagementContainer, - }, ]; From ba3f83cd3dea4d084b745e55c5129ed3e12c534c Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 10 Jul 2024 16:01:06 +0200 Subject: [PATCH 34/82] [CI] Remove kme leftovers (take 2) (#187947) ## Summary Retries #187762 again. There was a partially removed step in the previous attempt, that's now fully removed. --- .buildkite/pipeline-utils/agent_images.ts | 17 ++++++- .../ci-stats/pick_test_group_run_order.ts | 25 ++-------- .buildkite/pipelines/flaky_tests/pipeline.ts | 38 ++------------- .buildkite/pipelines/on_merge.yml | 22 --------- .buildkite/pull_requests.json | 46 ------------------- .buildkite/scripts/common/vault_fns.sh | 14 ++---- catalog-info.yaml | 28 ----------- 7 files changed, 28 insertions(+), 162 deletions(-) diff --git a/.buildkite/pipeline-utils/agent_images.ts b/.buildkite/pipeline-utils/agent_images.ts index 0606f036b1c64..d139f7953e00f 100644 --- a/.buildkite/pipeline-utils/agent_images.ts +++ b/.buildkite/pipeline-utils/agent_images.ts @@ -52,4 +52,19 @@ function getAgentImageConfig({ returnYaml = false } = {}): string | AgentImageCo return config; } -export { getAgentImageConfig }; +const expandAgentQueue = (queueName: string = 'n2-4-spot') => { + const [kind, cores, addition] = queueName.split('-'); + const additionalProps = + { + spot: { preemptible: true }, + virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, + }[addition] || {}; + + return { + ...getAgentImageConfig(), + machineType: `${kind}-standard-${cores}`, + ...additionalProps, + }; +}; + +export { getAgentImageConfig, expandAgentQueue }; diff --git a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts index 20b2d366e6067..a24214b1e62b0 100644 --- a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts +++ b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts @@ -16,27 +16,10 @@ import { BuildkiteClient, BuildkiteStep } from '../buildkite'; import { CiStatsClient, TestGroupRunOrderResponse } from './client'; import DISABLED_JEST_CONFIGS from '../../disabled_jest_configs.json'; -import { getAgentImageConfig } from '#pipeline-utils'; +import { expandAgentQueue } from '#pipeline-utils'; type RunGroup = TestGroupRunOrderResponse['types'][0]; -// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized -/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ -const getAgentRule = (queueName: string = 'n2-4-spot') => { - if (process.env?.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld') { - const [kind, cores, spot] = queueName.split('-'); - return { - ...getAgentImageConfig(), - machineType: `${kind}-standard-${cores}`, - preemptible: spot === 'spot', - }; - } else { - return { - queue: queueName, - }; - } -}; - const getRequiredEnv = (name: string) => { const value = process.env[name]; if (typeof value !== 'string' || !value) { @@ -436,7 +419,7 @@ export async function pickTestGroupRunOrder() { parallelism: unit.count, timeout_in_minutes: 120, key: 'jest', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -454,7 +437,7 @@ export async function pickTestGroupRunOrder() { parallelism: integration.count, timeout_in_minutes: 120, key: 'jest-integration', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), retry: { automatic: [ { exit_status: '-1', limit: 3 }, @@ -488,7 +471,7 @@ export async function pickTestGroupRunOrder() { label: title, command: getRequiredEnv('FTR_CONFIGS_SCRIPT'), timeout_in_minutes: 90, - agents: getAgentRule(queue), + agents: expandAgentQueue(queue), env: { FTR_CONFIG_GROUP_KEY: key, ...FTR_EXTRA_ARGS, diff --git a/.buildkite/pipelines/flaky_tests/pipeline.ts b/.buildkite/pipelines/flaky_tests/pipeline.ts index 6a5b7da38a143..d77504deacb45 100644 --- a/.buildkite/pipelines/flaky_tests/pipeline.ts +++ b/.buildkite/pipelines/flaky_tests/pipeline.ts @@ -7,7 +7,7 @@ */ import { groups } from './groups.json'; -import { BuildkiteStep } from '#pipeline-utils'; +import { BuildkiteStep, expandAgentQueue } from '#pipeline-utils'; const configJson = process.env.KIBANA_FLAKY_TEST_RUNNER_CONFIG; if (!configJson) { @@ -32,34 +32,6 @@ if (Number.isNaN(concurrency)) { const BASE_JOBS = 1; const MAX_JOBS = 500; -// TODO: remove this after https://github.com/elastic/kibana-operations/issues/15 is finalized -/** This function bridges the agent targeting between gobld and kibana-buildkite agent targeting */ -const getAgentRule = (queueName: string = 'n2-4-spot') => { - if ( - process.env.BUILDKITE_AGENT_META_DATA_QUEUE === 'gobld' || - process.env.BUILDKITE_AGENT_META_DATA_PROVIDER === 'k8s' - ) { - const [kind, cores, addition] = queueName.split('-'); - const additionalProps = - { - spot: { preemptible: true }, - virt: { localSsdInterface: 'nvme', enableNestedVirtualization: true, localSsds: 1 }, - }[addition] || {}; - - return { - provider: 'gcp', - image: 'family/kibana-ubuntu-2004', - imageProject: 'elastic-images-prod', - machineType: `${kind}-standard-${cores}`, - ...additionalProps, - }; - } else { - return { - queue: queueName, - }; - } -}; - function getTestSuitesFromJson(json: string) { const fail = (errorMsg: string) => { console.error('+++ Invalid test config provided'); @@ -150,7 +122,7 @@ const pipeline = { steps.push({ command: '.buildkite/scripts/steps/build_kibana.sh', label: 'Build Kibana Distribution and Plugins', - agents: getAgentRule('c2-8'), + agents: expandAgentQueue('c2-8'), key: 'build', if: "build.env('KIBANA_BUILD_ID') == null || build.env('KIBANA_BUILD_ID') == ''", }); @@ -173,7 +145,7 @@ for (const testSuite of testSuites) { concurrency, concurrency_group: process.env.UUID, concurrency_method: 'eager', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), depends_on: 'build', timeout_in_minutes: 150, cancel_on_build_failing: true, @@ -197,7 +169,7 @@ for (const testSuite of testSuites) { steps.push({ command: `.buildkite/scripts/steps/functional/${suiteName}.sh`, label: group.name, - agents: getAgentRule(agentQueue), + agents: expandAgentQueue(agentQueue), key: `cypress-suite-${suiteIndex++}`, depends_on: 'build', timeout_in_minutes: 150, @@ -233,7 +205,7 @@ pipeline.steps.push({ pipeline.steps.push({ command: 'ts-node .buildkite/pipelines/flaky_tests/post_stats_on_pr.ts', label: 'Post results on Github pull request', - agents: getAgentRule('n2-4-spot'), + agents: expandAgentQueue('n2-4-spot'), timeout_in_minutes: 15, retry: { automatic: [{ exit_status: '-1', limit: 3 }], diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index ae6c05721ae84..4eb15c16970ef 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -16,28 +16,6 @@ steps: limit: 1 - wait - - label: 'Triggering changes-based pipelines' - branches: main - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-2 - # TODO: this can probably be deleted after the migration https://github.com/elastic/kibana-operations/issues/15 - plugins: - - chronotc/monorepo-diff#v2.0.4: - watch: - - path: - - 'versions.json' - config: - command: 'ts-node .buildkite/scripts/steps/trigger_pipeline.ts kibana-buildkite-pipelines-deploy main' - label: 'Trigger pipeline deploy' - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - machineType: n2-standard-2 - - command: .buildkite/scripts/steps/on_merge_build_and_metrics.sh label: Build Kibana Distribution and Plugins agents: diff --git a/.buildkite/pull_requests.json b/.buildkite/pull_requests.json index 0c6714d1c75b7..0758e0255247f 100644 --- a/.buildkite/pull_requests.json +++ b/.buildkite/pull_requests.json @@ -45,52 +45,6 @@ "/__snapshots__/", "\\.test\\.(ts|tsx|js|jsx)" ] - }, - { - "repoOwner": "elastic", - "repoName": "kibana", - "pipelineSlug": "kibana-kme-test", - - "enabled": true, - "allow_org_users": true, - "allowed_repo_permissions": ["admin", "write"], - "set_commit_status": true, - "commit_status_context": "kibana-ci-test", - "build_on_commit": true, - "build_on_comment": false, - "trigger_comment_regex": "^(?:(?:buildkite\\W+)?(?:build|test)\\W+(?:this|it))", - "skip_ci_labels": [], - "labels": ["kme-test"], - "skip_target_branches": ["6.8", "7.11", "7.12"], - "enable_skippable_commits": true, - "skip_ci_on_only_changed": [ - "^dev_docs/", - "^docs/", - "^rfcs/", - "^\\.github/", - "\\.md$", - "\\.mdx$", - "^api_docs/.+\\.devdocs\\.json$", - "^\\.backportrc\\.json$", - "^nav-kibana-dev\\.docnav\\.json$", - "^src/dev/prs/kibana_qa_pr_list\\.json$", - "^\\.buildkite/pull_requests\\.json$", - "^\\.catalog-info\\.yaml$" - ], - "always_require_ci_on_changed": [ - "^docs/developer/plugin-list.asciidoc$", - "^\\.github/CODEOWNERS$", - "/plugins/[^/]+/readme\\.(md|asciidoc)$" - ], - "kibana_versions_check": true, - "kibana_build_reuse": true, - "kibana_build_reuse_pipeline_slugs": ["kibana-kme-test", "kibana-on-merge"], - "kibana_build_reuse_regexes": [ - "^test/", - "^x-pack/test/", - "/__snapshots__/", - "\\.test\\.(ts|tsx|js|jsx)" - ] } ] } diff --git a/.buildkite/scripts/common/vault_fns.sh b/.buildkite/scripts/common/vault_fns.sh index c9c51b2c7bb92..fa99b214c1be6 100644 --- a/.buildkite/scripts/common/vault_fns.sh +++ b/.buildkite/scripts/common/vault_fns.sh @@ -1,17 +1,9 @@ #!/bin/bash -# TODO: rewrite after https://github.com/elastic/kibana-operations/issues/15 is done export LEGACY_VAULT_ADDR="https://secrets.elastic.co:8200" -if [[ "${VAULT_ADDR:-}" == "$LEGACY_VAULT_ADDR" ]]; then - VAULT_PATH_PREFIX="secret/kibana-issues/dev" - VAULT_KV_PREFIX="secret/kibana-issues/dev" - IS_LEGACY_VAULT_ADDR=true -else - VAULT_PATH_PREFIX="secret/ci/elastic-kibana" - VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" - IS_LEGACY_VAULT_ADDR=false -fi -export IS_LEGACY_VAULT_ADDR +export VAULT_PATH_PREFIX="secret/ci/elastic-kibana" +export VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" +export IS_LEGACY_VAULT_ADDR=false retry() { local retries=$1; shift diff --git a/catalog-info.yaml b/catalog-info.yaml index aae8fc1af81d8..4af2698ca6cca 100644 --- a/catalog-info.yaml +++ b/catalog-info.yaml @@ -97,34 +97,6 @@ spec: # yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json apiVersion: backstage.io/v1alpha1 kind: Resource -metadata: - name: buildkite-pipeline-kibana-kme-test -spec: - implementation: - apiVersion: buildkite.elastic.dev/v1 - kind: Pipeline - metadata: - description: Temporary pipeline for testing Kibana KME work - name: kibana-kme-test - spec: - pipeline_file: .buildkite/scripts/pipelines/pull_request/pipeline.sh - provider_settings: - build_branches: false - build_pull_requests: true - publish_commit_status: false - trigger_mode: none - repository: elastic/kibana - teams: - kibana-operations: - access_level: MANAGE_BUILD_AND_READ - everyone: - access_level: READ_ONLY - owner: group:kibana-operations - type: buildkite-pipeline ---- -# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json -apiVersion: backstage.io/v1alpha1 -kind: Resource metadata: name: buildkite-pipeline-kibana-sonarqube description: Run a SonarQube scan From 1f996a2e36168640068546838df6d632cc894b17 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 10 Jul 2024 17:12:23 +0300 Subject: [PATCH 35/82] fix: [Obs Synthetics > Run monitor manually][COGNITION]: Focus must be managed and a live region added to keep screen reader users informed as tests run (#187941) Closes: https://github.com/elastic/observability-dev/issues/3685 ## Description The synthetics monitors allow us to run tests manually. This process opens a new panel on the right of the existing flyout and has a text block that updates as the test progresses. We need to manage focus and add a live region to keep screen reader users informed of the test progress. Screenshot attached below. ### Steps to recreate 1. Open the [Synthetics](https://keep-serverless-fyzdg-f07c50.kb.eu-west-1.aws.qa.elastic.cloud/app/synthetics) view 2. Create a monitor if none exist 3. Click on that monitor and navigate to the [full monitor detail](https://keep-serverless-fyzdg-f07c50.kb.eu-west-1.aws.qa.elastic.cloud/app/synthetics/monitor/8b88e937-f917-4f12-9325-8ab005cffea5?locationId=us_central_qa) view 4. Turn on the screen reader of your choosing 5. Click or press "Run test manually" 6. Verify the new panel and the progress is not announced ### What was changed: 1. Added a live region for screen readers (`EuiScreenReaderLive`) to announce updated text status content. ### Screen image --- .../browser/browser_test_results.tsx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/browser/browser_test_results.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/browser/browser_test_results.tsx index 4c151880ff588..7ea35752fefac 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/browser/browser_test_results.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/browser/browser_test_results.tsx @@ -15,6 +15,7 @@ import { EuiLoadingSpinner, EuiTitle, EuiCallOut, + EuiScreenReaderLive, useEuiTheme, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -153,6 +154,13 @@ function getButtonContent({ journeyStarted, completedSteps, }: CheckGroupResult) { + const completedText = i18n.translate('xpack.synthetics.monitorManagement.stepCompleted', { + defaultMessage: '{stepCount, number} {stepCount, plural, one {step} other {steps}} completed', + values: { + stepCount: completedSteps ?? 0, + }, + }); + return (

- - {i18n.translate('xpack.synthetics.monitorManagement.stepCompleted', { - defaultMessage: - '{stepCount, number} {stepCount, plural, one {step} other {steps}} completed', - values: { - stepCount: completedSteps ?? 0, - }, - })} - + {completedText}

+ {completedText}
); From 94a639f49b7eea1ee9d1e21f92359a2e817eaef1 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 10 Jul 2024 16:12:31 +0200 Subject: [PATCH 36/82] skip failing test suite (#187932) --- .../cypress/e2e/response_actions/response_console/scan.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/scan.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/scan.cy.ts index ba105aa8cbc0a..e4faa0764a6cb 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/scan.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/scan.cy.ts @@ -20,7 +20,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/187932 +describe.skip( 'Response console', { env: { From a711dc0b21eaf7f3f00024017ebfcb008c46d792 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 10 Jul 2024 09:24:18 -0500 Subject: [PATCH 37/82] skip failing test suite (#170373) --- .../e2e/response_actions/response_console/execute.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts index 042031b301185..b8b88cbd95c34 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/execute.cy.ts @@ -21,7 +21,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/170373 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { login(); }); From 95aff78b75b3f522d9ee5090af67ba229a9222ef Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 10 Jul 2024 09:26:26 -0500 Subject: [PATCH 38/82] skip failing test suite (#168284) --- .../management/cypress/e2e/endpoint_list/endpoints.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts index 12cdfcfa6e09c..b196030cae34a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/endpoint_list/endpoints.cy.ts @@ -28,7 +28,8 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/168284 +describe.skip('Endpoints page', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; From fd81ebf83b95e03058eff39dd2414a77dd34e22f Mon Sep 17 00:00:00 2001 From: marciw <333176+marciw@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:27:23 -0400 Subject: [PATCH 39/82] [DOCS] Update ES|QL screenshots (#187905) Fixes #187416 Screenshots should match the new look and feel (pink text, uppercase commands) [Preview](https://kibana_bk_187905.docs-preview.app.elstc.co/guide/en/kibana/master/try-esql.html) --- docs/discover/images/esql-full-query.png | Bin 325711 -> 254147 bytes docs/discover/images/esql-limit.png | Bin 315936 -> 246756 bytes docs/discover/images/esql-machine-os-ram.png | Bin 294898 -> 233047 bytes docs/discover/try-esql.asciidoc | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/discover/images/esql-full-query.png b/docs/discover/images/esql-full-query.png index 1d4a37af23a607a1cf4110ab257c3f1d558582f4..e4f5faeef3cf7f10779aa6686551162b41206526 100644 GIT binary patch literal 254147 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�@Ww{b&SI`kDk_>H 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⁡ll2$BI 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ð^MiPwmfTKk%8UD(5TozcGWhFT?SlmD-1r zr%L5;O1Eq#!+BP>Kucl*|3tQ%pA_~xFAD=Ujn{JitXZyIlvu90k2;4Zn%N>x<*|uu zbJK82mqrM-!Do-;hojTkkiFMov8J&8{1lkncoQF}Fjr$o&_oCUa~Vc(?1atH1FL%) z!3b32i0WK)l}m~MB=yiB&4l+RJsnWYN=}(F$*f|EXc}j2JvM;K@AcsVq-?k`K8I-s zpj_l1GHh9186p9L^cD>-n*{Xe9r#&6gzV=S)a9G+FeJ z5V0c#)-c#|eJMPog4nat{KE0@GqUU-xNa*{@ckSEkv~T%+`Ztiiew`;;Rur3Nuo@9A5j zHKBknL9O7Hntpsth zaYEyd@;t6FMZ(A0`ri?dG%J7BKVvfNZ9DQ!eGd*+Ump`F=-7wbAnP56oC+Sxsce@U z7r3^$gJE{e)?|M+VUSC`z*nl}FHF{dp#XOq$6|ac=gg(w=+N^z2)w=0+~w$i)%+IL zB~SJZr+r;ZN$zOs{!fK!y?C#o?=}NH71>fXRu}OfY7Q$RJa7Hss3qv*EY1SYWZ}wdb3~>@vd{p<^Lp&mW zh=Zl)J!6lH2Y5>d-}XlkZKWWSKJG6xr@onMmRf9XWKH7ouwGxv{~YLaQM3Gm)ryT) zuc$qpQj#fPJn{LPh7RdLV55b##5(Y88@kj8vdXUqopZ)jkfz8=kE|q zRZ1CLHq?fqI2{)1Vz3ZKLSm(M;f+!vU#Eu<<(&KIOeArb12rEch6GF-Ua$-cO$NQb zf#IjcLc38a0O~`|{tAoBEr^2CX=f}2@5SEyhCIgR$l-(oBvGOSF&>84Q(cI;?xV@B zjfSPss%3FlcC)u2U|gcfiW~@36Uif@2f{w^)31naSo5zQvv$vhd-_u%}XueCu_)Kkk-IQ(g!j)@Bh#eV#gwH!3Tzi_5jI*U7grNzJm(|*tFVHr! zUM|#F_PiPBq&ta9YYgb3eJ|_W1y%};TF0HYgufZ2VBob^_ZIfXspdF7itVmMUu!8+ zy%2X*Cgur%Ey;FS-IRwta20LBybZ*x0?ehOKRtn zZGSZxcG_n)-FrZNLu7C18n2Pfe1-m7lif2i0v<`>aTuS|{Lsf`5^)Kw+;O=_ zkNkZ-c8)ae(Vm)wF=wOZ&ncFzpZ>3iQ=CrbTj_4;8Dp{uaHNhFiV1it0SR9JI#BxE zNqZ*fR7AJ?{O+^F)5DedWC?W(jQK)Sv0d(U-97~0?H0flXKJaYfcO;4tnhor-O5AS z8kL3I+%|v5TbwyXBm{5U?2Kn!Jn4Ve{!-p3W&?vm?T1&yaaQy+GFB3)abkI-s$hJ* zXsw9kU6$o}?5J$<2+^8SckHbOns+z{r1EifH^lW-N&QBy_qkMSuaIFAYhKnz$cgZg zba%ZlDp;ta=Qlfd&mQn8GKEqa?&ggqY1XDJZU9`=cH-@{h1>M7fo0q)P#m7ygvANO zc=ct@gIujF1q(e(_A9TR4nFufLuto@xZb2qSp!l?bj#+`9vX{+xiy&lJkM2ojW7lO z?-V2)1^Uvi`o`*&Yh0Drnx4znM~IB@ajA88TYcZ9vE||Dd4#MK`Bh#0>BX{5Zcm3F z7(5XQw-WWm3d9!Bb+P$wp(qMl^~EvB$X?knzb&#~ipZ&hm# zFDM@5`^y8WIINCw0W|*Hx_4x(QfM-1GCYfToP;@&oa4qrESt%0^x`jK2)E%`X%`Hwfx2O_ zw%B+r{ac6aI)UQd${?fI$edHF@dz$tOJ z->|DUT3X+*K8$~%ie7AREqwoMR_fCBfFhkqS#BK;B}}f37l&i`3PblPuIDvXn1F~| ztL;itDA8Wel}d+hInb$9Ov?K_4~i$Z*|?44a=wspi{p4!;Py!3G#6?~O4v25v(-=o z^9tUe)X#P$rs>#&RrH*VcKf(C0kH^-Io|Jybg!iwfdu>g2RXLWLhdMOG0@RHsle%! zC~=sJ7$^uc?V17o!!F#aE;+q~tui?!nh2Vxhq35utU-fll9m`fEU0Mu48jSGQ$j4? znllMaaUoKLPN4O?&l^HIa3ChTnbQ|+BLR%%QG{1@b%0LL z&_*Gn+aJ%M=lNQl`&uTw_5ff3L_0{aj>YR$Cp?^3_A4i&uGn>ieMP=dR#kBrQO)!pKi&YD-8_~2L-ZcTwQwzJ zG_`;`vi=5ZQf7`ZEz3@gm_FX z?!n&~L-HgE`gck2lqisY?j2#9?jsHL$Q~UX*gYOrDLc(p@HuW%Gfi~(5-Bi1t$qf) zhQqMtBPX{NXRzcCwB|WYr%qv!_sPIw)y6{rHgcv_!^i{-!9`6i8}+%cu<+*Q$NG9t z$l*f!-Dy|b?syib^LfhSNApg+W^NaA*I(VKWTDqKi;v^ad^|wE>XG}!0tuwZXR)=g z1TrdeDKw8bvcl5E8>R-JDzsSTyxH~CGM>S^fB1=zVh@-JMlIBNf*o%sDI$TpAp_JI z#6RN{9NwQ~^v@bPW)0I&|JH^IE>VI&Ao7o(KKW>YpIQyaa3;6p3AyLHHKn>Ln-!gz z$)qsB)f}{rQeu}R5m^XIz%+;kJx~oX3r}aI%N0yl2xNVw+=N7pg3n1>dce9Z5m?rT z2oT%VsMN0{S~$yeO1bOftDqR)8139;UzMsdYF*wrrFiNYn(jC9A+mCIDfq`mrm>X_ zzU#XtzW$L`XWn3b=9t%mc0`RrUymH8A_nZ7r#;2_5NG4A1^rMW&V_iYSc$K{l{n@2 z`l!Y5dVgA2?lr?HF#))IZ66?aCM>RR)j3dbhVo~Ws&1u_tH7mm2U&M6 z^;|55w?3)>H7CgVvV<-yVTs)fiB)E>(ZZm35IHM{(!vc2++FC0`Mnzo*<3I9ppVT7 zSkflzno9M(d>Xg|e%AS6EAm-JKW=h6dXw`NE?k@(w+{3L4N6*xdYR&B0&UD zb|6@Q6w~}FT-Ciw%FxHqC=(_mDV*@4MJY?!l0JGYF4^5M&Yun>V=_`7jz^CVGq`pW z7*$%;739XzTwGYLVO3ZwShvmwzi1haU7nrYoqV5{aO3s*bm;3#vXyL|uUlO9zW7Ix zLLl(!kDxq#EV@;wYXz@Bo9<{UDtlSLtnF;hA&2$LZvEk-7qKw+!50Be&!S^)A8?r z{pcduNmpPTGakV@@Ei~%q~9&mm^yac{Y+T@XxeMYkz@Vj{D{#Ts|O+1i+$f{*=IRj zl0f^5<|eU38m)@gW@qUPy%13B>b7{@mEwK@s=lh_w>uL(p)zU}GQGM*2+;aNeg|k- z=>4Bty|(vZ?WptoE zm7-yxYS=0j3Zs!U-p^<#jR-? zB(uyUJNqQ3tVWpcT?p4~uRe&C*_bqC8XY~1>=*|UU`{NPuMjztSAvToG7pV-bq>Fa zrGEbx3!uy>S}#mYR9vbQ-V(%fu*S%w5~%4zuqY>-A&gV{-GwFX$c7)hZiszw>a2dLDo>Mbi1>EVH;K%XK0O=9a$7p2evH^Q5ibPF}>P=cSWSp2HV|EUj69cXAavVcP^i5=H2cpo~EBX^<;|2?7N%BNTrG+{Jd zqEcHyO5R$Q=qz)gciK*PzWU?zmGB00P?)a)J=%VAW#@#34Ao_C$BIs~>x1@X{DE@=Nu_mUXNgadfUXJC zq4Nt1d>+Bte-kJ#-3}HupTpm5QS~2GbxFcC<{}A32(Hm4P-%KtxUh^sEw(@SAi#^w z@rh`z5+wX($fLY_F-4cfxvMIZ-SA_tnqzg$_PD<_OEUvudn7}M5_6Wt{7^uTku4#d zId0LXy8MhZzJp<9|dOTo|}JyrP%@kG+aG9y~Pv}~U5iiMqA-|p>cG-}dc*5m=> z@>KhJd=!6XrdUY}?59d`&2W9ZJPt_d%I`%5%G9eM(PA%;c;xL&Z*yNB@W)wlLs0NI zI}fD_W*%VVu#GB69o+GLl9~Jwll`GB-S1_rN;RiTNq4E+JAjH!bjDVg=eL&C$FohUoF>(N7=}y_ zl&43?%NZ&;3e|pqEx6jE)&R@`^x9mWdc%DkqWA9i^r%dI*nG#zXolV)nI&86cwXvq z+F>=f_$kPw&!j++skJ@91UG8L%L#m09RFT=#ErSFG1jJ{?@^h`KpB z(GeSenms$UBmJ02cf)U^e9IyFSX#5oWWX$7eW!{fb;HI8m352VPii19U)kne)|AxH zU^=9H;NQr4u`?#>agB)0L_#^YPWFP17*E%+44q}8iH}dHDr4hFNJ%as>G=7bzxR5F zIA_4%3C3AD39Xn<9JEVZ=gvO9K`ZTrCN9v^tmx@3c2Mgtf~z;~_x*||rgn@{N1lE{ z;g@38ZH(BUK)H{@-qVaY>48p0E{DYTJ4@D9ZsRsh`^ts^lE=%l2o%)bu7oa%{JEnR zJTPh-Kee#alg8!}orJdB^EH-vx~rSX=k?6A!ua}mAd1z2#a~J!7&rzh+@R@gt zmKY^NHQFQPgF{hpvXq-!;~*QUv6oj)X3!L+Ln2EsKJ!<-boTP+`-2k!0RHOpm{&nH zu)FNB(&5BcF_cvTkQaYxs>U*A@+4edUQ+K@S^qkJdW}-r4Np%7F+}8h$m8(XJCXas zL&=6L?W<66Hd9Pf${swK0M3|qE> z!hZttBoh-%D|k43z>aB^!jV<2Tv0=iTBkXP8EvW2y(Q1gK?=5;Raai<2C`bWl=#|1 zmkkZ&#dmlx0u2$dV2E@ZIlNB+R8CNkTdbJC2I4H%?`VSLW zLk;zhm2`n(Wm0y^qO}dSZjD(_j5}AiK3WD2^%B`#lUZip^@GGf;UHPI?B0B@!OE&` z>q@H!aUCYzAVUTG;V^ZxF`d1viZ34f_btSZVW|Z(_$ofw&$HC)w?V^6G&B{1eSPz% zNUCaI3e8x~n7jaG$6?+mPH&uvdUAX5Ms`&nsg{O-{aEE{AI+<@if=Jj* zUEXw0-2waNWF988Nvbwqxvrz4wpy8;&=+oI1FFItwfkUd=Wq>rg{95HwvMBhO=iQF z;y2p2WBfoGa{>Ljx(gBQ+80L(c_2Q%KOB$+Cefge&?CKm8A+}XEDx1HRcX>p%I*$} zQ>m9N(_51-lFrEx@cpy~<0XuneFP=G5W`;*w!53j^BIQ?Lf6`t;PFcch@t)u5xGBx z*xKZi-u7^~1rE`R z4iypdDsJ1?)YYz?!8}WQ+sde;KKsiExzK&Q9sxpo6|QGu3)iErCdjJtyrC|(8s~Ic zchQrR?P-!+leS5&Q_+(yFxkh|%ZHs#ovobYz`KJqFoZ~$k@Z04F4O3v3F3uH4P@%g zk~hhH@VjB&?6sv6?O^%4-EH*~AC((*p(>J7UYFSS19Mn-?pziHes7)nBC)<4T+M4& z*V+7BXe~u|kT6;7c;VMARsG=Zwl$txZEf5&Jzb|#n&c+DGBA5HE)X-8^;Bnx%H_Lm z2$)(RTlJW>lSyOU^dlem));?_di@q_5n`~CmTcS*U%t)5`7DT+9qswyq=Qbi?0(hZ zL%hJ*?E!ex6kiw^1tOtuj1UVi5xWi>9KNUmVgQV{qZur1Vv(jN%^#AfdGp!-oYPCe z>pMuF>}W$7tg>V^YEl>%>G0bzA(2qM+}S+`PylnJSUu9)DV?Vy*tiQQ|4NXV)+gn% zlu+vLSvBTQ3;8oM6D@o`4^MvTsSGOBjSvz;q`^zQE^>oLVwl;FKSD6J=c-d<5v3%x zF56!^4YtB`nyh_-&nH$}B?$r=-x?~zWn_V#G;M@%Ry7`cUofu(PF5zWKk(4lzpN}z zmnKE@1i)-+i^iW9=e#n4EhDyf4sh=|eapxwp)T};ysC^?UaMW(!ojIRv&LXy>uld} zEjTjy=E>s~t6K|S1jZx=!Q18Y-9D^+bgCD=Pq*foayh%6m7$|g9#uHT3NhU|pc6V5 z5=30%4XIu_TGg^5`N&w?T!}Y{J&iAG1`Wqg4mYZ0@&$4ygw?tX7&MCV1f-~)JJF?E z9glJX5@xar!G*Hv&PNL$pu6YqHVf!As@E{EWUAK12lb6&X)_E*3U*+^WuDu#za}y1 zw;KJpckCkJ74B84RbikwvwV03lk;LU+UOXGbk@-3LFJK+O(1lN(MD|2jJu3G51qbA z94=RTByg;n{^+n4d#kQYCzCXFXsh02>1}TxrWtdq3|w_Wtti{ca|y#ds;8|a{CD@C*x9MO{amJ`S5K_&h8#?@oRcZk1rXM&Jt zXklT}*tl1etgQRtdV?JtPr%cqdVZi(!Xw!cKfhFCwFEjVQkqo3=sk$nJ0Z>up%yqt zO!eK$;*A`X%wK-DS*h5ien(#T>~c{B-Wh?6`EfcZGZlLC41o1)4XmiVK<2E%JgOV zEZukZZ8I4Kx^Cma+YhiMV=M6HEvH160qqD;+_#IVR7Ikd#duj2?*!-yuJaR9MfifN zRb4K3?a&*{hj85I9y9r52XAyd8L7$d2kwpv!S^rr8q+`XO)s~kRV}xb99+V5TVo+D zz(4Y&pxhM>*lpXN*sGh0x)O>%EM8;Ms#?qySrm>f&s6A8Q8**ck(Q{ArShP(x902s z>hVZyCWUc4YP;p;x0y5Lvp7#lr}PYHV*rHR`azhC73eoWjgau7cOiiNyzXM zvZ5nNrScWpW#JMVZ-`UtfQ*F=Nk~hQD#%EdGDM}=>|pvyl;HSfQ}XA|5l|R!^nK~N z!f)@1(1=+H>@99~wj4?KI{n(7E<$3&u3o1ZO^C7gYb*Zv7&Wz5;q_VajugZHM%K^P0i_djs zO9#m=bJr;wBuNn?gDPd~tpo!;t-m>cdj7Ikdq;)&CC4f#V*lFx0Xe;4Bl3DOv6M)y z7%6ZRAoQFjf){mi#jhG(ZqdEiLt}6ROux%FK;Erax}Q7;7Au*Ng-|}y0-ixkn&Guu zMHxJw%;+5mbFTegbtta4q=@8^U|S*l1VSydC(LG zO}5kCNke{!+)n0giG@K7Z))~!h?npA`Y}%$n>ow*xWLEQnlM%FGXpI~cA8C1>QIr9 z;ihHnBb5e}6kMzjiNx>8xQuTPVwRGPM83&?e0?Qfs?BK@^@9A-oiCha-(0HSbMAPP z7xB$XX#;xurX#(A`yGRdYW~|Dus4w)te<#F9JW zw#s{(8N;PUmc9r~&&$*G`Xip04&+{vM`mtkYo@+Wh>3<~CK8iZ;?Y{&!)TbeS3NW3 z>S?n!ISrJqSxY%UMB1xF)kE6bJwEn1m?;Oqzoj1#8ZkkkK);|RUlikb7JrYm&0Hl( zMaBG-QaZa0qjC|kX*@uY#TPKh@sMV~moJJaHsNT1ELj{VnlKU;(MzWP_3P-#>nY?z ziSc@O+H%5%LbEY^Y9^t@v_urn(c#8YgPh&2E2{Y_eE*}(LTyzV-}b>>WQC^=Si5O5 z{0r61b52!zm_!A^d?Y4AL^Uq&>aR7uKi2RN$o`DkuATQMId-b>1cS`9HKe()i(A;= z(~Cpe{rbF*Gm5?Mk$cXmlPFIykoykQeo_&?uG7p_v0W~?yAe19t=E5D-=Q6KNfJJ` zH5qYxZnOd?*`E{4RH(Em2Cq7h*sI_IX|XybZJ(Qp%;_{y8V>6v>!oBRv(XeJ8?*6@ zekB#Ho1Y5c2Az_W#$NKu}c(xG4IsNDsxDe>eNP9(UqQ_0M znwsLFc2K{~$`Y>kgVi(gdOZbi!JT)Jb1@Y9+*M&mm2irUx-*$FuJiZ{N#`VB%4SkVGKvlK7jtajW4$|c9 z8_3`c9#^`g9(HSUoR;z0CesOhAG9XoGT6xVX?bu)9Kk`f>DHRLTwS3lZIE-c> zc?GO~$~u>QF{J;qsk;>$l7gVT;fA5G;Igt(vg0ZeAsRa?o;`dNaA&eawsQ;4fZ87@ zll*LLqx6E>l0^tE#HaH?zbRl=WLQ3GfW8jK=6kR{9-<77edvvyyezK5#vC zsH@^;bjRLL(GZ)6k`Pl9Ow<~ioS;=SCT|&NGGNfE+i%>m{Om|0V+3JEP8fAewW-H+ z!w5XpR@kV9UD!y5KK$>NRjuy?%fBX z)7b>_Pdjniad@>8rq%M|?53Da8$JNuNckkth62{B{nbV`~&xL6~{uy7eM)LH+E zFW2IjMIMf}%ch7lC36d*jZq2q@ot_iR+8C-wl{lL|6#M)e{%Cw03Sp_WM5XKR0wxj;rLo6 zujXhXj*XgeO@ME@e)-GkG=N^U7U-L~8q0{*P>O}}!yY_0xc~${fnllV_^8+6?cUAd zI7*7uw#y58ZQ%f`o`IhtpWI8x<7U6aCyO){C#@$``GE0oO2Mc+*otr=Vkdj5?0P#W zE_cBE8m<%fgG*3%;nlw2E>PQ88>B2JcD9_|Tds+eJ%FzA@%Auw9j!M#G94Tox5Y6P ze}hjg`~aURe|1#S2lvM9c2BQ}%V{U4XqWB}3`M6W)hngmOP4GS0>grGL&=JdxUR@0 zbN1^rzi_{@DF;oa{hU|Q*$J^4+&IqHt>DaM38b=Dq7bG0QSjYpLFaaWw)YFgo06)34p^x+N1voo4G!P{3z<1ugc9gQYqNZL(AzPx0N4Z~HVZ-1_rVuYM2W zSYGI@jfB0A;?~$!U7AL*Jnoy8`4o051_~%KQs@$LI0D_X<3wHL)lHlu>X9Cp-4v+j zfa!q8^COqA7nvfABTcCcQO-2@!Dq_m^W|8L>BlU7Hb{q71+4P>o1^eTT3*vjX5MMM zgtIEJtCGu;+`&dMg3&y*T%CA=gHAJErR7qoS%a+(&%?$&)MJgQGb{vDSMaB4%W3_> zA^dXM%pO{m(#>$o6EnFuAwJjRC9Gk^y3cO1V*AVeXvqxZ#pT2SZ)a`_WC=OWMkbiW z)}jFmZKtt}`TR`ckdqe09@wjWU(MI?5KOvr>RM(aNyw(Hu2i`%{m$vdhFp%udhMV1 zpUdr?xJ+CUC=pb|6HvocZgzT$8$G&?kC>>U@L0TlI1v%;jUVp86>62!1&}C#Kgx}7 z9LzEdybv>jUdC>*#U;WLU-LxFbm}7tG2NQooSh*ecqG14`*@pRK9qMVq668?=AaXB z7VlsoS?{q9my?JJ-L^?biF)yq{L%5#vV-zqvl;qIt`y$Jor+yNqt5zSTUu$NJ;FS@ z*$*IJEiZq7-WJ8QKpKp=ey6dhs@Sx;DEPg(;ywjLuXBC{tTWFv!s+qm-o#Qwep#^- z^1JFGrC_`c*z(j|s_bgcnDr_K~F0QB0QkHJ38R zj|r+es|Yz`ukTH!BL(>52!Ynq)wqXq{QT`;U6}d#MN?Pj>C7}ie3!e?%y-Dy=|0cT z8W|Z=pVj|V0ZJl3&LrVpmh_4HxE4kQXB^RCI$CNohT58w&C`M-m+g9J!2(`(j@EXs zZY?jtabTrrujU;H`UCK>QbB*!!^r1lH3n++VF}eE2;`-A^ZnJ0oitnD^YGre=;*lJ z7azKI6~eTetDBEhy{;B#(0`n?H#D)B8h>B@38sYo&v>+R=lyvq zKNoR#l^aOS>N+Fr<*4?FHc8!S2l_^aUpik_%V~#zN;!{_Rm^H4n#Rm(^v(v#6S1>P zuhv$Zw8zdE_>}1t*T(6pzH^1NsT-Hxs8rT}cIHUqMw%`$urOfpSxN!W)c{!HE_wC3 zv_zi)hu>Nf=nIehC+`VC)wbbN#w8VdN0Ml_4Gw<#GB6L|Op`9^t{YB2Qi^=$?`O1=$eh^4d zwAiGpvRTc@dvXL8E@YVeIs2DdJ6aGfbBj7pSb^NQASTRRQ94uIpcA3%G-~}2ulY)( zoAq;X%hlCq1fJOLmF?4?bYE4QO~=0x_G@9q*==IVq(YW3h(L3$&g1W4246#@B zvDGHhgk6jdYeY=#MBJyNrOOr4S3?bn4u*sbJ^pQH_S;)NDllEg%X z-?T#gEc8`c7@d#Wk)&;ZiRsw{TuXgRNbZ1j6MD?EbB@*SIMBmn7NW`i+vE%aO|l1? zQO7r+^nyPA9gHqnyS=w=kjLwgdG);UofMYR+&ZxkH+oQ9oShe>NOp%;CW+2{0N2~f z8N1u&*uke%->{uzzuf436T?Q8jVv+gQ!^$#GO8vcaT(5DVsn*^{m}X%4!cLl9!TBb z`FZuPh&mVI^5)Rz84v9UPW27L2ZnTQQ_%!c4JI#A<7haJV{$+UNm+papFD)zwj$M4 z4a<|O6=-W%Z>D_$%KDgip6Z$&Yu2^3W*TG?SxLRRZ63k3SaWxALtPMbZ|4vV`=l+lsS&ZQK6zY!$A81uWNC?~JXs4EOcZ$_E{^Gxv?%I~ z{ELZp3O)ne%phb26tdWT$48hotj6p?3^~cx%kkA2`(3W(n)Y-9BRSbUtwaDK=c&(Gd#oH2)L-lmtd%6@x zx#7hs$aPgio`C8o??wi1j%}?_u%q)1xJB+S89%eT^-sf`JI%FdV%f8yi^VM5<&i)W za&=_7FXR~tf3RYnTf?38o4yC?9#V90`z_PdU$dUO3w!mVTfX9IQ9HZ`JNk&FwQT4+}B2%u)(BJTNlAQkgebrZIpAzr(2cAEb z+ghmg(#bULxUoTp1jRfL$wVNR#^wsIqfiKiwOamBtN=7fYi;O__Unop{g$EKH$Dmk zevAXH*S+0#y>;DMh>O)@duSU^|*1eEdD+31^4lhqV%UUru593+|(AS_yBn4zfeY< zp@Lt{V#edzRC&>#Jeq3wC*mk0x(~;$!&B&cqo#<%9Wj;v&}N&0B=c82;8}xSDOHr! z$0;cIlc2^t1-x6-nqO4c(9rBnhE>F8s?H^2f+IET!iL^uo!1mDuaEsT5Jnb-kzCMV zg!u2PgU0+t(A|}achuV2wuU>ObDbsm?c!fBEI~t%peTKiWt=-Inn=F*>-r_bDw?WV z1-Tq_Kd9G=9?-8t+uk6f#6)=*8NU9tx-$?=2A7Z*9i~nR`4w;;6SSm=mF~DgvxM`< zmej?581Nxs3J@{q2PGlZtcr;C1~9>u5yQJOvUnm{|Jh0ZM^WR?eB_^>1!(%Z&`RO? z5bik4)@4=69H{jd1rT_x(17X~B|@;|VMeBi1p0(A3Ja#12O3)IHFO9JBK|GDdff-N z&SwLYIEdoexKGgQ^|Izt3jg`ezg5fs^b?jYNQxsI;L21{^tPtj1U*dBz7yUEDcKa|A-p=`;LkIw}^pY zK+YvT!2kcl1O4ky#1PQmIfC-!viTvNs%id-IQVxy-Ya-=uHWY(#sA*r|8sl(JmDcp z!NWUa=2K(Qu?jR%!KG5uLzSKKEaGG9vKT*iS0iI%<&cI3G6AuI z(8atdmrCx^S|-=VU=Mk9B5p*jKv@Ns;?OYxidR1^4*e(AAh9$0;GuaW;^~zq<~cX7 zvmU&}3k0ZBC&CjGoAy}iOGQdUvs5EB0h52wQgkYTHK1=MYCRJ!@FOQa=2&8HbT>9> zg&A?9p#JwY{hI98HwUiOFi<^gBEbx&*qT8 zT8vU1`pM);0-*%2{}$v*qq+XM&)dqc{622Ax=*YU7d;aeJ^;zKTE90zq z=&h%aMOcoQvX}-z5y{rD{~Y|^X8~-Segh4r@;RA{Zk2xhp>^Y(QNzv2W&GXTDBPxy zX!z=aTZtWF>$SMCS8ot%JMo)q_C}*od{#T>i^i%%^4Kuf+?p@mZlY5oogkl6=~jAk z)E~{O1n=fI>L=n^yi#<@)j8;UYyNuFW9#9yo1dYv_cX{0rIMv$Kws}SIZ9s|*OdNuHsSE}^d5~cDNq^<3Eoi~e3ernRAEv6ln)#QntW*wC z`<&z5ee}XH#GNc`sGjkCl0`AV<{cQM8n9u(ns>D~I z!B~%w;kbW>GX8y3`dI*>ge4j~|DX5tFE%T11VvN`JYmI&^uBNZb+0Mnej%WrZVGAt z^uYgZmy*PosKD68Y||j1{cqs|I8n4!(D}|N{?8CVQiS_K_9)=|KXLBw&)wg)iHIR& zYQVTNk${0oPR9^n;jJL8P?;h;aUxy$h^uk-6n{iKzvMI3Ist$;~Nv=~`k4+xV!x zHe&Q+{jWPC2Vwg|Q^=seA&6Omiav&6ioV6QCXo-u`_LcvRsL!!RNm+I)IqQ_5@lW5 zJ^H`w4#-QPnZmhaes0|h3p1%_3Og1P#sp5Lv($dMrnq8ftqbtl`7qyXBhgB>+H%r> zWy3vd^W*$EF!T&T>F-a{KW+ow4ZwBH$;lBGW~)c&tzj*o+B69g{N4T}8#rvTm*4_R^sI?p8f4mU?$8Gv6hBAlv-Ej%8L*FORW zOqtKh6{fxSo~3vZpZckzfGIN7TH2_|UMxhh?HmE~e;GkQ z)rEwFBpIxGa}_<*_Vj%bdwf7HD~VdQcSiL~JOK*uKl+ zrS2ad^jbenPfq4oCJuLXbtQwfTbvK-LnYP$FyX@7oFFEt2cO&N>0~}&P!igR{fSPe z#5lwi>untw6ZqifSilc;sH^LnyimhNU*tZf2)Z$6hvU`$#cn&0mSfT$fZA$&B=HgNA|8Yw|b(TmJB+&=L#x#GLmYMNYE`B@& z7jSaUjiljo*fD6=K4$+kGeJhE)TGztr1Nx9t7Bzlb-Z2@Yw>*+D=(9;zXZ%VP}il) zMelrl-x2`@{kroS_R$bzTyqo5C#{VKd+A(1(CBAeT{G|CFN_ z12}g8Ic9(wVYZVYW|^<`+`8G1M5o4hKdLHck@)oZ2xtw!@&1BO&2?0Ac)2FhTppKT zR3pmbQ6bN+)>L3=qDZIlXYTL+92Wk0WT$&)N^QRt^@5!;a9d-EP@z~#1+pxj1aeOz zKW2u6HZ4$Rp@gcQxeuXg^(N>4nq+C+>D| zy=*p~HC^=VaPK-X4Cp&IEtZOO*8`4cD^{WVzfir{Eads0Hcd>ATKQRl3PMi`T@jNHTKp}R@L_Mv&$&s9B3NbO?>d_Fun zYF}){VkrmTyIGR z2gvKzIL3W);PiRi0_;vF2txcf`gnu3#yx%J&wJh^P<_CeFS8(1a9`ipCTx2x)MM8{ zv^RD3P9a=v%1g0kVN1%0g_gi)qGSBWx)ES>T5EZAKfX|(U*64%e zQc409f#IKKV{P_l2ngvjU=ViLD?^FT1o-a^7TWbtw#Jjeo(&&!hQJ*}q7Wh3byi85 z>gr#4z2-VAmLDL-W^8!wFONxjZ~qi_|80`-zus|D(reo?qy4H-C^VqV(IuSxPNYWK zTSbS#k<@MdU<{T9n%|@FNXv*hgTHD$dAN!|xL_Dxfx1Ich{V1Dra_Yk0X_5|KW+|u z7VJ9c2ZF3EywtK<9wwK)A1pu4+Ckq(j}rEKAFS4;0Meag4Y2 zzqS~PX{PvMJwtvTb* z2#qZgyUY@kjtWeVTzKqdrHO@axuz!wSO@niEagW42{~%$2Rsh>0|ndJk4A74qOcbi z*o6^T3<2H!9|Q<^-N@g+S61E`PK8P~ngfeTo+tj7`E7ivpkq*fvj>$aCO@t$alqHK z7Xmh1*1UnzavSkP@JgL$o}hs5^G31nN4+MO&6&|fW~f0*1%(Mh9M|I&bf7A@onVHH zAh+~J*s$owExe6uS1n)pN>K(6m&CZ-=9yMT zq>(c)g3;tKl);$L%|Jt`0`u8Dy`no|kx zhs&E$&3{EZ|0y|QR@zC@KuXX2GZdh41)LF2u8#zPx~qM%q75}VYGoowBKJE}&>1RD z%!Nb}Z}F@9&X~&ttKefcSs5|FHhE~YG!gZ3bR3SldV>E_aPlHjv%y5@ez7G4k>ocE z)-(H#GcvN3DS7_n>@Y^loqjQGj0z#!VE5Yd!)Nq16o6q})ZuXP`FOta)P7x_6v|x) z)?IXGG&8)67O0?f*q?38*tB#Rtj8y+4+*O?>rj;aSy%X-UxX0)1_AC46akixKZm^3 zG+7H__xDAEG7JH$D3HJ;!&7r`_N8(F|SFf>B%u}j`82YS{S9S%=FXNv^itFwtAOV1ONM)daeCV z<=_Y`a{7{uHOkUN@R#9Hy-bipWj}5g0qxBtMlGHa==#$9=ey%{!_2Tn7Sjswn?jQI zlJ}Rt2;RQU_ln2TFBD3<%=OKLLqK396HN@2AVETbpN_i~rTdhERHRb$HGPJnlmBu; z0`u&#)oB1Vmy%d_hUoQ69*Jlq8p@yR&sw;kUM}tDj%&8pp5i8WOPN-zmDu$RJ6{bX(tCqtuL; zoFq(iKL*F41agB}QQ=zOL|*p4=Om}6&AQzSxevG_e@}X7BB`z)TW1BNLS`~x@w@w+ zeuu8FV#FF9Co+w@ll%N)Z$m;t!p}I(MswaA0;1na^dh#Tq$J4_hx@}jpc|J-zj)8QD&R{$Z?a} zQ?FrQBt%7x#|Uf+9q8l*r@-2EE^|MajJ5IzH5$#i-XJ!$%+FiY4-s$PUlY0NG}^m& zJ%X#-MW7d@qW4t{;F>(Cxa}gQI{#(3S_G{RKdxQGLY9T!4OaZqwRr8UsK=KxwSz2ov0Q$;@#b8M@c+}N{CHoP0H(#TGOW_VEPU; z26X1jsCiuC74eMuc(>%D5t5@9ns11HJ3Kk**lw|@4EVZK;QVfxQcCS-k%G4xw%L|5 z5x-%pgtW_1sKy7At59GRuuo%ye^el&=cWJ z1cCp0qY=Y*VgosRtC7p5>ID;r!LWQprE+5VU`q3_9eGF+Cz zgZe$^_E#1n*5DHcks*%nWGl;7nJ?5?Ia>^uA!38yTTCdVVD-vRR~HG1mfoZ31+v6wL1=@>g?AIF|2Tv*?8}I?nu+F%wK9 z^=l;#3k#MRwoQjmiVD)hPY|5WZSb#uEDua&B43v*7Gm-T)&-pQYsxutf#2AbT+xo2LeE0n@@?c#(w)bwEy`P3{8a2c%QNbaoxNyyH4DkT!U zeP!oqWp9V!uh!~q>2FbC>id59Q(zA7Va_=yd79vdt7C4nnfHwvMe+R!n|MvOT9I=- zAV^!7bEf}C*jvX{)jn(Ef`FtnNJtCP($d}1-5t^)AT8anX=y3x?(XiA?(Xi`zlD!} z&-iG`40Q?~wG6Ebp2Yvvvz^JN?!1(igJ+Nb8euKEqCqVt|H;QzPTa++mU=%DrYkk zV)(JN@Q`ZO(g=XGo>uH(G1S9kRi! z@e&W0+-9@cQ?(OMimRZL$@hoo##=81Sbamx5p3#~_|>*7-wKVI!;h{eCY02=<)d8C+?&m`k8JltM2xV9dubDOH#v3xBxaW?G@*+(aM2|{&ph+t z1mH0#)UJ^0RlKjYn;=K*uzK@m1ON-N<~{kMbK6fcJ(_S)0yo!mYrTHW_U7(Xq6dn- zu@1G?d-%`|<*h9*5GXhUaP-t0HU*So8IBwU=PXt9=>&bEU_`B7T8d0$Exuly>z9BT z8=qHJY;G`oNx~)k=ZP~wk&tG#ld=T#h7%|xy?K`|`(6goy)S1yaT+O71yL*f4bNyP z@y6AmtDT|K@nR0K(75hDCbsgD7zGCt2Q@q4Q>(t-#yg!RPlTwhGtABc^ge%C3=Y3eR4!@$J0K5bhYC#*+zJ2aUjL<(tE2EO0ct{R z17|wQB7dD#&VOPZG%*J#8X87eTQg_2FWc1XAOHK*;c+l|yk=l&`W4-{*d7|-w4a3y~cZ5|uQXP^xB4UQbs&^nb? z{l;<2p$qB>q%Hl#L)RJPA9qN!3cOCeqFy`Ttt-(|XxdXvwbltyxvYPHkQUC|lzsjb z0D%MGtar#4yHXb%G$2k}SRx;@OCy)i5)s^F#qV7ro&^ET%07j7`8Hk~arHuB; zRnZ~j^{`v-E;3nK3Pelb^#stf^G-}LCZd%tVB)T+DJ@$jE!`&F8yca0AY9SU45xo2 zrR5D8{=t@V>qJFuRaF%iHT~*d)jpup>S$9cs$K$s5txw9=Ua}{AYQVK%c+9t#^U9{ zNK)6a3_ts=QFL)4DyqHySaSdkY&}_6IK!siitOqWztaB%k=Hw{Q|r4Aj~wx3Xlrd% zj;#1cqKC)Rn=n8zz%IgQU@Mv0WEemW8B4x100aiVHwK6gk^}`ShKMdsomHaxekg9)oIwz*=6O;qmLk4a3j(T_M<{%*toa{*qVM$h`@quFVh5w!~&03X8WR1M&1DsZA^E z`yp%@d{1urWZzE~>g33=J8yy|B z-=^bnzGG%)F3c5OZTCay!qmlz|AvQn?&!M=jHKaNMF9Ohk}2R+9-oW)GnDJ|GVt4; z^qW`lm(QiBECxt8Cf}L)R?}55)!?>KU`VEA`=bD0@l-^^7AA*=*3sRn=XU=|DG^a* zee~hV(vZPPHaVc7Wy{6ueTejvY3_NKOT4q2Qw8==K)qusPr-cgPHI5K5)>N_6w2vkp)Dc&=qW zw2UhF>Wk^JNKqZ2^R&Yd4WM2>l(FoblGvPFG`kT2cAouwg@*2pAcM)YAF5fZ0HS+6 z@0d3vC!%8@iY%9B26qDblR=~TwIaXr^dji&YA*n+l%19EQ!0-rvrdzn*RPl#3irP{ z{5@>>#OC9NC;`&?wC;rYL=z4{ldli^BaH6L(Gb?P3`11oW{9TzNxsB=R^s^bo4ZQ9BImy|iVuK#Uipo!;XYm~Q8s7HFs^V)+#ULMPMNbUK15rn>(-JjZ<#V8GaoGd5U zt1F|xj_6cA+??*f8hq^Ro}z~dpDg$OLD2Hz{sQmpMDL3{*2|`ysv|yvS(+YCcBG^m z!+9h;)_rw;A)Tf>q$UsUt(szs_P@y;S#oPQ?{!E{pdYl~N5z40PBLQmBDESdbBUA1 zUn$=uP1X2Ep?~d^Xif?3w0C6HK^@SM_Iy&dL=)%(G8=$)I=~$Go{s0jZG{S9H}@!&yCMKCx&l4)t&?>xv$ zO0!N97_T~qL39DuWTy?uacdA-%a6Qipj+m(1E&B|V}fXS!tbTWv$#qI`rc)dA511y zxxv`qL&9;HQ0IiGKMeq4V0q@ysQs^A6TCCIadFjq2Q&xGk%MFf#YD_Q+-46dKAL8* zwQ@qmg}N?zIi)3B386C!*}wM!;_JD}p%j(hYCX?E;tydyq~Lcl@2p}rqQMWZhGw+h zUuKr-p29Cm6hbF+V7_%VJ8oXyh-0XEa0W7jxe5)@15XSI8-OK$Kcmt7IyH9L3eBkT z7m#NGgQlCSyg4IBVA44@VdV^)HA@h6kzAXp?ZpmQv8=X#EyG6nwYV6aMwv8*HVn+w zy?(7G2A`-FrzZ>;(H85n)Q{-E|KsF+JrMWjJLHIGx;&%24fp#ud3j73*L_R1&gPeM zwDNt}k1n55KEmJ|4qa<_#u)ugF^N#&3b{)~x%{NR^V#Ia`8kO}x^~vEGn=}bhtxss zZN_KrY{u(&U_-BOqfIw9!n}S?VYSgcRxk)C&eEUzyESo2eI>8Rel@qtKV^?1BnI3y5-*GB`g8V9{uj z`z0|KzUonSfT?oQVHTnE@m^wE3pi}hd)+pxS*PFi?%rcwy2?_5F5YIuZ?%nD9dW$3 zbJtc2RiG>khgT^T`ozV-ELi+U+@fUf8!#OnFMCXrIVLdE;;_1gsisz4nNvHp8Kaac z00GAK@ehw>xoO#1NDph&vNe%*Wy4;q*v77FgRN=%9_iB^jtgaCK897pu}~yywN$8= z6epD>kn5esmU;^FBU(!J*>{9Np|!D%_RAX}^jTPAo>0*MND$+mlu*p)_aM|xDnSIgr2*p^C^o|x)!X^qCm&ILG8?CF6HRGpI=Z@}Y$4l$vMa!xOfrLcGs;KX zGsPgZF4?6ggF%lDAeCpy)j^I`#on2$N&|6yJyA{iMJuei+zc@M%bbq^j(15yT(vqHr1!vi-)ZRyBKpdy-K))+Rz5k)@Dg zsbaoaL!o02M;@Dvvpz{_JvU}v+Yy7~V4mg93UR0mc zqA*ioKm`I5p>qaIfRA4&Qi!HCn8sA3UPbkRiUycXk7&qfsco`ah$3ayY{k9kjr7q< zu1IaMDRXMklfMD#`qI+UuzFusM&;y!j4m9^n^9kW(+~lBkqSSiHnoJEy(huLrTdid zvEDe$OsvnpuD?Sx!fY~kZy)<)VLs<6Ck>#UgR^89x~b%sEK`l3#h&Sk!2hhykt0Pg z|HESu=#Kt!*BGJ6-IE%-DY

?SE-?!yQQe9ab+fCl*Ffa{ivX(T%g48(SIWtFQsr z$?MNg;)8LxOd?-*?LxC5l)aG5~aTnPKK)AGF1HfVlCM4{o>i?L(OMIpB^Mr zqZqVM`>O!Nrd%6q5*(7C&;wx4*g4H_Mone{ZQFSQ?(KVjTTGQW)rcVR zcIk!TPW6PR>6@4*&5p?>3&W~CXdKQo$>5XV4V~z{G!lIF8RJx5LLYozAbr9X+ifc( z_hQNw^9)7S9gMyR?=5LMl>z7Rls;N3=RSopUMu&qka2~=J!C5^n|NcYfX{YH ztKo|xJz+~?Dwp%!_SknqYoHYC^#Y%MDk2q5GAi95wB zQhdW+@w3Nlay+E{9xE&tSa^|HM_krEqXt^+YBtro( z-ad|kcCwbeGu>MU7|f z_xhYJwU0H9Vs|~vtu)A2Cm8UHQ}@EkAs{kCblf)MvEL%I?afk=s>o# z(XQ;GSKL~El^ZFD_=Q-et#u;H_9gHt#RH%xnFMC()UHo(v%5g<^`o9fS0d90mcQka zw0*9R^7yxwnF{$Pb)^HANEkHL2>Ehip>BUaVWGJB$vmR6?<%z(+}&uu z%GF32kYFl*6(#jB`Zi8kJv3O1Z^$0^M(S%dv!IwR6-J_T49S8g=G4cwZ6qFB-pgft zEdK_3YeuLN7cK$th4~Rf;Y@c?HqvQb(Q;7f6o2x9y#3{lR{<>nUkZ4DlXO%ue8JuT zk+5mWKfnbU2m@+z(MCMIWv3x5_=c9&v&O(6bMO+#Qly(6*RGd}wOpS#U02VtsrN?g zlx}{O@0PpWj^_tZqvaPwsc!E(J~}shYr>QBkM7`< zAT@cM4S>|e1@%anL_Xfc^_HrWpn_#rl-CFe8nm? zA^^jJ{Z=4mzCZyz!Jl>yJ^|QX8lqC~+)dw|Niz*#Bwj6=O@`nzY+n*vL~aij6y*=B z&;&`{GVP;)R+XH@$~s`8@@qc)lwFk>AdCQ1d&=>rvxMP$1@fX&%QXREtIx1Oq2pu% z4R$QX3eXwf^1b+ss0+@jBEG55SkZ)11 zwcjr0^2L#nHj-1z6JVzm47~G%@WQfWe%(`#Oi0M9s9dP3o!Z_&?*yxqFIz2rxQB%I zD}KU*vKt5~TLT2Y0l3F@(^l-?<;W){LKpt&i<)jfx z-(jLt3~{-$cHeos(3mY~x^FieI}IjqV_u;t!43RH?D!x{oi&@?(Iw~>er*J_zWh8s z#c1Z+(mNl0yxP@U=Nl1Gf}gCgweyCjyqm9WX;?Y6OBr#I#mbqr*qfP(kB=7NHUK&7 zOy2$RuBtxct%{EN1Q}FOB8zKV^YX=pT!^F~Zh@$UY7w=>S6Q0$lhX>*5jcDfPR;@C z4|;+h-hXyLzwB-qAeVY=lw$@V&3pF2y4jR8BeyTlKtd5rZ%Dl;AUjH}xHS~*+L4%@ z*(3d{+>1C5F*R_fO84p0N4^p8A{0>8M?4E4`arkMHhN=Fo&l`U47{2lSeM@rhhdxmkps8B4s%UK8dv{GJD}X<@Q=%XvPvLu>i}vjc=hzoY0&&`25GE=!5pV*SMBGIXn0 zr+6B}O}g`3JwDbsT&EJFB{f80*&kb{sC~2n2hlJ>0He1pui>2ECNimn>sh03uP86n z?QdJhm7q#pJ-X#ac?nL>}_9bq$cB7%+&g0h5d`iPbky=h)<*xmyD`xBm z<5ozrp6V~N`9Q6n8R#!%`%KcVruXX3c(-3whNcv|%60)zg^x)X%9=_4Ia!gysA zw`_8-hc~eG`w`MwbSaGy)=mZ!?2CBzgO49!q~;tCmt++6RXPEpCbKEaxf1XPT0*rv zA=(8`6!bS#A<@wv9d3H%*xlv*CfwA>#lRlmK3^GsB_EsxtGJRIEbH0hd*n}vT$1rw zr^n^u(Sl!m9|hA`O=nAOliqSVg?KPn`dbI!cK{GzBp4t4fUx=qKDPoiewL z@QRS@>}-nqMh5@m7sZk-{+IVxJKSQ)cMf2FuBuLeL;9yuG-5!uWPG7oQE;zW_)4z> zUL}=M`OPBdwP7QDXgZKr>67iVxo5WW*qSU(^C)P(?>-)B072PB~X>D zdN=gTU|ci9D8#tsn3u-lg=(_pRCS1Qi&PS`*pn3I$<>>gmhEv&bA~r=IW@-%2nBs! z{3V7n?xSJFw_F)`sfJno#W)0Vg^>G=0YGsXB5lH5l@V}T(Khq#|;ohm!W zPl#Dx1Qqy5GNWa6&z*S&0Z4g=UVe?p2#Z$pf|6<^Dg_F zhR0W`0rC$h$|c&EoN?+^7L8}~QW+ktD`Vd;+NIROCg-wFbJl3KiUXagk5{F&?lYcN zjvG2pvW$PH3uq87zFFB$(bKU_Wyy!QbFSZPD>NvU$`n#6@RbLf!~m2Tc_NK>=~ zHZIoNcQ2-^+{BZoS#Cm>iZocTi-5+Y<-_wU`IjCV`jkRfemY5ycU={@B=hBev(9dG zzUD8)h``*XMWcUKH1lUVuT}*~tPxv>pg!}W*M-uDxQ};Nisn&83q|HRK>51wsMJ!R zm?*Pcc*0*bAIro~H1B-?E~;&=ZRVXkt#UnTotP>=SBP`(9dbUvyMg90WiyzPOW+%@$(?9KMC%@-Lu0&c&Njs*(#7V2kuI!aMzaXf$f*(c5s@kM|t zPkGL${$S=rv?#4{HTqVG2SkCfH1I*LN?5@Njgy5|1(l_fOf0yJxt_mh)Ra9M35Ag@3XnRT1HR{`npV;$kzV)qgp1`q@2;$Ye5W1B+fx(pCbyh9X~O-8Kn|K?;W?UU zXc(j?VX650;NU2}x$Vk&*Q$P18i1QF%;rB9*15K`UQgBe zTF}9(pA$MOhdE(jV^Jmxz^}UsTfawL_fqJsX7?#xcJ>u$7Y&SYki;4Sq%qML19a-$ ziiCnPHU|KJs(R3uK4(|SYNH{vT15JF8L3I{iU+{|6G0BNUCIe&T^&xmJi>m3Oo(aC zebmwBbB9GKuX?B50U~{sKp|5cON~{mQ3FInt+S4niB6`=fMsT-q#SzRGF?BO-TQ~} z!Xl%|MI_}rSHM`R*T{ke=c_+MG%O}oC2d^X0CdmgqQCbkf!9UgkNB(NU=^W1c^Elr z?H4Vk%}bi7i7aId)~FYb9$NKaNQLl+;)ECn4^j<0v<{lBR3{>=WyuC32D11!+bh%H zg9Il-L!qTc=Sdw|+g%ZF6ha-H2akbRrT|UcK*^7@dy#qL)6>WX9e@Ia#V|=~tn%>< z|IYq)MC|J#7u)y62u3-B;Wvj=Q9pNLg}NPdcv}GIVtY6iy$$Q4zw~d9Vd!&(+IeXk zbqfs|Uu!%kWT~l`6+@fI<`sXoy0XzlT$$G6ktCs8O04}*jtUVfwN#4a3g=``53)V7 zii!%23B{TiS_ZsxJ4j-+YasqBo~EXzkiVIhpV;lnUgFSq%4iFODxhtlc(#JwxSxz# z!4-n-aMSe(Rc<%R6xSkwIK{;4Yk7&D+4aNidExMIsW@z^7`b+nBWd5&iC0?Hcf4CV z1f=dyuOr!Ez+LK1y$~xN@CXR@wzjMv%3|8rz>p>3;R(9RLFS1_XI@@j-zU~YhEh14 zG~<|ZySnb~Uwspgqmf=HCuIlhJ}1EH_Tgyim79w;5&9E8>=>OEk#99#{v9NFo zX~zA8vk)QzD@7tH)>%+9`Rmlk;`xJmg>XoBqfO&A7Y01<0767{S4{<%8_ISRiZZO_0fc;c6v zrxN6vt&??7jl>2epdY`8h+pp{bhtCM0HM*%s8~sTaiR z`VtbwQ;W!x&bP+(dC^8(+p_#LiN>?%2^+Dd=MmPXnXn}wiaI`3pUZbcWD#+k(%n%4tS(3+1KI2*N-pq1Y2zxrhiuD-}FY+MM zU+top!M`IT?gMj^7Y=ON^=Z+qM%{1qp>G?TET`OB5Y#O+Fp)y|@pur=Qnryp-O%fCt>_4A@ohjm@s~IeRuPkx_I6@}t2NZZ*%z_Xy)f=l4Y#O_|nwI1o@MVjYlV0^=t`My9{-40a}jZIc}3 z!6@SC3C+NvWf)0SI4kYCU(_sYh4=YJ=j3!^5iB7y6?UeOO1dQUrY%i%jWmR-j?I!d>jxFOD7qd+ZMJtr9Bg`!!yu zM7!oB?Is_D)7^Xb2CFh+3ndy2fXZyH7I3swSr zX()3hsu!_fzZGN28pT02EDD_BK;+xd_~DlFC@OHa=Tm;AB1%&d8($NVRXypj5jV*F zXePcheyukte~&<-70ca6I~T_lnVE?L*aS!& z>gyhH)dJ;R&~Fpv%f|*~`PG>G!bhHX#T)2`K|ne0*V&7KEZLl#oIKv}#!)ohoqtkY zBQ9A=2Jt5))FbeK=CTB2W#R8k(Yv*0{r0W2`li(iJXLG!isH<$K|UfkuQHB`~T9 z^ZZbN+mCtC;Bt}#?4sZHB#sJ#f?*HMdSQ1Ig7*7YY`+m8v3mi*D!J|Sd$s=M$9Un3 zAP}>wInJ9uo8ozA{;|>j{04$u{r@@0w?lN|xFbdKO6BAzV{6!#g8y>5=WCybQ*BXm zQT$RFVsAkp%!tFks>i>I+(AM@Vvvz(kU_hb9ui$q5N-bx5ocksytcu}&d#oU=L;_B zf3D|$xkhs6LK$CEHBfJEE;X``cRN91BcDE1rhdjI=fi3AN>7A0lM!W17k5*Lq`q_( z(*L-{|KpIlBCU5qf$+FjWM}=4uGgdl0|UR!-dOB-Z7*iHoboNhu0Ba-D%V#uRJ12C zG%A^l40xk~*glq~1P^=IKM&~7{`tSw0biL&5N0|skiyuX9%*tc>j>3uT`tg&Uo%Au z-ncJefL0PF{vytpKa0>VIQe~!BnsR+hbHTu!zZ%Y%Hyd5=V4w zNH{YYMSt?Yl_cNF1)R^gJm6S5lcVD1G@D$wKYmA)RjzGp2p6DK5Gq4dB5L*dN4R<#Y*29c>ySXu`*M0QH}WmYKiVJ_^*;(E+hAG$IyFx1&^16s!t zxCG>a|8B^wy-htv{XX&ZXFg`mM_c=yynhGIr89U-5d;Y;1ev+~H z#?j7t%iTfiEt694EkMcG(u~h$NAj|pn?Y&%tIGz?#~)7l1du7u9`S#(9Kf0TL6aTo z#oT__`*sj7I}I`W+qVJ**o^!J6$i$=yIcqq2GR>$;@mSO<*#i*J>sa&jRGP?y$}& zwd%9_jO~ICY&-za4Nxf98i=o{wU(nV@jk7Jc}iw?Jpy2qqa*eZNrg0$JL>#YNvT5> z^ZdJgHprKdPnQ>iTH_i<@*z>GAtTixD zOne5w9T-f8@#o|ycL2Uo?a?uVr|Y970J^m()8|1`z!ehVVaK+40?1br7>()F%6%vI zWpYCQr)T?PlYESDS+XQTw7%~QKn`UWMoAHSYuN)n0bxU_ECb%R6&zoVvLnErc*?a6 z4cGg;gWwqAcbU!kDn$={lR;_~#?H!-(mW;LFGuZd@=riN1HWL;9<@f({jVPo?h`o?P0;z<<0~u8DfzQ; zw46LT4?ruPRDPqI!$mFSojpJ>Jzl5a>K+#3d84-;vul4D%d_Ms681(hZ(QtN`R^Y0pA|D)bQG-S`_&bdc4x;JCc$G* zc*p#fq=I@FTJxhl9UmPtP=!zEAyNamluQjras#@lEs_=P_sFzhm)NUxH(48-h}4%; zqE}JEx!Q-DKykgF5(2EfGw(UG7b`hci8gh3ix8Jf6X>>}Qy;p#+R>9e+eRw7Y`%Ef zfJAM-X*Vt6bTS&5(%|U2)u*)|i(9;#0`RSQ)*LM?o-B$09ef%!E*j>>DB_S)#g@6?^AT=rI<4I$*ONrd5F@mp zzLh(PSm?+yj8jUQw+aEjitm*NyaP3=3)P-uQFdmhCp6@U1th%2^oSqz>Oc6J^JA%x zW*c<6-+uw*&^gXV7>L~)oG0#)kF4j*B&F5LTskD_W2dim2m=@a2X>MH^)RyZRW5$3 z{(tkA#!&rnz1CZ~w}O31u(wAMw0mb}v^12GVa=L9b4%tp7v1QKK2o^?+qO#a=eOQE zpko_^gBgV>=Cs>CD8u7YbW|YE?xqUPo7l2=Fsg8SU-C|%`N<`$-18bi3eMUoUD5)QYeX+k%a=hfHqRr0ZC z3TE0R3g+!Mk>k|PvpFi)UOu7(?0YSSyJyPBRbTAv#?`xNHCqT&TeMSb4g5`plf}cY zc9!za1KhLiHuJ43h1zHBAp}K2<1-KEo9A0}WU5%>$sD>vQ^*uFcv88{yUzTIi{Tc` zcQ?H2CJI!*)&*Cst*y=oaT2P#t(~W&N@%7tqfb%jQNz}YcMWnRLM~G$VbeTMrj;}S z?-azhhBa!fI*=P2k7Hp0DJKmgPaeupT-3SC4iE1-=l$13VEGa3e}8}U5d&4Fb@9fH z_<7bnQZaa;0q@-MIZmzRZspC@4j8~9p$e~Ev__mmjJ&<|syi#*ek5ZU%~!G)_Z9P5 zSwX4V?E(;)y_Qq;jc74i1QO8#r2-NPiPV*ax)-#lXC25%8?y7tv{f{LjWjyNgQNUS zY}QM*PY=S*d0<=?J5ay3ST+X08hfWV!jHy8CPbH_u*_)X+*t|%BtZd&V@0Wij=114 zil|`FA-5u$(YAC4a|lP3nW-9z^KL5B_D-ardgHt{c_&mdFFjsZXINp$?sP*E5Afx) z&4C*CbL4wu{K88KDNCwQjKr2H)ndAHF2fGYOe8sx2;2--=*YC=<_S$SVzivknRmcB zHxFhjTCT0maVoGi8*PL=9r^)l{l*PTw%G^iy2I=KJ97VTKLV*ijX|K|%jGD^{4aqU zT>aRW6Y-m%LD-;qiloUHs@vu5r?YgoIy)oBhbI$Y41B8RVh;@%zf|@U)zbsK7U6z8 zt%mwC#H_&jG6J^Z&`=Va5;4s|*_`P{)3y2@o@AZWzSHJ>?s!RUNnEU4KrqIsvLDc3 zoFL=dtF9!16pR(deck30Fk5aE`w?i+h)D~>ZPJU0194Ane%Z}G*h$qT$r89N&zHPQ zYajpN!CfRGPw#ZR)L?g+I4Op;J(l_5@rnwN3jP(vJ>ELc>F8d>;b8U|HH(O|Y(Qof zUt34~Ir;l>K9)Q~sT|;y4Q>Lj^i6CJzj~lP7pqhN!ePbR_AbeMK-NA(`5m=tYbjOC(*Uhc zk_*mT^rDgo4du@--Q7iMX5>1#xK%g`s~zKGo8xF6)tBY_{h`~&vm3tbmdm*>#EX1X z_W@Ss>2@0Y@Fi$T+YWl(LIkq9Bud*}HSW7wJqIP%tZf*>NI+wX~ z(X~v0IxFB#danT$_l^(Dc)Drba<6w+czbtMZt1!zpj}SU*c|o$xPU84U3U^Ps<{P4 zm_Fy^8#cafw}WLSvyF18`evF~vt~dV$Bp@OeZTh?i{-o6#3@4vYBfBGUrD%39^-LE zE#_LZ8=LQp`Z%~e9zGg$ZyP6=TFMuKD4Y(sLU$D?df|1+OOjY5v7#@xsEv$6`@L_l zE_WBoEa6(#ZqK%2gGj;JwKMsa*yr1J82|dvAzV>Pc~IBZ4lImc>{o*`4nv9)^Mrwb z!d22&Oxa-hNpKwKw+dh}pA+Nd$V_Q!YC_1%1ZME2tPAL30d5Svi1y@U#0KwuQZgO2 zGv;!syW&MxLLRrB-N+t)?7Qt9+aPiUKIJ0SD4s{p7Ah|`NXxI70>uCF$bgL24RR|A zN4zfo0G5O^djMvaDo{>MJKudW+72!$4Ud2zU4LtMvl!XqbS;}{8?i#8l3qn+I-Xh? z6hF|cj#-q1L+WZAipQI+-GL?OA2x-X!FGqIB*%?;C!xp+$`9vTK!N@ z=Wu$mnh65Qx>wxvM-XsF36>8v6cmK~66vmWxc7`UsC0q4p88V=_z`uEYK<(_G=y~q&XcQ3@5M-70vklrs9>t3IkbgGvy2@ zK1DYPZfGq3usXzb*l#q8ej;NGEDXH7^;XkrxQyi!b+B-2GK4!d*c1O&)X)iKmf2{b^Yd9zm>l(Y-jvLLU*Sd@uZ=`hl9$ns<5MSw zj)Bd|g$9ncPu8dukABHopF$@$XM<(tJSf7J3VB`cdZ;3a&}qoL-F8|`+X{nY`y~OK zXuQX*LhljauEu;1lA)^V=H@;4=swqDWo3027ev`JeO|j=&$Wy+)tVD{-9BQXRHCk? zEdeiN#QzX{5AZ=g`|BzqhyBU8u|B7Dk;|(78+ah|P_MqIxVzlTg)s{)T5>m^i#g5j z?us#U8>@7w8jUmezfebl{x>%Z0Tm_QDqihY%5jmN6u+UFc0fQ*8VcTHN`NNW*Z-Yp zS(KN_ZTgMQ%PX*#)X2F9H#Iu!Ujcp#=n~l6-6d{_OsXrUNpsj9)|zz?#2u(fh@-R@ zb0Oi5*9L^fY@J4S$?mIp!I(I=WE>p*8H!S0zus(8t8A)t73lK!g>w-`r~qrur;c*M z>ni9kS1t5Z`Qc6X|F$K6paaeU4fE~e$RW^jC3eLny&KAF8Slb^AoSDcO{{|on^vee zwmri|IKHb_5XuC1Cf2j3Aqs;B!HQ?H#p(So8+|ubW4})xnayPSWQQVBPKL4eyXux$ zHlN}rclNddF}}~FZRi%_FaLe{Q21Iyztst+4JMNZ80v(5!eJC!ZHtCIr={i2hs6+ zY|F%%z5n?J=#AH8D(tQE1bsZ6R$QcVvEtbDG@A;Y6E*_)U085%y%RmqU$HW}N{ZGq z-(XYmQwmK`6z_kz!(nI(5NsrBcV{P*UjVcpFJegGS2XmumDTo>+1IztC15+p*<5hX~M|I0(nM*)ymDl7Dq->9=#7v%Yt^z^khdEl4b zC7rFn88TEfG&HI<07`#+7p1KXp>&cZN(%Wu1E~{8XffYLJ~z6sXERv|gkE$w1yW*)jxh4LCR_c9!2x`UMWy5+Z|`$ z9EhLZr~*iR+^#HIf!;L$G(vF3q){Hs5ks|(rlrkCeEmAEGy??_^YHLcDc`UUn1o9R z1w=2xLgML?xHdMGN^OYgqXV+!IZw0UHyHsCMu&;%vgc7|sl{{o(@PcX_cs5VVqoeo2A$NdIJ2No!cxOtf9A}aah5B6X7D%pX=ehj(l^ZFgon>Lh6o761N zlahAVmkb~hyVL;ZG^gW*to3pGokU2#vM&-c@^XVUc!bv)po}@L9TNodB(ft+WWpzt zwGEu8(lJ68Ag>1q69C}@C7pzuaxx3nr-%KG&-S6xI9xwel71a`O2Gn=gym{fNf>TH zd{e#C!CZD`pCDsBgpWu*XSv5vd{hg=?4a9b&N&t!%P5A>Z#_=9!>zpKlC*AEUjD z@JIc#KlvEp0maePj#QsX=(#G7`M$p0ZK)(dLav32{py|E?-9JXMOvK9%$4o|M|NUn zOJ-+3<5imNA+W0tXB;+iJxh25o3&a0rX%plI{6fOk*f%F0`geX zwQk;EDvM-vHxl4@s!f*p#StHtWs(4x_oLC-$IPoBw>rng8vAYf$nIug_r1wtVkQBP zN6YylPN(fbjTp*Ije$68oUS^6Lr^a4N zk77N+H=WXtl=4}!3&U<@7G0H;=xe_ee4aP2Zpw=wl>LQ|2)`2nuTFR%@BZnt(>K?$ ze0Mp$ztNX6Fcs@W>hk9AOF@^0=o}_XA~j95%q=oNlz{U3c-kJ&2Q8R(zuu2KJe;qg zl3P$osW9BNi*+3xku#MAm*|mFh>@=Z5VBQ!wuISU2sKu}FZ@*chEq@7TP`yrgD2H+ zMtr!W_P8Co0$4%1O+fLtx7P62LEK?Wjn$(gAc2Y&YB0HS7seM0?R}|R zFIU<+>aCfh1>erqC?nClo$im_-{=I!RNc!=fx+BV`J)BOt$`9{nkW6uae9@ObH|Vy zEO>?ZirbN(bh&cLbp-fC7YB2my7w#AD2S4FCyeB6YsV0c*2IN`A zOBs;kXj0mUKWqN%)&qc$fqr7`#w?_bnxXmZg(h>?M+vEtDfi3G zV1MpD05<=nuC7@6-a<$y3#vq^Vh+I0?v{&}*BVBFMVbl?esXUp0O0nRcS)5Noplx4 zYn;=c9?J}RrpC0J>Oar-_Q4P|xpWSD)m}WD>5t#cP59NFZJ){6-?F4COaW`+k3<^EO7_DP60!^cNv3bPpS&(_wXgGiswq!NSbyPkKC|_tb88>lZ z<#$D9xAGp$wV66e9lrk?bc@kKGBAuO@UYT&D5blxyQjIkhvdfth?O$*?Tv=iD}bmk zt2sNyXgA$QG<*rM@v~yu_xLz}_uEa0BoECb`gEx}qeF6s%M9U=od#lY1o02O53vo` zN4xvzYH>}Uva)G{jVc`^njgxNdB_V0n*84s}oJVgd5iGn8@8+0Et&*R69Kq$SP!5a|5bd9Bn%}uJ&<@P&&JtB;iYn;`|ofH zmxo3HeKN+w%PrtQ8t7C81ChgLw1dO(=v^9iF79oGW_$k{a??F>gtdYEq2}MzR(Bin zY}KIy#=7%x1E?b@83E8nK8VE}%hJFy^D0LM&sfE@4m~q-OGh17d8;uIIX7I{xh|@2 z3Fg(S0w)$f_=FiYlD6LR+Bml!%b!C@l(HXMo=jC$59XP~lasj|wty0dg<8eU4aOMx z@(!Nl?cUTr(>4vL{kxptg8e2lhgozyr{{7u6mAm^=dLJVVnCadRbJ}G_@%6)QyQmr zx*`9@C@>giF+R0{AP;PS2m+oc--)$%1K7052F4X}8~ZOKpG(fnT5spd)}7QcXAPP15D^g-0o*awb}zNuCh1wpJR;SqlsJiRGFNWuA@DUmSE1ulu}Vq!Z5-BHsh_3G?%>QlkxMgrjY&eL zFe8S7Sn8HY7$eDBAfowUje~*D$uDF%U;H*-r)0Qy)u)oBL9waVlW|>vvPC;bxyi-B z=&bk`V8y$8@j69urdk};u^2J8rKe%k@81ihyr*{0^WLx)2~B)&{d#I(pRFhX&#;-P znwtv!$Nj}^smgLXWAtvTm*AjXH7)%ZkVr8=&yaR99CK!hJSQt+A`s<7r>j8eY&s{f z=582ha(5fbdK%a?pB#G^!b7{KAoPS0V<=LRx~R@-O>$WdZE9n4uv~L?Ho9tXR$*BX zcSe!nqA5*xdfGYjmh$B=xIo|({r4;9d4*a#BXasgCX~#Z$MQ6EW_1M#zTZ4lBy82- zN5f&ElS@Z?4U{KL<tFq6(Ve-gdQSi%uYs#2&tNn5bDU)+sX>h(KEY zDm5o5pg%#MR5j2SXMxVcYVn0aGQ!2h#q_e8)~#v0lv51ozj;^N{{7ZAPg|VCWNgjo zWk6_bycFJ)PMMpWpIx@a{HkHtuL@U_Ao}wJN3gX{xpv?R;B&r_!j>|}{eSGeWmJ~y z+Acg*Pz33eknWU}?(XgmX_W2~LFq;s>F$zN8U&=f1f=VsdtZRgwf0_fy+8Jk@5dhB z7!C$L18(lC&g+chI8Ndjpuu1H^tNGkKx-f0v6nkw3AzG+44@prE*J)!wM~ zj&IF6rHKys6sXX21OC^{i=H}h#hgABCPJgD?+>9GL@M-u!dW98$@Kd_i39o@nmH;V0RP&P8Ln!sQV|e3_ynvr!4WJ2G0D*!r)%i# zRP7N#ldKYY6>hlkVF;B(L_=oX_&4mGoR;ujt?!~#dv#%j;lU&7Pb@273Cem= zOB%InLDJ1uQG)m(_@B9X^~daOQx${~M6hdDlhSWf~+wCPc#Q(P#b!_+R z$wE-0-@sA4GiSGdgJ5A*Rm)K>+-uWVH>9>z9f*Jgj^bo`%H5;@4bR}|mb!#x7-~f+ zGO46|GCELVtPy&vyLoP6KL&b4o+Dt@Hd&JJo#ia!y zGPiKebIEbYsU@$ry7{cslb+q^Y9Hdp9KllFvEHv;pSAyFd-@YQ>B}X^AxQR1W-A8c zvk5ehY&5$0*TlVtbBX`rr;P_WpeCe_v6{TT@DzA$Ks;fFx%CJH)qS@Ze}+eY=d_cUey6CBNI%bUZB z_Muvf9LL=n3uF7(QTiz2LaEG8>=r2!e|=BnUdf8<(VXSJ`iS^~3mB`+LMzhUJPi6z zR<`R5qn3Zwp>YBe(WjZL73LViS83*4itOHOqkLs`1A@*i8qm9p|}OaVWg!Yo43sa4elniOnYnPJDjAEeq8Tf^Dz-{I0kM9e_U6USg?Nl) z^q%s2Aac|=UzQVXylrDO3J2;2H3=*!oL+e&y3NRmobuae_b9r*9_C5%We4s|dx@R9 zFSHO|y}N`kv<>E5h({k%f5so2_rk|z($61hm@YR9+tEG@h*XftF4d*gJ)1>L%ruPR z#XjnxW{DgU+}3K<*~uVJVaFt3(WN>2e))?+Wd=8D6LMzZl!Q~(}dZiUXJ=kD$I3@$&J0hv$>dnN~2aq568itdC^#k6Eka7S6 zxlIWK2S?W+oztIv(6uN;zn(Z6zreST+XeoiMa;RcgZ>e+RIJyf+3-(#m7dQ$-1SW= zHPub2`Gt)vL#cBW;{aKrI6tqrx@t+;HIJ1A7<^_w%2`Xp9XJ^+fYn!yB+7f+P}Ko zxd_?#kqEz;XlXcDn^|*pj-|30Y1L6`{3lvkkFViMiwhr4o%V4h1z;1dxE8E%hkgEq1Y3IMeaZ^_9_r8cW$B8*wh@BpG8V zfAWBt96tMo0W}u$eS3aw;V&V7`OzF^9zTonIlL@==V`e8#SWg@pnH7ID_DpB)ORqUAE$r!{Axr3?RO+tpAMaqrNY^X}d_+Vp03qUnZv-+A& zC8JaN%;MUx!EE2z`4(hV1UF_*@vKx`(x7vtK?qiYX=1UkBCZ?N*HZ+>^-DyKv}p%!Wl+WmiqPGyf#)DT%}Bb?1&YW4#&; zLfnyP){)L)H_t)+cRFX2nkDrjlZR@m%@5IoJlWocwbC`7>2ps%U3TijGP*(xU0AY` z0vo+@+!L!{R?#+=l;VV7L#;EeZvX%y5d%qV*2`-MQ>cdUIO`dW}PzE?YiBn`S?Keo={w# zT(y_@)Jx>kW-=W3nB>FM!49Ws+Z93|%(jg-@qF%rHll@06PWCXL564dM!gW_wl39A ztx43J^}3gJ{alfRGx8g%kmJ?a`2Ny$47GBhd`4Xpxj4=4Z2c}MGOYB(6e(VelK4xU zuSZ14g8q}S!+SBU?#%IBL_r4J?uQhhdBkLeG1L5~KgGuI4JZ;ldNIB)UMMp!cG5xCBJ+cjfh!S{u#wI8w#vWJznLNr z;tBN+yf#<%e|UJ|V}t+%&4dev5Qodg$a9CKd=-z$Urur+kER_3_5k5Wi5%c4%?{?s zc+$3LbFAp&PAg3BuDI|HD5-&SDZ_V0uYTVE%058eucrb2`79vJlKMm(>PvuX)?1Q7 zC|OrNqQ8qE$25BbgNEh@{xZo5Up+^tRf{mcYp@i=&>6diAzgfK^1At|Nxr>@wY6**XEb8H?pf82f)-Qx_P3+IU2JfTKS2wB&|zC)J<6!BX!V*IXq{W*Pib4DU?iub#Kq>U}+ z*QNao+>YPlD^yE#VnXPQspW%q3b?Y#B?a7ET)LYG3O^VlHEL+%7@c!^jqbfCx33ssE^*dba|yL|yBQ`Qtx?l>5c|dv$L2))FvLZyVhDKm3`V z-{JS~T;tuCu^ylhBG?r?r?_34+d$<%zl4(W5w-2_uoM6Gr2q3Nd@cG=Vt%i_7n!8} z(*y25dzAw6&YktE!C3$BfZwwafJ}h=lc6TThv+|FT><`>7L<##IFcE-XCeV3sjfhJR|Kv9ETE>*SL6zxo5c4Au4zs)4 zC_~ZScqaU9C)LTMCR?=f(b=BR&!2&v5gzW{c$E<@=f!>-(PrX-rzC-VA~FA8K1vj6 z*W@$2)5<*e` z`$pw!nFAHbi3_}Rum8Tq2=uDJ9xGUXh5X;Q7}S^tCO~@3okSX#oYLhX8}!?74k?bpcAu7)O1Rlk6ZKg@#2tq}|zETr?Z} z!u$`$XiL3?l8me)54f%-0&`)SL?eEq!bph-Ifd|2 zl$j<`+1>v%kUoCUYS`5J#2WXzKOF6W*9~fC82-4Z>2!6-wXs4^IcHrG9kl_e2i=D; zc);T^4xxG4-?5Gj_ou4zx2Xl~U~g*@>meD_ck`4dqPNmhb#aV8;^Z_KxdMmzol>(J zgidvkqs{T<|2xbAlZn*eEoR|xhg0nivp`gzAo&Im(!4%q#wqimbFB}4_=o$Vfe+km z^hl|acW8=N>E6;1d~7Xy`^so-Ev-uIM6_Gt4B3MyETfz2N8=^)g{mdi)t2f}Sb={K zBLI*AXbDLi4#$v{pwFLA4pw@1H#OU)>pygtwY3SQf-3V+7B!o-)=5`XPN~!9NYbmM zq{uq){84?I*@k$!>Kx|9bggPR#qyuKL~>%I+1sq`m7$O^GiM40oJ8S<{q_4eg`Y!(zBo!{ z*&LP}@Y0#jUBvOYIA(N}5dfeC7K=I165#ONEqeTe{ySK7y3CTwTub4Jy}i9hPY^E8 zH^*k(u3xab>n(MJ{M6Y`^$L|qh3FTZ!vqGU>aZ z|2eEMKgT`iRw6v(_v3h*v+2|}M&9tKTr&<~zwsh+5FVdLWi|r67xUuu^i!~26XakZ z?uAzZA;a+20B?0}Mr`QjP*#v(rwrqH^7?Fr<|aTu2r~@(Wa38}`Ma{!?{^*n<;9UF zBM2VN`c(lr0gh|qx?UHT2lP9AyiTcPBSx6B_kgK1E=a7I=AbcFln?RDHZ)q`Vz3)zu1v?<%+niFQa9| zgurf&d%cb}WH1l^6bF2A;*4~uYA%oS!jU*?MF~#x!CH`LKjZIwVOw18;56U~pjz(& zZq#d?)zv1J`jdHoe9N{Z)RFaI^90PGoC6+Jmc9h$o^Zk|-Wyy_uf?BiI8BH!uXqhR zj8w;0vt!lf=0hWQ}7sJjI zOj-@HRHxljkMa6lR(jCY&i8FFHq_(C`7~mH5p{90yYkcEbYk@#;uHe@OOK78Y>`Z?UrG>KAd39GV zte_qa!g1+jj+c@ct!)HnR_b4Di|lo5+2=h@G8~#as#X-z zGbOPeBb-9xMlYq^5wjh7O|bRH0bc;HQoZ(emp6FguUJ#q*_VXJMx6mX=g&GSz)-KWGr$ZItviqhBYLEU@_i% zKu839RZCQidotfnS6c?}3i$Zk0vS@c>j8V^7RbQi6xt_}#OXxXWY;$W)ae!Qw#SMp zdVISiT?#Wb$3ydZb{q-J_2~e+9EC(g_b2X&hP=Ei5XmM!icAP}8zE!Stj5~OXe-fa zOn@~VtR)G9w8|zfw}s+YUfDEKlIJ*XYxF`P=fxStz*+?GR?QE2Ub*Jce6Uxr_9N+* zh@~N1X}&&B#dA!gyN%6`>Ge2jY;LZy1AaRT&EDPMhuu1YDUat}rjPeJ@!9&~Ih)Ov z{HN@^m|pkA7~=yV{Kob+?RcH*kw*Qo_Ok47s;35h)D=)sA1`v#&ER>4&jGSM9U?IS z2zc1cMwL#4B_+)|<>sSxz#b@ieV5GT@!)Yk=zC0d!eh?v4UJHp)8lCix_aB4^y6 ze4iR25*{9t{tN|snbzdc`EU?=&}{V2W7<}~$7hjVUq|hcno*kaMJ^~M8SvO$x%S3r zi^%q&C0l!%ujh+&;}@F7B4Ok`C=`~z%(57bzZL(h>modjz~aRg%(DhMePel=j3PyF z85YoCp12^Z+leErbRW#jq34%%r-IaVP@yL2Zk0#~Hkb1nR+Lqw!gFNgGLt^nj|2cS z0Z$Rs;c#HG72>&`1$&-i)D`}9prlqRzxMLdgz22MTO*W{5JdOqljw%zL0!zI%1ggu z7bgi@y-3B!8q_lYs;d0cCn=<|pR~n1*te#n<%qa;Mq#ULRqw(=UM zP@-tI-}n*Xr8I6d)rQ}EL%D)VE|V|R6+`X+n*CsPAm@4}rg=w6@@imjPwYxkIW(BL zGWrP>xl|HlRoAWZF@(JfK-xrvgsM#S8<48U$eMh)+}UiG7YJKBx`<|Vy&CI8!;15> zF10yKzKbfv8e?!c1kP4-bC4YmjK64nyz!{#3rMt|I{#d&bJ$$lr2Nex_ZGedX#fDg zQVI&vUP=BT6>wyhb>G}$GzLvRz=0?5C21;|Z za2UaOao2@Vz4-1wbefh}>)qKM=cKML{hf@bR8N;W^OIOCs+n>IpynFl0r)^W%-;Q5_Jx6SR8-6$&wcYrK@GysrtjFaq#_ zh)#PTdJJ}a!T#Ey;AG|@5D47x=@SgNHk+x9z^yy9mk$a=H%y(1TA?v2|A4XlF4X@E z=C5WFxS<-SFwpVnSKlUOYOwp|K67_y7jv|T%~)Ja)%R4K6Vn(f`rdr(a=*g_2b_GR zJQ93mF^GssS+2EgGS}B-m4bJV5A(DyVnF#2kH_8la6%jfNRPX)~x?Ew^+cn*iyBnnw_r6P@XcR$b^DL1)hbIfDZT{0+?Oi^u;Len9`d{hGC zs8h<&rA?@>EW9cP7Q>mY83hfuP)5m4r;4Ct+{0mS;d&}TJ6~t{^}w}MPn9kZo|D0w zMAfmdDfl+r$1o;VdAwUQh~Xbd@9e$=>%y8FJTM0(acy#W+Wq>G0jK5cOxkH(gkB@- zc57R3xP4h3GOeHjNFN^M$DC~Qk`%agC#@skO~p~G2A<(RB^tiXx`@fOuz$s1{^QUG zL3R1It@OkXYZnoDtU#36U4I&FZHxl)Yj|^R7TH3>;%6E4LcV0`0{Lz!8q?S%RE}^k8CYQpZ zZ7v=Xs06iyp~6YG-dK;KU$UKU*tf}+2T&-tLKxvlo%eZ;QXy{|F?S96W-WOH?FMIY z&ll{rQl35Y>5=5M?q}uEfGR-E3ksD~yhRs`8b0~CvRhM_Q$&NY{xQOJ9U(ZB>{#o| zrO1Y_zbB9*W3#wt$Y-!g`&0eGaT9i^bUn(41m{P~rm_~cfBnN2CDG=45v~f*Cvq=d zJhdF7t(OkQ=M^uiU^Y2qxS|piUzcKh5C7~L?zw$$2uf4Ck>+mZp`6#wyw`5(%^6Cb z+11>13^h*91Ec-i*uKObsfdAJ{ioL#RRt;@U(A+jj&ur$w@C@hTn<=iM`r7ta-^6t zqeT$#*A^p03u>(N`!rg22tadO={N6R9xN#|1_rwmQTlzq14b0;Y~nnx09=J9nS0dK=2=t@Nj78rH-CS>XE>}P zJdoJ8(#ed20Ibq>s944Bc05yxyp*YxW!t_pTi?bl4}pL8_(-$Pxv9FOmL`D3d_?XD z`4TvtRf@j`bV-ck>8Eq$1&fBNp>L!1(A4lxyG_$W?#ob}Su*&H_R*P0nOv4)%`Y?j zyDPO1^rNnF>8AI$GzJ(62XqQ%(O}*L>_f z8uR1rHl-lLzE3;rkr1$lEw;krM_A|rLadoFnv(?MzF6%=pnm}?=5c1S{CLW1QR$R*1)-NVNKqTx+j2ja& z`I?FQz?CeU{AqPW&dbN}*o1w+CY-Hhl&ufv$nK$y@(nTAu&@+LWo?T!yPez^mC@uq z=P>fVj9%4P=H%cw7IYUB$KYhyr)&<4n@F86ypc)h(JWEOdWQI;?IdQQHYv3+E4nhU z@C0A9Y~M{qSzuqL_^3a@>+@-+cCGu`iAC9-;s|12UK;xiGV z^{R8$nCTd~+mfF!OY6gMzB|SJt~gDEwKQElsp=1h9;En5eR}HLOXxy%P}|&$My2eY zXF5ovFj0T93#9qPKhF$jg=guh>H-jsf-IRtNi5w}zD8A?G4w~FV}@4%UQ9MWh5T{r zao>H6BNp|roOGf$Mu)@s6hB@Y+sPY5X3fWmHd#%wB|GpqO~^Gq4lLcstW+D_nUuq$ z7a;)6!ukb09=$QTO6WwXI7F6}nAlj-un#4qzq^ZQ?Swlh*2m`;NaOeWt+dSxYhb-iY(cza`MX%pX! z6lqIdw_IO^X)9!GN2h!;r33}jEL=AId@V_y*AWg>%kjf`!zSIS*&pj%rM~aySa71b zR zhHN&hDav-c>j${Db%}|IQl{Z-mIKKq8^TGG2-(=}x+k+vyxsiqE%HUKF{c`&wpuAE zFQ^2DvqKKmk@BLM-(AwEF$kj)Lc{%1z4}`|vzS-S8xtT;v<7O!Wyz4$dj>Z`YfmPvFgpya65JXdNeI8!oR zldAb}bFB>3+y{=AcfK|x?>Dl~M+mknY9E5u;EvB>FXR>YT?sV#&K!xR*q`C8dV=`k z(ivi(7nkK%=eV85OG>$71Y2*=o`BDGO@xQTX5yDXoER;WZ?B7nTwz-;IbL&ob*@y;}Sh9dR`!l{E zJ+sBJzC_*|NMh3HXF*OYYd`t$wlGN)!pLtC!)#WJZ6i$}ML~HBm4W5;iek6Jm^7Cu zuD70b@@HvF@#x;&t8?&okz}+J2K@2jqrj1_d}~!YU6(P2uLNa*s zX3vY|1fS$rpt#w=q;GpUY=zM2TEF)HJr z(}&QoZSVy)^wZVdk}f4xdS4aPlO&v5@dE}@@h|Asl4}wRIv68VSrI-Spw|zJJXYtT z7JNK8uZgeT!)84rR|QQ-^=JWf z$y1wbW7n6Hz5*Z_?^;o|`1El`iPOCGTywL&Al#Lz>6!jsI$U`Ua^Wj7%Ej&nf^Sr$<1a3i1K@9ZIuJLwCQLy!t^5Hlwh($xYYn zpmliQaDiwX3TdFlOXH|d>%%WQHyf3!a9^k%ybz6uCD!OIe4FRNBt`e&8x&cc;%3xit1jDJMcEMrgf z$7C2HS%iEvvGpO+BTQR~)l9GFHHD;RNy&zq=9^D*J8l}K2oz=}{GS{e4Jfe7l?i-d zt=r}>4%rGL!?rGSM`E%V)5>59c(y^_i=CSRsrV!tG0BuOQlL7X`<(vX|L1E_co5H8 zXV8whTj?$-6Yce08AIqgFJ>T!)4{SN3b&OqLxYOzvx z2g3SLw;^t|M`Y_wo7rf0B8{{Wr&TNY|vu@ev;@UA|RnBygKwZj6=-f zp=emL+=W`Djm@W@W~;iJDLYy6jT-39k)Dooqu`=1)G_?THJdXYQ25Jel`ZIwyB$i< z5{x8T+Z%jWt0$m^>)KF0*`058J?c4!pYOp|XJip_M5?miwZBuId5opn{ z-_O|x_=Sf^x99+ZKDbg*v4rOKXZQcre^77&BmT->qDn6D{lv1lCA&Xj( zoM5b%uiiU-D9cU#kD@MtG8~C<7!nF$-uc+D%N^=r8Ya_6=mXzOlLz&JRtuu;jLm% zO^g3jihhqCc*c1WK!Q|pbUVG`U!VQQcX}TIE<&=>H0XaQ=z|9diRIU6+u!Ln{08LQ zjpyIK&;Wpr!AA_M-v;cTeu_XDgyZ7MH9`IV9mM19O$w^UG=u51zg_P8*!|Yg|JQe! zRKSnQ+i)CI|F;*opOL?33#n8HpgBl2D(?_n|N8jfzw=Qd1<6I_SvrpYY51`)0P!Id zRQ+!+@UK_7|1LZqpqw)Er-g4tP5&Fhqy+`Mb*$;&|1^sVF`#s% z*yL|-U%MV{!Rwo&i{=`jS^!~)nnR}QT9qdEKE=J20p z&N~Av1=Q0}z~tpZ^bvO`*5bFTcaQbnnLh(|Z3OwS#}$Ij;i2$rJrD z9Q=p-_J3|*uq02=0P4+~Et&9lg8v_ewLo!;di#HGa=Z&No<+a?T`wGieh6&2-LEYm zZy_ikkdcu=i(On%VHb)!+1StkFtW?NiR0;Z_esD1-BwIgcq>Xt1#_Q-HQgtz!XG}o zer?mG3={}cAC608OKzPXlq_{#S)nw5DBZ!l**r?_ZwA`GZ8)9UznBDcPHEE~-7hDJ z^1`ZgvsRtGdb-lTv`sKEgM5MWKUMf2g1Pk|Ce0v1KZS96%W{|~e7-^R5i?wwV(wQl_b z^Y%lZN(umczlrb)T^AiI6Xd+=&5Q;bAne*IZ4&2NNJTg(5)Z)@jFJ>G%!2WU9Q>~t z50|)wg$&_{*4&*j01E*W)bshKN9Q}BH}_USR%#5ru8OXiHsJRb*rsp68O*NlCj&WP z;n#p4gpWx9X{-h(1XNfUglaLwL@87TWiX~N}20TRV)3F z>}3}aY%S5P*J=f9AOIo z*^en`XuPi7d8$w0U&8j^y6(V50*i7`^Xb9eqD;JR35>DG!e^bqYoim1Axf@wqR*Xg ziLlLE2oEpT<`7^%F#qc>tZH!~ex>XdmX+Os>vtmY%|CMWujXBH-k-7J{;~R+PjSyy z*GA0j=(Ot65hp6&UV#o5*xclVsr|B7M*VGvvk4Wf9ri z66e!BUR3gdaKDi29{}@xygAJc)J@NO+Tuv{EB04)$z>A_?Ryp;G)`4|l3NRy9>iL~ z#kpIJs5NelHX6F`HW}H2604Gv5nx@CdKohMp7qGC(sDUoW}dM=IoVbMauIPPJ|e+M zdWW1$rMf4MR+{a?41g?xpUiVm!L<7DXV8IbvIbMOS7B(eTBCLE*nC!l{;aA}LyzAeoFHeP;_U|58yo7O zo;^>KMB5bizU_)-kDNv*g!z2zck^m*11LRcew}b{eh>7hPjOJ{nwTiPw8|0}JQD5t z6B84)N<9Yxzlt(7Yvj+0cV;8Z1)V|TwENC0;nEL*CeH?&-Y2A=qg7EcF{39h zr}4R5aVs3ggGMU5qdLSO_*~8l+e=|&Bb7G8v6FoJ@`@pRh+x(;U(ea6OX{2^!HX%mDbn45`__PIUcvRI3*eag&!`f z4d<%s$2!FtjXaju<7-=Lb6+cbIJpF>t*75V`7~+Qdh=R4*Rb>0+}3(diF?|V+grne zn@Y7%E5pR_$Ec#Lhl^W1CS{%mXOfK5K#@vS`H1;QT`@VCF9SDNc-yh>uczVO zW}p?t%McvV-`%RbKSPmF!_4wO6F#=(71H={Wwr^zRtM;4=P&gSRh9FVG%%hQEB~mW z9{a9c+VyouTXkGRgY)mcCSrVVLF->{sp%R?Az}YGnlsiOp9hbA(Vw~k4vMDJ*75O< z!q;wjsq>?BF@3l23kqhNGw8McGhCm?UU$X*%BfnXpTmn{O;r=1bZ3 z%Y?#Vx}Sl0mERejezJM)IC_p(f8w}3m8UUErQRdI`DWWSz0}u!XT-W~j}LjbQr5=C z*`@`X*~(Q7NMM4FniIxE9b}}l0$*!h*LZr2YTLk}{kR^5$Se8X_4$`F4y@4KD) zO3+Gh^y~+-nTum|RaMoZN;nWFm~C_$$1Mb{#>|$>W5TzldpAc#l^8k$DWZP&ila&8 zv$YNUU^hBFE~&u<2WDb6k7g~(4=QSC!U6}>i;l1%Yl zm6m{_=d{G*QVzc(6@aNI=nA-=33$dC4F*SM3ppWU;skgGbm)qh*zU*Ofe0 z+}j_iw}F1-z8@X|8`2NZqW#-1f9U~>IYJyZk@_(+E{7?p^(Lb4Z06yZN+Y0)B6?g% zVzs2WIKQ;}rHfYnRXSUzSZmg|2;$BkMRwyl&g3^H-Q~y04H{LOLxrQANT8P)_zO$M_6xhHj+Dtbk*B{c1m8n{Br!?1msSw0%MG`Ym=h;^8hSdLnOaKN(@WYJ zekzqhirtUpFx>XU`~Dh@gmE2#@25?r4)aSVKQpwn6sK9hwppV{uk=p$UbL7JK6?hb zqeYD4sEN>_9tz3PREbCVx{ zo-*JcLx{H{x#+ObTeQEom=Iqay3j^=4lGedN5m3&TYki*?MX@_MJk8G)YmzL_ki-h zq?Il8e7`P8Z!A6M@^Wj^?ktM}uJtLaQs@h&^-hm6g(vP$;vr{+(aT0z3JI;*2K(`zTGr(U2uIk#$~ znOVhhQYz}5XBmFo*iim9uq}+Jk!IaEpLNMJkhS1=`>Z49r6!$vx-=K}sOa=xvD>j; zpC7dmy|==}-6CDZad{mLfNrdI#}CmuLSN_-fBmV^qkgQ;UXT0Fa>mTGtgVOd*H=>9UpX}rR{JJ#8D?Dp2A$T($Epgv6oAuRzP{w`^?f*I3b`QA4*gMeqb!&$JNNz9N_E zZXA651boyVetCe?@(BjAr+R)}UpxF-DD~Zw(1j4}6+b`TH^o}r>LW`<=qW@)vO;zk z(sliYzV909oH|}eHL!uUwD54)B(6FG!69iDX@o~|wq}`BoG_4340@gK;e=a)e{S@& zS3V!31S3qRimVmqn*>Xj9y~~EN?=2!BX%Y8eJ9-2CTE|kKATl-s~gova(uYX)b$JA z>dE23*QKZwhv%b})>mZivYp}lkFG}C;dZ)-j2F%NzS6bAL&w)$oIimX*EFNc978(O z5P60eP8CCo3o3t^GV4G1V`#K*KEKw6_>^5B+Ml-Js2~;gbFVIMycHu1UN7 zSDeak+9oSA#FzXbKD%*FNO20`rY;3#D@)DSWYtKHJ2Qh5Wm~d;PXn4yuj)0%Q(C{4 z$ZDI-xL`}v3=vtBx3OgJgFCFBUR}XkvP4Z-jH5n!r=-r7l#ClOHqB>TzU8>Eu&AyN zH&`TE6UKrEH%E1haqQBfXf*h3Qqyp(L>H&(wWxhicE}I>#~(l8S4%E_A>X-D7Mc}p|4S5pzw zF6A#&UUjx#g)WR3Y^Kh-Ww(7BMhAHFQvxD zqznM}mY10V%T1`XSe+?n&B^Yi)|uV@zE7)2h8JE9;$y_)aa0S1H6Mca#G?xApXJEc5+EejQ!ag`&O*P%^V%-i`MLwm^^}R;0AR7Y3iu= zi$R9f+XBOxProLlAZY|(DVQOYO`t*4_ngbEK)`zm54U+Wo00|&GW@o56LVvZj z%5dM3=9Cqr!3QRvLf6%2GHD1dj@yaUFf>HNu>F~is}{uEBFN4&GV7#zYtdrJl2nT| z!sKBLRI&njnnP&DW19IoI_W+sBkfuUD>-+DZVO8>d^RF{C;zDw);QqwWE0xwjo;M4 zlI%caR1CU|+3mF*o&&?6?wV3Jt3`8nzPux$j`2CDK4zc`34AU9eY?ZRwt6mUJu*@Y zEZ{p&l%J0np5Pzu<%S4^Y*57^!*Mlfe?ib#g!}d+o|BYTPCWll_du7BzZ854-+cpa zb-1da-8LWv2Wfmh$9Gp-@MbO2G<9Ss>cBN98|F3ox%v(DXX1xaSea~5*cf`)Pyjy( zZQDUTb#!O(GKnC1zfz)R>zRAFIcuor#oMRy z$bwF%;c%%*&3{}xeknLS--yz#Rx=E zTW;E6-uU5P{xyO@#Pdee%za{_%-u&itKr=Fr zv0;xnGd{CCKR)s?s7)lA4q2fPm%h87UL#Y4SBzv;|Mv3q;-MZsKH6T%P?M4D)iOM; z0>wV)?iaG{dDT`N9QiZ+Gg=l~lNS}vXP5{?lc~b$PdA6=yZ6!4}lXxMKQ zChM%&`~fct`Slhw`)O}~WhJJ09Vv;{)(RU|OfPXO-n>(nOz?19Tbp#Emp4T-&s^Oy zRui3{Tx%;%Fx%iD@5o6mb)EPeY+5wJ5=?;G06>nDZUfiA? zHG~HtA*it#*erziHq-}K;4d;H4gP0eK;V}haZ3Mh>s1 zxHucBJjB<`UD;dmBZzc9 zg@zNoC`L>$Sb2oQS{NY7WziRp6S|<(a&fpmJZXnPKncB3Z@)vq(R}Ut0IExYQ-}Uj zgng!*>$~g+OH);w54QldXgSI}md$d8h)T2CGe1tZbcgLA?phE`?6cV& z{3?37j=}gUnb~|R&jI5=dG5=>uH9Bt&W&FB1<(|etv=bwd+4~%?(TN(!%GA6zQqJ^2?b<$p$6Xe3 zKm@^OFV(r2_{lpngHaRtdLiG#ywCaWyRVu8)qGPadIyGi5zW%~yI(vX|B+*BtlTEw z2X4Pt5kxPf-#t`jCG0cYjIFA!ey+~EQ8(UUIGSHI|CR6&@4g#d~?U0gS{(~Fi`Qopn<-rpZ4TPh;a2>@34x1PstYK9QJ7g~mT-6rSg^@HQU~t(S z{T5x8Ryd4ua2c4@(!%}txRJfkSwgtEO{7w3SUwXVhP;==s;u*b3{Jr(u6U@C-3Lp7 ze{l;0e{1jmlOEzvGjWAl<+=7LcEFZw{>=Zi1S|Z5YcQ=zPd_zO{(GhVYcz#dLHTsg z$A~9v{GPV8XAMb0iVAh=MrunVIgBt0A&tx=y1$G~>is_yQl*fS2T3P5ZwtwV7S>fH z|2YCJT2KqDb&d`s*PASP!p_-&RB3rIrb2Ijibl8m@3NxspU|jE}jDyBh)l+(VUbf($`AmiMzr z;G-qIaCo+h5N@Gn03DXFV#RE(sp(3>>>}9-GVB7RJ@g0cs zW&SWJ;_<&Ed~}6|7zZ^F3>1^%Xw=h92h#&-7UL!!wTcA)uQjhYDp;I#?L+}bn9HU> zrwvD+A8ck%y|4NEm8@gWrO9(4mY(rySh(>_*YraWZjoiJpRqZ;v~|dtu(<2S_gvMD#-Ly2GeEBf%VVHnM<+q$Y z7w()r8yeLV#9G0u{aQdq{QK?;Ym1h4d1+=g&3SaR`(gSa2R=yodcv1wOLgtDWuis8 zur%1sIYlp&t4=!N!8cj!!~-Y(c`33iQeaO~wE4}X*$7KS4JrBhs@7|iKoq1j`$#Mm7lk66gEYmNXTrc_^LZ>a3fR^YdX0v?qpJQQ|zi!TI zX#6pDI$V0|u5o*shSJq13!3)Mz1zEFiM08oy8nN9Ce2A!U%a(c@odMXU*Ro{z%6~2 zrN9HA?^X+_-9Gnj?=#>+V);X1@cK~b1S`v>OL5*_yM6}lo_2PY*`_~Fmn>O!XJ>6X z@I+EBH#XzTtAc}rFU9R~Sg;m&{#b9ViRol75lAy-!gNjpcaOMzzhkT+y+}63$;B-Z ze2x=!Tm)+$a38v&&^2L+0Kzh8D;AWOy%ijsJ5=wmzJd(&evlVF!P+Ju;IpSt+3w#T z;0)Zv7eXstdXu_xt2j7g*Tq;qVNG<=S$tumF|F@5rsrR$*4 z4skYCGJywp{k(*8cP%uXnleu3N-g^OYlj6kmoN&Q=w|uHFLAEX>FVdQ I&MBb@0P{F7_W%F@ literal 325711 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 I*7(-{0kvZun*aa+ diff --git a/docs/discover/images/esql-limit.png b/docs/discover/images/esql-limit.png index dbc9edc3cdc13b14ff146710bcd947157a8b04ed..b03ecdcc091e68c66ed2456931ac02514b53fc2e 100644 GIT binary patch literal 246756 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

-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

UjU4IZL*;{CO+3q;v)F-w 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 YSgH#&TMR5Q2f%-KrQ~j9-qdpcKg7-4fB*mh diff --git a/docs/discover/images/esql-machine-os-ram.png b/docs/discover/images/esql-machine-os-ram.png index 2c936cecb9498c6fb6b1043fbb4c55a5037d70d7..ad46d88b219ff0a7a0187265e39cff7e0e63894f 100644 GIT binary patch literal 233047 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


7IA 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 GeEvU~WW8Ac literal 294898 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�zA>cA#lGl+6UmLsg-wm=wpPjo#8N4fQ-gqP=w@GjKad{II%F`W ziLt1~TueA9m_4D7Q4{ytk=yG6j#G6D$dn4=4oOX1{hVi3}&LAhAM1X;O))5}9O-K9>7sWa6#P z@u3F?1#!gR1@VYK3RdUyfB<_slipchaIa>mjutB`GQEZJYwOpy9Twyq1oNZ|Sj* zva^3oHP(=MIt8%g#a~P3rRw>9#*rL6U^)@b`{$bQ>LLEi8BW3K!T$f$;13a}!xZ;j4Em!U|JZvw+ zg`E0*&Eh5_kZX@ILt8d&GFStsp?*IQLPM3pDo)B)M%P%r06(o$c(M>|#od{5=IirOTq8___E%fIIT~FzbTtn>ET(7S9Mb`X#TkbIWt?+X?Y(aL zys-*Hg^Rbq60EH?lc!6AHyk&-)cU@ZF@uHeQU=^Kk|=cY@_A9O^!f>EI@*$i{?-*p zd?~Aa$Ulazc&h0Pb9gALme>uM)5?q&AzD+9YRd7O&y$Y#h2difP#mddA%vGP`fB29RFax!Iiu*7qUOH>YX3$nsL*5 zCl)I90p}FTIfQO#p7%|b@UECe&?Lpc6`i$s6Q*=W!Tla3$V$K+Pn2}+zr8eEcm}1g z58q+N{o-oEKWC=Mz%$97Okgki`?*dd^_&RbTxD9a6S?MV$Y<-9sv>?KEIIddVn@BL zg&+IxPxu}zQ1i6BaAw&IM{HNPn2GARpZRK>YSpd+%+02><^JBaSEjX{P;9UWu<#{5 zKgO8cv9y9jss@nHKe>bD*o$5{E$DHfXGf%rcD%-%Tz}6}fReh#wXCWo8#?vOVjcM* zCY6`cq>4l?^cLIOdmEh;^PFZ-wy&lC8>;);b98_;o$>ubT?@+_K@k%P)^(_L@V5CM|@#(5>z#zCyMe<#+$Vl=j`1^Jyra zJ{7vPY_d4k1a}!J9~D2}i_DLwU~R%u)BG|THg9!Gm6#IsIik7V`Wl_(>V?0G=Qp@) z7#hl@=u)J)R5~q@EI(8I2Dnwrj0wNQTDi<1jSId%6U5Ydhe#ule*}(KncQ@5$bVja zF*Cs7S*7C)#cL&){5pb>ftkat=oJ1WBsgHV?u^|8t{5$G*vItIc-N`*nH2ltPIn|B zA;8!90f5=;)}-I`ENYYt_A5E<2z0V-=b@$Q4>N7c>jkWdI*EdLUK=ecp+EHIij!%7 ziaEXhgMTv?8{Gep0<3kK)h?x}r7A$KpeWI*)Fj;k)ZYFPVoYol%j~(;`Z(WfIs1F( zU922rXAE2Ji&yKf@C~eVn0u=Viw%;-Q!v`Uiw%lg^nKL8>B0zg-*SWYaMxB^&}gJ? zRq(6m3EPc%=s}m&U-xMFwsn@`72h)E!F});=Wg5Bc3YFV=r_ktzwv&YMW9dP#%|b2 z;~2>yg2r|F5zL&fc1^26Z2pB>n)gR1c$;TxIJ^tkT1eVQAX*5`6p$)0>iVvQ4WecY zmauuZA8NY(tB|i#I+JfPeS?h2%Z5+nPc}8&AH5Zm=KU7NeTNB$A(2FzGZUuMUsX{^ z4J6LFgUN{39PIehq;Mcm5NB4o&^Uuk>`69Qd|8G~PyQHhFYe_E!Vk&B#FQlh~VC9G^`>w}}YuE?iTH`|qCG+841kCfKZ% z@?VIn-b41e|R!*`9u6oL<-UzuOtyvI4MnKh71NP3$9ld7DUR)QixBXo=HvhQSC z=X@s#ZSO52DclXIlK5!C#Hf`j-LEG!RQ%ETPVx1N(jL8ZmPZLQ(I9#k5RG8gIEPA1 zmvQqUO@&rbB1u|LP263vdA?l@9D^Yr?*&&XV5|9!$}VXn3X(H~$kGq@ z0PPmswR`&`>95(Qri177ZVGJ5Pa2=fMA^MBnCVf2_dfn8#mDGwXd_rJi^&fxL03$a zH|KAr7qCliHxuo<(yz?4>4@T*Zp5{Z7&Kl4{*;1r1?aGu;DHysvWu2#_Bkl*NvB^1 zTDFCExD%)w8(USl5@gNLGQ~#;OYFeZ zlqxQ%p0(G`JV%3Ng@+6md}Lm0I>gVDnc!Bt4Qovlvb;f~ut-pgu$G&F?~pv8ELYs$ zPu~XDg#QR#Q!o_}mtVvSlHyYc&Sw`kzShP(4x4d+wLW)60|0%~p&lsGx4|SbsXIe( zQ|@JRnQu8FrV2LkhqN#2zj z*-z030aiq-H^g?t+}04&CQ(NgP>Wu^<-0x-%TIHBYJNFHK6?$?M+f}`!0H)NG zhi=tHsMn_PtI1c&g?I2n`1jhSn^2+@M*H1Z135?a3Y; zCt%gCn9&!#zI(IkIddWT)?Q|Uy(;2#4c!d83?$x7GNM4u)B6PkHd9~v#b_zcJqNOu@Nm z+z%rJv*j?v6JETn=BSF$2b%EpLfza=L7jyLN~$pRiLK6duX%!rC7(`w;giI|K(ZTG z(0h5|oiQ9%b`yj_rT5ryN@7@`=_~Q=; zq(uDQHY;1#uiKddM4WIL;`j)mK$*lr>Vh6+8YUxGN3(JHWTow1eNRa?dmBI~-z`5yltG}$G=5UWIULT@q#k~OdLUs{sXXJziz7I z86-H(ZQQcW6zvWqEepKUf+L|oFdz^nx`deeRV!CmmC2Yc7PpJg*>;zfyW+L$1 z+_JNUJsro3iS{;h{nLgI5>01&8C_4vw&#BH`pbR$T5oE$P|R!hn|fb6KnS*t?pcf9 z2b|SU>KVFa&HPdRjelaQFqalwu08$NV{)IdF5Gnt+SDMSmApxD8NI8b&vDn^7oz#n z(!6Y1mT9z}f$2x1aq-6!IZmqv;Tg4)UX|(FIPRU*R@eSQZ=Heh+Ot)LYk~$1&rcXT zN$0)vmfMK$S+PhF^JjQ5j;WXlC??ZKL7v_jgYby<3Jnb8YT?6+2)Ev!ouHkSoAt*PGH=8TS_SlW7NV*yWDw>wf`EI&d~<^1^c6{aYO4c3QMv;u_O z2xYB3^TEKpNZNNua08)JC?j^Kd%cwf0mAa4>pSdnT@`P%ui=ldjN2p5lVZQy1eD_v?{>|qI}T=38BTp@P+IK^!;y+QiOrwCx)dwZ zApHea<|x1Ls0HrRsWR=^HIM|8@I;~wQ%xDYZ?&sgi&ALt-@1Ke!Hj@N;GK3(sb<$A zN&IsL#&HqWbpF0(l{@H(CMsWF(bQ-q_L8p?dR11Ni7t_!Ry7(QF&#i&zD$-mym_Ew zkJmHW_WepO!bWipNqlr8E558GQdivHCln9gU;CwM^Rln%EqV3^JVnc~Zhr??e1F&( zo`6!?*R@z2Y-Np|tP6ShNhh>AFzM%f)_Ncaghq^ zI;g2WXTR*a7+UR}q&JPsER-x`OG`qEqWrb3i}GH1mnj1DYP_&sUt@$g9R$1c&cCiV z+zV4$E1M}AnueY&=wt0tT#)Ih?e~$!eNm**r-fwl8@1^fOmrPzy^_9>=a8=v(=Vt#Xg_2(*po?!=gxN0nF%KpSQe=dMDqHAhgT%g=1D`Nc5Zp&>%`5nEblw0(2aQ! zNjPh8XitWiR*=Zmx6TLvB;8DhZn`lAw7j!e&CA44xV*mo_&nd3-Tte2q&wJUuZ`dh zS(twHq-%j^FZCwKrT>F@ar{7hG7c(v_c!V4+X0sj^FrodZMsYt0i*PO3+}V=;`~w4 zc((tQLW7NC$jFIlW7n*(^MUw)jNz$tdUfx)u8(oBkNeN8*4rwQdrNu-{R9$4Rs~ta zt&5o%AVk=TDZ#i^>L64Ndcyj&?;L1MG2V4}qP5p5CxgFLh;4}lW&O$wey1zLf^2r8w5f)q1v%yt$Wc6YG*N{ZP zlwfv{ihBCPAFE{2{1z0GWTh>K&j75`bDZ3GaBiDApRMd|r)`xMl_^7-{r>Mp?wc_Wf$y2!ztCY<~+^to1rhLCMmHS4}<(_;kNrn zim12t7dKAezGUJYWUiAhJLY*T+L!hseSc}tdC8x)Z5W1DoEa;#SkA-pgg4QXF67`6 z7%tWsAx=4h({q+J>K`ZU_NB0cdH$sf#s5Y2YdIjs4p{xG2D^LbF;+2uY3f&Q#nZKQ z<7ti3J0%I1C0?I%=`E_ilF^Y)ERT#Z1+|~Cg=Z1B^GhYHa`E-(^K$C*J*KlJo5Mxd zLR#Hm^gXW)4`nFu5pP$O&2akE(7=v`L~wod>%Do1!|yryVmTy={0;8c;73fm0DQ|r z7V6||&k!_NG!moqh-b&aDk}2eNgb;TKN@ zJ8V{^}Y+WDS;${pJ1M`JHN~OyTTB@BknWUa6byQC*izcq?PA9ow;}zi251%!4}OcF^v%p=3cgd`PsS} zaDGsFh3G9f&Y|?GY5xgXj8m6i3iT0+oYSTm%fu;(u#Ys|`AL+?n(*ebO&a`g?_+~!Gl9&58%9m^-Q9MHGDC&I#e-u61osusNzETS z*`U|z#!obfgtY~S_lyw-7YEjtip9Eix`UNpSxD=Hxvk@PxyAFIOtt7;p>X<`)$#MU zsl}G?#M!1BwX+^QXcKt1HGf2=yuWVq&Q{>g_6#b$i2C!W#c8&MWS@|$iUO=&7f;sc z5N!j(26L`;q?)w8+DcMO?-*?k4{=+}ICAeD#|nu9jaquZmg%)eE}LCOgqRHkJc4-R zvbne_yjJ6BG-?ApPHK!d_PaFzXee2cdu6s~+DE_<_GHj~x2j|_uRRc-6o3pFkj2a! zs@^ZlI#@y^^usk}yeAjvMs?|2IXmt!9R(O#gG51-i^cVZ+%!DA)nennW}*HkQhG0? zQVwMBKil$SJcgNSxPoakuu5Rw7v6p`6DaKAu4*)ir^&H6IYs=Ec|6li3Uv;TZlKh!;= z4wE_)d!nEZCEsvcWG_#anPWRZR(kbdk97#eF(!zhiRn$J7umoDCyfI$#Ja_01CA}0mY_yD$p}Y zVg1_)UMK~q#>YD>DF~j0@BbfZ-yKhN`~QDeN+lzb$S4^_aYxp%ldMo?cA42_o$Mr3 zG9r$>_c+Stn5mAv_pFSAgA>O-4&Un(-SxRg{T{#n6z6@e^}b&7`FyhcjkKG^1mra3 zHU{pF?Ox0uLx7;Do1B>S+)u?(UDN#lp!f=eo(cdCVZ1#&0~_dI1?^qHuS$^*7sQw<4|Jz0xZHhfUX==Xj9*vLAtZSl4Agsx2NClG+$O z`z2Z+Hzd0=6|qeASoG)I7MPz`20_T~uhMNz7!Xa`kaz19GX2r>k+s2J`xR%Nffq}OS(ym&yS&x+8;$}{xBg*> zLB2AR@E)2(j-W84;%?f{{o~I6@9F$ujl2}3!7HA+bmPq)CB%I>AY@jR636BAPfCS9 zeDwQrojGz86sH28x5|BSz6;x((ML)GG43;QuQ{=wGEYCP!%yoa5ket5^~zB!o@Mn( z?DrvaQGs2DHBdF&{kO&Z=^11Bl_t(b^2fX%t8yM zD>s#SN9OM{_IgS{c^p0$`~A;%z`5OSdwlt~=LWK#3&TQZr(-CDdcVtsJ_e5^dtAr- z+fTVlP^xA=(Xuy0FM@olABVK?Z$Du_IBjHBb(DJ_I3o!tQ>os4kpJJ4{e7zc`-_KQ z>Z_mc{LanHa*eP_RQcNVXse<83lqgxeoRsAz0-fY+W+?(zQ3Oor39gEZqSnX4^rJ+ z&%t5wf7`sLar03gNFKYfiVo5LO`Pk0r?fj)i7P~{@#5ToLiVh}_Zv!@@Omc2dyp~i zjrXtN{Nqn&u7WY1Ba#!?`<6%G3jd$%+!~^ zme3i?!bbP~35kSlA9)_WH>O`1jl)EgrROD4Sd?@KD@h?qVoT69rbO#!8hf9YcnBt0 zhc&X^J4gR;A^f~LYG*jW^OQI?FjVOi^>0F#+8TK6riPt`P+Lr`!6ME)ax+`;T#E8# zZ0>Xo57jN$MHoz7ATbPvdV601c1aTT$DhrA^GW_~HP0~aKTZyb7qeGd#XIYg37F|fV##hjA{)3B>%8V@cQmjmR%LDPQwv z@6P5CSmpv9Z$OInA4~h=ep0egyh*^e;da8$A(iDmWUEGVG#wd=UC(t~@0Z&c8kpj1 z<+nG8zwE(j;G3(NtIdh#w+g{w5Hc2hS&U1^x%BgI90J9dLGB0vJ)80i%Jt|@irwcE z3~!+ITl(J~%ja{1JNy|S(*)*rX`b7&A(I!yCC_K(8eE)ZKl`eI)nMVG(<(Ji(0s{q zX|^y@rBL=Pt&riJdNNRDeI@M=i(K_Sv>G15`rNOAi*(m8pD6~%x}UB2yH)tb(#X<# z1&MFmAkeAD3kJ~`-D^)MzG88cojLmX&2}wgWRPDo8K^@@hOqkASG^y27Md4sKt|6u zzfdM*88gqlcIXHx1TzGcFa>qXKKr@iQ4^Zem!@u0U;n_gN48&5LA_zRE5(tn#m(f58;W;!QPm;8n<}! zy2q$;`v8RX%CuD7;DC>|mj*wNSyDZU%wBlsyzn&af#ZwzH)m z2e?B;R_|RF0!2@^?e{Pc{)yKE>|CfTrh%J)HAFZp3_F9gW_-+~Fu+~zgb@ntj4rPq zu_!Z^#;g$P-SHlS=Rnr!)$&YN69D5euZ_AYw>vr*xvp+88!W8LlQD|05NZS)Hr0xN zhIlduHtdfiu!!ySwB}6$Uc;AwD6WZN!v;1KW4%eXTI%Ql_~k_WJvUYWonIqwaP+>Y5FT&UV5`w~`b& zs_|*Fu!MqTX#goUXdoZMgxARg$^w$?NrE?h)e9a$Q&JljfZ{0d5!~ zvynRd+8Ae@?{e5N+KOy#%-~AyvD0E7o+ORTI}(I2c}%-0sP3%lIT4zBM$Ce9JS<}| z%v2(bR}x^lP(6({9%%ce3WZpw^V7oEw(xrnW zC;!A5_Pq&OneBbW7Jwd*%R}zAj8#s}TnnThNHy|<#U?CDy$L@U{h<9wQi)C1*>D6r zxpo;S*lm#B%+sls1I&sH*_NdGG(`O%Bd(zV^pi2O3v-OWo$;*2ewvS?LNOdQc$7YW0s;fwDWe*b89hOM5idt ztPF1OC6U+!sVOY#r57szUA2s}=tw(;Y}{N=0@HP5Q8qCzcjmnHmi|8TjY5`E4)qS&G?ySdr0{L|F~M zdDSzDstu({{HyK{BSjKCl`pJRBSr8tPla`JaH`!8x<7f7mpETctAyw;jk%{sGWC&* z#sS!AJy-hMLNbdq^|TUeT)(|;kZ?~1-`pJBVSbc+Wao3xiI<`2N)1tbr*DWulr1|w;Nl;Qez4lS?tl#m>c{ck-NW5}A**Y9Mxgce#v4F13ro|N(bkW)LS^%CR zQepH?;<1jS5X)ev#+1t;D_5UBeBW47!9lk+Gos!oa;tIfGl5K26SFVhY2-TZyiz4O zy~tINH?)}wI?dah?eb-+1tSmouv+pnRX+ep@nP!^E6BIfw)Me@$;}RatJW!v1=ONV zVjIi$RGU4tiqYLLP!+$@WYw<4{`}+xmhvE=2_n!G$SBGNphg1wtVtPd2VY+WWUQv) z?*VV^bg19Tl!yf*#lS3F-Xcz2%s#(|PBUwB{6$QeOzqW8xzkucl;gi8XneTbD^qKXpVRj zY77uE`nV)0zcWx0O$oC{5>7?5$!4s6^^hNLg_vs^KXqEj6!^RGB^h6Y~cFE zhlt^OIR;G>Cr{$O0jntNlug+0G5tR z7MLOBg!zL}@%JRnNQDrbLI~(<)$zt>`W?;_PrcYKTCJgh z1i(^vm%8H09nzz=w@ZepqI&pulaJ9;mKxlAJ+B-;50_z=-qRQ~USOZVf+~579ZpJ$ zI8|QrPwK#-63a{K*=qUzDTKbQ_b9-k<$s9C&5xEB74Znu;%v*K{=%_Lc)G&kJ+rdx z5FAZ*rMk%CS>{Aq(=c{~`#jWhVYRqgAUro1An_v`a+z$FiPB{P;?58>My`^Jvm{?9 zTY3^R??Nz->hakoZ0U*&W^d0qMOGv00MjRxiIJ6?)L3yP=_^Yg)0GmbXFH-MZYwEW zuO%6TheWoQ(6&lF3!!#REzY92g`P*dNe0UE_frqWt|*-V{f>9)K!sO92em*0I;M~I zUYr0-oO!Q2@P1LNqOJ}h>`kJ_m&&i)pxeJml8l4Be>N_oyUfs)_2B?9DNH@P@6hln zFvg*^-kXh}fJD;IMn|&zw(1}WtZ_y)eX`t2E7d9zIbIYAn)X0-d0PKLUAaJu^h=XQ z(eW}V`M%cqQ~+olY56QV3OdxU9rM_4&E39rjRb-w z+t6?fRIV9dyjjQrt{EYzLzvm_V#w=54iLv>GA7KJr$iilJ!T;Hy}v$8SIE9!ZyA@d zPp8t|!Czxuk)lseef^#Ij_k9L%lo_!V$=NGNX$>)=#_84qLhM)^m1R{UdS|S*@{$h zG$OT}rU3mj*=GrjPF=nDI)(-PYNs+#HyQ7FeM>?0jnM7>`a@;jMQ?`eFk=MpK|K z_{~_?UnbZ;o(XyPeB0x0H>VM|X}=bxRi#>zm(X9yNaa3%l508G4Lc8=B0J;c)#_=~ z5c9Oc$vXalsKsGi2c?N3ZzX7S5%K<5xq0kW7-wI^%F5enx}NMtz@;lXHbUsVW4|Xh zQg)#6QfF%!Rg?Nm=ldcBNf?y_S!3PRU-;3K(lv*)>quihKv7hdh{OdHGTx0%F}l(? z3L(|9P;G)h`3>5tSkg>8AHE`9g=5Nym%xs9?QCFCthc;d75c2H@ndAX#3lL3XT`5` zPS0UTM~d}mI)=0~0g|B5e5Bcu2{0|6CxDW%Zr-ihWgCDHkh-#HQ$XpF;aZTmb5`1b zl7(6xTdoctU#NlGM%a~m{cm4*u5Y{KHFgwNR?D1r;L=VBz9(%l_6e|eB~b@DMl23q zE5o+BnGQ3sI59zW@$NfyHkta#RWnBOI<^rtei~I=o3iG-%HC%pd2!@_;=x_sm8LXL z*O_B}fR}OFPa}^}z~g!5Rt|Lno>Y4Ve!oM-w1dD?aQn?$(_wcjh}2ppfI|zG6nWlc zyre&uq&dMW{Qj#FoL7_n8Q|vNCY2Y5T<~7u+t_wQ9dFGt1lefkUSlZTzKX)DD;k5t=^yHcnsl_y(5SDT05b+$lJ{35K{= z{OM4vWsl9okq1MVxsG9H(Ba;lYWu5gXS-8yu%rGM(NOZcL7Ug^cHEYqpTvkic-y-D zwt3Zda67yVS9;>Z0a0?VDdbwj{uQcw9&Ve;%L&*=atb%p%@AEMqjoLO2KfaAxHpRY zW}GX~aN&vccn^LrCTP3!E*k(<<4DDW)O2^uA>+M1@_-Cu-07<^=*4Od8AX$d=rCO%S zhrt{TWUf~B%g8($rd*wZW?RHLnQbR7O5C;8g(2>S5LSDx8|C_pT({5kj_?;IOGu&& zJaKwe11q@$;fLV16_*jTCF09hujCrLwmMg|9w`}hZ5uJ|0KDumm}5iD596Zknm|Bv z(M57dhRKtoJg4TsS_2?RHC|OX9Sd>SuG-!_z0tW*^|GVv^iz%O-pML&8}xFfsuK0c zi`Ijh2Pa@enIqPQ`- zcYX3$E@fa+T64@nAs)GGNPVB!alh zuyLIhpaXOLkvSY{-Z7@-a9+Fcb&3M4_XWa}Ud-)Uu`s5=z15XR%6Iv49=1Y2Xe==l z5goaB^Kq*SSAQAyG^&65RrJyXf9)#pC>rd!yI(SS4jXMQu907a4dKq5WaRxtw&H2X zBioPNN<%FJ)olYC9Z|(Y3OO>kwR>apL*py4wxVt*Kc3iE`#V}fvpOY!cjJ_9HVbxs8U+o^9UnFzBi zFuwe0kc1Cf#2EzEjo3!Xj4esQ@z*#tBkQeBUt2(hiJ-iBNht{R*XVKQhm zWEae>wPlDBu$+Dpn~mc)qx+T=BqGt3lQdgfJ4wpH6(Jx62XU4JVvjd#X&>HIK66KO zs;76fq1JNB=b4kWjvQ!0et7BV2?w$(WAL1_vxK($&;|cYk3npKnk&3GGEY4nM0A{8 zX3fRfkx0K7gw%@%Z-)(pBu!jt$e`YUEAo>Sd5Dd^y^Xtc>CEkou?}%aV8m=btQGZ-p8#$eJreC>D|> z+E&-*Z?*KK;R5q2E{4TB4`R}mAB!=7o(WbuLnrc07Yl4BXIwDcb%5X_eNy@pV%cjs zQqU5svCNl9Bd(FX^kR7qZ}8A1SXI5;_}OPe&l#-t;@fMks3Mgjc~(#VW)bMU{*sQ| zlF^Iy`kp<_ft(Q{_Px5a!Z!J~G*iM`?X~XGW8@2GZ+p6|(NqFqY1L07qSHR)fWbQ) zfNUQgo42ejMhuSG(6m2Ejn0TH(-vi9{YX-OLmVS20eig>Axar zwz$7Q z!Wq6-h-MrAaEw=d$I2C#Q9C-W^e1y9HeSQH>+A)hSVwW~Vhe82P{dLd7UrmR^-wO4 zW}c*d!R(Y`_C%J$jG<#eQ)d6|Y$YRJ&+$!aLgesfu+)suh-*Gl?tO&JeBF5JMgJ#K zsOvXZh~jBbP1p$s59>`d&t1bCcT~K~0m(PHd@2p2x%zE}!p3~z6O|7ecxbOYG;UvU zU7co84tIUq#db46sND@=2y*&XN~vbKQ**ZG$JK`20V9nljnYOj$WkU8IXkq$Kb_;H z#4vYI)2Yn8`%&Sc)cFKx+80t)+yYFaBkoU+Cwi=M;)4cs?gyHks&KH=!fhqiDdhJT zDx`S~Cj`542QBK?ZP?xDXA`LF(E?TrnHCGSqNFF4;{*rM!ddQ$>z20Ot+j(hBqo;e z1O^WEI{ZqW7Y-mNBBW~{HzKP%E(6C*lZ;t5-&kuPpa!V949;Ak>UyyE=q~hLn6R}Wk&l+d&uSzyLupLQe8d1u>Ih4Ip@-W!^5 zT}g=3!-j$zGRwVK#i-)TiIbqKr!nbZLGuzJ%`Rk56QT1oh)(D>9GjVBmfdBZV2J$? zrti+PoAD6b-*Ff+#O+ybuwWoEjFlQNTPsg249ZsA*;h9aV8VH$;69h#=Eu5RCF$Y7 zxRw=wM`3)h@FWrH{}2_smTJ3mHqIoJ?L`PNW;h^2lY}27s-U#Cjrohw#Oicd(5+1r_kcdqwPu-fRka1z@@6j=Cw4%ihTM5 zFrlu_$ID{Fty{2}`(~6{tqb`C-KN`_lp?09gB5{()WpovW%cAx`F1T^v>t%wPyz6S zq8U4Viu&A@!}+dj%AJ*F;zmitB|xzXREA(eO3>8ev)-HaMnR&6Q)qHhrJ*~w3ere{ z4n2|;N80D_`<{kNmqXiH$QK!BEQ{NUY;$Pkd zPKT>qZ*xNkW_1XJt{c(WskYS-AM+1wTUM=CXf5d5&U_a7piBc464ghYxU>QLJ>$c) zPR~5&*fmh8nj+(az`b!r_fsp#4FhBLs^9-oUOs$HzeeCbU9LF-wTf}C8hXQsx`#;@0tMpmfAdx6nK5wA$N6ccQaa3H^{jy5W>N3$gHBq)KaC zrY&eGwWYpBdUC~{L&zfGE!ki?q8c`M1qQg?4QZm0FOxqAtH;u~Ol^$L>M0_F7`RG? zL;AXWkADlw-cl1nlwtShy_=VGieR}zVmu=_5-H#EktOP^2CoCeij(~TXw7$7kZkDv z^MJ&%OAk1PHxks?hsTOsR;P{kXVy+dlf^J462%rlFu}F%^BhwT=1Loqpg!%AF!R&G zrE9mU?Q?Ed)o@WlGgiFUdLxf^#QC(!?m}l;@=RdMD-wmG4o>UOk#X>753a@ktT zp_{u*U{m@mgc`&v*I6yzHa#C@vmBl3h9fg%D@P|SYKmpn0@EM`zS>v5WY-#uN!AH( z9_suU#NaS;R9XCjB3&Q$Xc^0uY5M8X@mWl|sJKEA%5b#Za#WimlGh|3agPx?*FWP( z0!7@clXKbsC0Bc`rDP1KD_sr?BNmc;cGZV5KRW`+Yt~x-POi(irwHpk=m&_$4jZwn&vjtHKTVBe;Hz!Gl7^M>tsM=~ zy+J7^=v7mX5eQ$3dFUb2;VO;&m25Z8p=1n+Vs`*@&IN!PM36iXE3az@?fbJE#v2hN zlzgxAXy`UiTb;?twP8U_yg%6DJgN# z*iM=KI9ha7HC?%>tNH zN?R6Xmt9wb@zzXVd3J$pUKYXRtTyE@c;lW+u5I01ZL737KR<54`wig{Xg-B8d|lex zHwlCeLm(?rQE8L$9GoMF%Fj?f*N#X~E3+*hc2JGW&~Q)!nT#ZN!BNVbNi&+f#45Dc+VF7$bONCW1V%c_ zBF;P4^Z*u|OZKQsA;4veM5x|-y+O!SCMq)whuw7-b_P5maj!8r4BUQGmR1EMt9dN% z4T#QdP6=nK3$s1UghmpKsn%STk+cdxX5hC!`7r_B9)rlNUbH~PyrZB0E`^ABG}{1@ zjbE> zHwS+wx=T?3sFI#&_}J{o3-DG;W3Q_KZ`V}h0*llWOyh4&Tg7=%D|p?g{C07^o9 z8Se%l&nl~}Rn0Ywb*>LJbg9pMczRk^m#L1`Wllz?@pP!jN|K5?s75)gX z6N4AlElitVBpM9V^T-sPW$=pDUw17L?zY-V%SDdI#dim`t!)(JXzo?%G0qw#c zFESY7x(d3t_Ih3>d@pJWc`hs8#RbidXLgyHjK#CFI5tj%a6`j0Z2VjIT24WGV$yL3 zGRGkr#0a6D325@-+H-vc`I={J1znaS?!DKjRPZ6Q&DCZGDM$YC1qv*<94E7~;XK&+ zAmHwB0NhaR4T~>!jT4tm-3FGzI`ejJ@{ShBusi1uQ<=K843c){x*G6qmr@xoc%H4d zG8GgjR7tazXO~kc9g1=AAUgW_A?WLz>YFB|cfBD~PJ#>kau0^LL()qy5By^1-Ed9t z1w<@rh(825Nwz#|X*0elfIqa-Caifo{G$3O7UGGCV=~wm1nK7 zwdGi-Gj{5wv%NmaLz$D-XvY03D0puLAX`$(5UF(KBVc6-TxDj!5PyuE;kC=GB6lP6 zmit9IIf?7zX~BTrLQx9bn%LNU|0HZM`Q*yxyCcFl65gR|Yn)EFS|D#bmI7pv*Mtcf zHe|^Tcqtu|#W6cNf%M|6w0TOGB0JNcVLVte@Slv>CvDB5`vixY-Q7PBt<-++50ywc z2n=1ppt;Y~@pDM$QwB5b*MamH_XU+L=;9DyB#}k6icS&|*8aHH$f%BGZ&Qurxe3r<6G?Kc5P~3ESexy9Z%+udOg-|% z4wy_f@|g~=;XMhRDqrNG&TEzA&35>^1|%>vuEsuLx7_`|7WBJ)y?>lwN&_%(wqBZCd2jl0rHx@h-HWtPYn}`th+pja-I@zb;=Qh6WBsIt4 zo)|!J$0n4gfO!(jtyDVrd69q#`D(O58))Zag5D}srORSLTh*7~duIwBE;5I#rHL$I z+o~J0dMqo$D+&IDoq~Q_1tA?V=otNwV=DZDs=U0&=F=Gas@FEd%YjyLS#yIRQh6@~iE5 zTN+z`aa>Na*HM{A9MHL9%ncq``*ok485T4tXnNC1!i>X416>9TsTN8WCdBq|r#sWK-ndoQyw+ zv-4nj$nYoCuRQKsXDGe8p3LbRS_`yS4OYt#Ycuw_;h;ChoK^)#uty;Nw_y@CHhFi( zj|1y|-9zZUT4AGI6~a!liOKtjN&Q#n zyGAlsV=mr_PARR~-k<43sK13~0;cStt?BXiM}>4?pmU(%bdzBg&5-jpV>Evzcade! zm;BxYPr%t?jQ9Dos(Jl< zME2a;MB~MoF18y9kg4tK%pgz+0v?MIwe=WPk53zM?x&`oRAN-YOjac}|dV z#qE+N{6%**wp?Vx*aWHGyOpa`Vw}HNal7JSnfgAhTs2&;XLex4P)_0#UtjH^?8wqM zs=(9Pi!HGw65Uv3_e=>zjyuB$O-*FWa4VA9L1SkpV<)J4c_p8l)u5_E37@gU&hD`p zsrufj$jc>AzXGHgZe9K$GY>J;pbdO&dD>jO&&hs3RouxIx@9$Vd2X&>%=|MlDgU@r zOf!1cg+ZhU=Ry{@x!Ap6xw9{KI)}^yr<4-2fr^69&7tqO4T!l;IfRItv7NidFxO;b z^<55@rBvc70FSt}?-Q#5BF>YbE1L2I{l$YzsL)`Fv8sr)tHCr}Te&h}K-RY*PBhx! z+!iX{ACMwt7&nBtc^;Wqn&h+tjkV*NiVKbI(nl45tl$>Uo2J%k>!Gu`L)VBK84M`c zde*z`*O~_kC~ZWDF=gqGCR(DA=)~c2cb(QaQFhHd-LPh$u)OWIv5aj+lU4M8+1emU zs!|IUhH}O4R4*mD21P&dGvL{duS)1cHAhMTm4Qzu?yr_6M^i%sP+ttv+wP?^uTh7; zpyeqYXmnSV$M4kO2ReUZQ~vwKEOCcuKegbB;}tnaT?6Dy%W7bvY2W<(7p)R>1U*bt zkGNpufezAHx%M8?njR%;jTu}h4HCfaBZp*rXFWH9owI33%@&v}zvZ=|Wc+IJZpE#T zfgm~j324S5xA(2Hkm%!ftx=bAyOhOo9ejxINU(hXOG1BB2_p4(@BSa6G;yM4iR@}G zRRh0ZHROt8%&1M?QD?l?@}$3KTe9Wk43&oHZS{6k1w z`YO>8h%4mO{NB_hEGW)Q$I!ufP~V+{-LQVoSNQRt5=#_MITNDV%|6+-^Cco-oj8F! zPeTJg2?kh#y}YNdoyYETgQo$Igeo@X!1pQcec?Yn_7U+u-utt69Ulv@JJs;lDxZ&J zsHxa~=FYI+QTK6c!(3?Wyzd?tz!BvA-8cl;7m$VY3^?_h0GePrqUM^#lxIu|J~EB$ zjTd%`t^EpZy0n;@;vYGxsl5W|$yW*=BzG753?BeQDJg13+y5*M@(=s*&8p0Cwl^N8 zx8;3|3_5idHFYLh|4y!Zb27Z0VN@VWp5?5-qt+8N&P z%3@@or3Hmes`2L!j_nRlRvoObYR}}9@m}Ef4`tY&4lJcCK-=uE?Yy+>W~S(ap6JZA zLHnuy+Wj8~>;;f~^nwa5-+^F-e@L3e9sb>qA6{ptpr&R8tITWsy;J9mFIeSMELVQ9 zAb&aKA49>H#+UY=+MDkeB>-=MDp~pbIMn|d(<64T`g&Ooi0j)#hP{V8%>%<&Z+ye_ ztKQM?|WkfffcYd2v_I zor}M_oDH`C9JXOG>+&8h{&gidEJFs&hxVrSt0x5?BLa(YjEhog7d7cM0T8u9&U)O} zznkFi+x5>6yQA!N?FeKn;Ki%pk9Vqx_ILOh9JurSR;f_{Z=L?tH$PFu{O1!HiI@Yn z9sp$z?y;xA_s7SIh6E;CM-Y@ITd1}ZERvLTl+2NxDWP*Syz(03OjLV&c1H$$ky8c7 zi{AxBpD8;+Br@%WU0@J$W!2@PJ!|G!*An-q`m|8=afenIDpVVrr>!tR1o+y+zgT1gT3>&5%epS-%+gZTqqiU;zfNyKh0 zej%as7>{~#$WJ!zh8C;!es!HH6QZ~_1H?rrGe&-OIWpz`>aZ8&;O2LKeCy<&-mNC` z!{bl`hre#3U;HFtNCFhyDPJdGCr=-@YXkRT+KIaVHUD84nmI3?Lo2v_dAt!*wa&C|M|rI!$2N#-hpi?)I4rA zz?`Vu|qY%WDAZs^++@xfpF*70PGn`D%$=^nAc+zAuAL0A#}B_U=?A z{xP>{qx%~5qKg6l-g^*17=ynMkM{q(x&Qvpr#dxc8?cOw^G9yCJCALs+6`so$DHbk zQPeNUvX2VB>3l|6vOuUuOeu~>N-SDTCrb@}-bjpbs;KViOCv%l$OZSQ?odO4di>JQ z<0u8=;Q0M%hNr6Zh8)V<<9Kw0c)bzCc3kzeJ#Sz(RNmN2HwZ5 z796l@S*z&O=Z=e{ko2SUO5ccCysn*iT^FFw9LMGN-5US7l2lO6 zzfBa2UbaZ*#z>r-$l-t>xR6fs2WTCt?tik~z_001MzIBmV3(=v=Cz+}RoTPnMb^_r zzDUSjSi7So7cUmesAO#XieAXB`*yXC&2Z`2_x?1YGMpmJwY70*EzD?vG6CZP5?CvuYSAOuQRk{L~G~?SAbzN(y zawldnYo%Aon!u~P6-+}L$CX&*Y2;=VZN6(zT|#GL24wD}rM4M3JU}(;%udwJF~SsU)=0XI|!r4rlaCeI6tSIzD5IRY~Be zhocY4tcHrEwzqLi7k1jcRq~CGxQi6cUm9P>t?iseIL*I2M$01$nsb(mZlWW;ZOZ)< zubTqm#v>xWr+j{~SrRom`w$ZbAtKWi$c%~Mv5e`QG-)aJr)WFf1g~R|YzZ60>WIS` z=y3mW%3cx3qj^DJZdBVVup;u={IL`5iFJY5DQ+8fJT4Q&0AO@7-HAGo0pIbE;klFc z-HRuL%twfj2@WN0#PFLs|+h;=x^W?8W3Ap<+oUM+FzvJpE3-n(zrT$Q~Z^c|zzxEJ8@a6*)iTxb8ylNBoR0Z>aG!4 zo0yj9k`%j1ds9DhB(2J7tN{ea zg}vE$CfCBpbE5@)N9D7NH|))B_awF0Gm06$xCp?}+*!{%QUkI&gG41aJCv)^%GXI9addySeTJ2q1Q{vmOCWRB@ZSHE3u4t;N50P2cE)*y9kAMEMdf7O z%-)X6P?2LkcP_TodD`zl%AkGQZG2`V-`LK1_f4`+YYP$eV={c!!-YNh5!(aTF6d0{ z8(|z`LM9YA+cZk4`*9g=Sq>y+j=B$;6__-3(`snWZW_17$Z6#1TNbULhotnK%Y2Kh zq9Rclj7%P-F;*j+(Uazmc0)pHH-DD?P5Kp;~1T5f!d-DfPPC%TdB&t(d0i1T)WIa6g3aeVXmQPT+5+irn z4(ai{+hvWJNsB;3I(3tzXZf|wSk*ZIAPU3uZY97NvYE+GFTS~`m9Jak$>UK7e_<8Z zRPKmQm1$dBNy?(rU8v=m;s6A`oU}q5<(-Z}3$ZCm^P0JiL&ZDrY?5r>-rUi!G{w;l zbaOjgJ42-`DdVzfLx@%$!frCF5Yw+mT&R9~9a+T5a{jz*oB=fCE`ueQM^|hH<=gr^#?@y=bG?a(iP0w1TMOoD#@ir+ zcR{=GshgN<6aWp=RVMpY2TGb1HB8@ASQv%!Jdw}$n^N&yVt|!f`ch;^(3mdZ)KZs=2+8kZ|W{wQoG6R2huRD)kPWO z8o8UVUYt6~Fk8%TdWf+2XVgjhC$Dp>8xSe|HqFK;!Gy5LwU;U7IqBC$hQ*1_2LmDO z%S_~5ckg0Lp$o$=VfvZb*;`o&Uk3S_9MAOXRu5&Y4_(a3)z`((tLWixU%GbvdIO<4 z&^tf0v~EP*+_I8<6xiXaaQKPgN*$R@9TcCXyEk;ShdSQCb;V?6Bs;surnNarR9VBb zMB_PirLx$mVPyefU#DuVH}yx&qj7?VqBPwLuGvjBCu#~63;Px_;OvJ-=ahXOiPJ;0 zxorlPy{Tgug>6EbLB7!MIWmye#wVr)517)m{Q3mxO%j$Rs*R;VK+xzCLmlj<9_3bFn+i$kV8uTllj>2G{ z@Pq+~(pcnxJ11?{H`@YlIx3LK0m(jN4+^g_a9b3-asm}E(1gybyjbZ1@e67LS-QN6 z&9u?cH%ob{#AGA_wxh4SiFaN(F_fbd?CU^#|LVN<>?LNn0W7Pnw;M}R6>(v0MDyKU z<+cLTdz$Ly$Lx^B0cFWX?E^&|#bp8MGAk^aJ?W?xgN&WbdHTFu z^R$bvo}rf?rkXj18XdH?KdoL1Dv-61Zur~z8{bw0IGm*&yvVmdNelgFq*Qg3aGkSA zno%|7%!#~qmSMQ(q{m<4KYuxq10t-!&mS}fv^urGg$0y$H6e~xM*L_bAPj42Dw>^f z?gO{#@D@66$fRp3*Y0DDq>$T02K?B3f9(+ItQ?Xo*RiWr&y^*|*`WumDDH_-6B>NL z)aT4wsFP|ZeTzC%Fa7D$!#qCzr(RxYC}ZJ-&(Q8n~~twMC~U3hkEID>asUx27$LWto5~E? z$T#<a-tP)f+ivL%8;UwoxB-ESQ1mBaMSTefZZrT>CBEbrVOP z9E0TP7pW1%-pyKLLbdaxHH(W6oos48ZQC6JNMw=uK2J*|QEe!X3*#R=>5}v4h4K|@ zAFn;llE`Iy+x-E)Uw{)FZU;s$HY!h)ve2u`5|UFW%%7XReJ!&7SRTSdc`W%!M?9n_@+%I~(UK zvSMsV)MWFgGIv07UXURHwF(uGM2&e2apevvGCDr1GpPa3d)7`| zJVVQC987p)OHNSGb1wE3^I3Co2pP1k zpc{7>%^3q63_?>U9ID)Lfg+3DSeGH?4?*F;_hb3sQDQR^VtM>HrSTR_)Rn(-6wI41 zc$J~NDLl7Y{+o%7K+%sIf4=vHZCb=}5EPTF!!u@E47d%>n0KW-m{s>_P|wg+1Px2~ zZhwnb{_t8Koo21MIsFq8<-bo7d@BCn=V(v4UP-fpqymASn6P_xdDCu}MRc>O*ULTZ zUYz2W&C+mhoOxz9-B#E6aUSXzZ6s~h(+-T&+-Rj{BaE9pUWqYx{ zE>(q@&Q#;6WjU8Hy~nMDK1=iXmfpm1Q2hFk(eJjoOzT{|Lvdm4rk3-34{UPu>cJM( zP*6T^j730MWLD=iqQNEu|FyAVgCzA{2lLYV3R=n&CyeL8^}Ni$GM1;8K6DtObEWy~ z&BhWe;byx`c~8*cce7289x3l%Y^mOI+|04saSs|Y65YB%Rsvk@tSz%74F`VW zyP$}!lk?=*z0q5`u$K7>=R$jF5NsX7RB-x{F@&qID%7`=6UzfJfr*6?M80Jo<4kud z?Aj^y$esy0hwVw2b!V}=W~I`>6xYf=X<|Qa-F2NR?P3+Rh}(+z&DCH{{XjUKH7o%e z$%{&P&=qdCXjn>sBLFUT4nk}Q(yc;n>lqc|cb@X!8aG&81IRh0?G02C;0~1m;Jz%Jx+hq#6aPQ!wLM{= z*6+M`%{A{{bL%JUG=$l-2)@nqpJ)&m>wY*ajNrmCo3ABcf$pqHysdwNWVKqNb5=LKeBG043m&b+Lagk&$r>5_g!%k9t8G=JMaI`i zGQaQfj?Jn11g!0llPsD)*0Bx5bf=8Yi@H>CqkD5W zZm1+kcv#}2FrM9a&5*%)M?bB4R;R;Tb2iny45+spW7TfD%ob`9DvXw4gC)J3e1v$A zl9JM}2oUeg%~XIc;psQyDwviJo9o${m%``=3UrKa@gks@um@CZP2i@D9rQnWiTTpo zC|Tf4#SW5hJ-De|JexA)OU`hfno}$bRe1!GO`4}$#tcwPp&&k*#W#x=>1Uqh(|6O? zE}2h?_RvMB@R&R&(?>c625GuzV8(CX9h_V9W7<)6S)Ju3v{6tu(L}WD_LZIie#SV@ ze|i=_+85xDfykUvbXuh5un>m-ZL3LueCvT1&s*V5RgVwxfLzWS_mOP^|JdrBP(w6( z$wXVc!DDalirLTL|c1e?mYfba_P?YTm6Oirh8u`@%AVoqPW`@ zG8$S?1M+3YNDN~6!V|h`3ZDBCwt3a`{7%Cxk-`|yYSToIfvfJ30soMkKK$elj1JLP zu9%G8s?1)XQdsJO*nFV=M`e z{GR;Xd(1wft>YivNj#VPzv){36~KDc9O*y1LkVhI`$!;6M{=xfQq=z70U<2v`{EJ$=uj5mwyb5H=ync>~^RG%}`Txh*RmVk{ef`xH15_+PX$%k$knU7aK|q0_OF@v1p;JUe zX+=O9L~7`65a}AaOLBmrYp8+ujxhNC++FpL{d{I+=05j1_tZV-d(IK>^K1F2Oa6k8 zz+Aw2E_2{*u>?EfFPk=;13Da&$MCZYKfRso(G$B|H)*89GH(NGE&lT5%W(h{T<*^$ zlS%l-FBAQ>0@En9kAjFW1hvq|=WPR?@k$AM*P(KkGJy{iVw+fTfn>6ziXdNsAd*@GZp zd4l4D#dKS6(eyn9*BXj6P10+gX9d$V%3Aw!@4x#hQ*6WhHs49jYHr}#_Bw^%QJiHk zS^@t#jlrFu;M&@oy#*j-%5A6mwW1>SBePFtwLpRSghg*#UX`bqM!%EidV%A1?peJc zr>GB?Xw6NM$->JP^JWLLq~Q^~Ox>w!{viH_TneH`MS)O3RUs4oVMgpgZ0|oj(%n5< zY(n)EfnosNw_O3m{GOmFi*_R=gihhZ3WBM2>rCi4D1KU&X_|S@X+n;qy+rQxz-hPu z1K^b4ND?S<0luqP=mFYmI_7hB6}@97F7x0@2K1MRNDxNOCpdbdJf#XY!2 z;El2%Evrl|?I|@tsrMS~$SzbQID+^>%k0aa0MIUSH#OaXDxv2|GO%esNr_GKXtZI{ z5OLYl*S*i%taBbc_iWXse`>EUCDeRV=heKRY~QNPO%=umK|(J2j^}m{wXpzh&xlxa z4OLb_(9zT*BhNG(shU)>gP>w3yUd8WqVhUymTZGpr`f=Shtx4T(DORRi&Q|7+#U=X zSjQ8KvZ_qT$TS|bi?@P~taYmg`jGYCuLiYd)aV4`8JdS-SD}**BOS(!a%t+4TkG@l zmlUn|eXBeLf}9qdDFFtS)4JW4PMd$+6&1VT?4dN5x($zD7Ztw}Jp(%C)T^8cQSLA4 zPkwjlmZA`7d1#yy%xa|U{s3I$LOr|2qVKrJZreLfbR@RRhjPp2n^IljU#{SCt(#n* z)KV3Y=6ek4-sa=eJPUm7Xv>j^w>e|8dQWTBX=zYU{lwZ+njd@t6F|LRdbTpv%-6YnIz`3pLE6yY$@Kiw z{=Tb3Gmy)6ZSj$HVaPP6xwiY;utP~k&1 zF@a0FV!FMWuab%^kVZx(a0`|pPyI(_sRgw^UC)KCp6r=+!~+)csB){4+8qKb0ZcY= z@QoiZDX%`h^y;z5UA=NcBXIUr*u|qC1+Z`trXxiIQ=66-W@qKUto>cFJkd}Ge1SpZ zB!Ms)VO?u~TwdprSv<8ciwjqk%Je7ZSJ5Hc|UdEzW@l9-qFlAx&+6+9kB+@skPPd-#^PuD+3)vxt$u??MIF zxS(6tY1IlpX#FEG$3fVWt(Vo2*e&FnE`c~J;2sXC1ubA|rqM(UA8EiS=**_x!craI zxg72V6&ok%dulC}Hp5?;r;>;0W&E!=$gk+M^sW`cEa&5JG~jIn5uH3BJYi>YAL44o zS+%bEs9!piN4TC}v3f8y`=?v*F~u*&3o4k@<01(34l8OKoY~RCe>+Q<+o3XfTHy z!`OCrRat6Z|K)0FcbMKTk>~grbL5omigc{FZ{3_qp4PD-UaRK}CY%ZJoGWX5$BQu$ zB8T$1(ukMvNt=$Ct#tU3D^F(}Of;z_H-u5G@RkYZX(-GqWgud2AuH3ifl2C!X=ka$ z(!gbckCyisohO?#ZfaFaS?Hrpa$xVdp*ow!P54q;GSLQWRB<8e3ww8n+4ZKgH9#U_ zt+^_7Td%}$XvZ^0Y7I5wx7)?Sigi^E;1TOYrl;w*FIf33IK90wibOiHGY;k5FGMkb zFf*gl%)%TmDXiF@M>V2!HwuadKA=#aGJ7dJ=IE_6dfm~Xvx7y$%4p*(G0?9~ zwghvp?k!q)aaKa3#10~GMNkMsYpg*=-;flC3nDsor{ygoDh ze%&a>wJdeJn$W^{Ai;$Vz$rmmf9g@L)<+e~(kE!^LYY-CtogG-q)XS5ehDUrGz+6w z0GI0NNL|PiQ>gjrx1mP!jNkHt!5Z`+LzZUYUR!%j57v(M>*0G)gse>N#- zfmma7wksx0wZt64qFeVJ>_|R1hLWx6I`Z)+KkdH75e>ne70d0rf>dKKQqy{Eheayk z3o7}?!#jzFc`ct`3rLddsEX{czlyo!bXEuDFzrGgGwz`CERb!&5jIx~JvKnEnHeUZ z&}MealFm(7omz`6e3llItjruksex%rC!m~Y#ios`)@1^NYiVkUOy14~ns0N4miTWZ zy}N=v(0%U}Kynt>98YTGp{y1`@Er8b#!xfi|w zBxh8fAyjFbL3K62iD}tJ9uTZw)9Gi*B?ahDUE#M3V z)2qKngF-x6CdZ!0fRJe(L3rnyU01>usNJao16Xc#3G83$4{iU+>l#OD@Q-vN%iZuM zi}-^J*Jc{3B~?~=H0Xqi=58G!QPap;DHWX+MtpV{7U4gm>Iz>#*-NWC)oqqsw3a4X zBX0nm9i9a*(QEoF#3$%C&Xn9_FE}3Fgz|6P4Pi5wTXl1Q@E3}>xv%MWGr5Cm`1^zm zAGPM||6$Wk^^APCX(xGT+WdVg4t6Lsa~^ZCm^m+9%xa1L(sFt;OoOmUjd)l!am!geLd(ztTaadsl*xMYd|9iNOkwd78ZvOFso zerbkl#H7AjFrbnUmG6{4ne89yCLTcUZ>A-due4G|tw6Enl7q{_E5)hzUItEhk%ci0 z=;7NxAh)$na%=cXz^5iXF#q^_;?rhjQqp!Ncn=2*mKkF~jbOVIA2>ghBRKE3ut%^1 z^}dEZ0=kQsBcRig{?IO&fPb3PXo#-F4uAEsu@xUT>(s0=RbLKW)|f!*idlFK#vd!^ zT~ICpRSP?f?b5Zi=P48&6N1l%+tp4sl_?rwjIJxc!Qc3-u@XV=gWG9r6-fqXXJpgn zNyKpG)}^)+@K-xd*iWvuNp!{nn7G{%n3{*diuab-rxoy2$87zzQ~~n8P)RsZ}e18Nq=<&halo#HZB$KYzCvD#B zS6g2mxp|NYrq_pZ`gSBQz5GyImXGo2K_`?PO!ie{a_7o0vEcetHT!1(1k%L=6?1&EQGwEsFf~o@t^8Tw zST33Fv^+Yafo5sJ2z;=`^nh@o)wK3@mIrdJR4ctJD2jDKh0EED_uPU?0*yb00q0-B z4|GyOr=85g9XaO_ZrjCj7MV|#&YzzpNy(oKjmk>==}~^m$KKBz@Kt;^( zGl-<*y3YM~?$U4YPlIkyG&$<_?aQDyUA6;<N?4JWH!2f_Q6{-F|k1z>1zg1(};>w~K+C=dp_pz9W2d6q|dzo4Rm7!d?&-&#M3 zCQksIR4>RBYqP!V1C{gdL1Su(LW}9JE?~>dL-TW`teuhC%o`+ zK@f~iAx+I6dA|F`=$0kzx0=c3p@0ORrLaGqyT6sAf{O2MPmE z3Sbf#)J%MPVW&x3RNMds+e3YN(?yMC>GZ-2J?+O+9ftd^gguMl%JNKilC?QK_@xfQ7l#@z<_HK^cgX9t>m#Rhk6} zwAImb7tqfP*KknpVroFMh=%a4wCyLc>gt)R23I(Ct{JEW!RN+PI1N-99JkK|0`!9> zLmH^(TpowV2C0?t&2On@SUvro>i-c(qin^wu#MHDTe9BR5&$9b?=doQYblQv3Bd16 zuiYiqh%~Hu!f|~+5Uq`LZk-_s@9TW2)nePfJ{$`%Sa9M&xt60X&MB^)@3y^e)w0=@ zqS6M^tG$_P3haCabdbzfq=IJkv~tPvJo1m`TUQ*F@{CJzn(xI3e4vR;P7ZQhn(oN( z#$;j_P%F)$vCwXH`AB_gFfUUkxyLaRiXe|)l5^O3d_~asb9?TsA6~(MKD~6*tYpag zbXVbP1?SCYq1i^moy1lpg=rF?SI#RG1FpD8iOGl!|D|FOsLv?@F6ORzUWkH!p)o4x zrtzz^Jf0H4=&r}DO0>6szCg(U+#(Sj&xvJ^A5Ewi(=ZXT{L81V`JJP<414EvTl>|m zy)BhIS8!|jAls<}P&Iu|Dqc&r#j2R(ZHIU_RS-+`6nWnOFcHqG?rTpqnx{ZQUQ_#S<{D_6Df0a2m3ZvguG#4p;;4|j`5|r49N)kC}~Uq z*|6<+ga27BaeFW|{wL%3mrLcPH~V_AKPrn@a6#pI<2IpB_Z{vcJRWDzVwFYn+oK$w z>d!BmKr$-;800mcAL-N|S;R$5WU{uYg4Dwp3^Aji; zZwOLoi+$dojRQ`2d5?Nj;A@Z~UMjzIY~P#)7JX z9TXQwaKs)m%KSm0}M2nLiH(9 zCk$Isaor80PTr3eb5sA!RR6KGQ2n`diCwoSXuXYq8R5Z~G_PU8X1#A-MgOcGu~hwe zwd>#)81m4>(44t*0Ni&Or@}Zp_IRoAsU z0NG+f(crb@?l;pOIL80UG}u2J6FNLD(iff&h_KXq5ra7{(wd5Yr~vFYuqzy%17K&W z@9a$f|JXSQlk8bBPcS?j_;&dH|5ymHGw-+tz<4H3k&e~393JZit)@E(zo4|s;GZ6u zOvVdvQxFzYLL|sJka1aJDNFh7JAi%TZR;PF>b($x9k3$IrqJv?_RPK)2uL(SCl&wW zRsKODT9CxV96c?9yDIpA5HBP#GNya+?CbqLivRf0KNk0EJT~j+{MN(c0;U@AZN>kq zKm^3jD!Xv)-v*%luzEi}r6;{0!`!9jwq`X|v9FbkGiw?XlzimMpB}x?dkhRsL=FMdlw0`Xi^^?%LO(KVIp2ics(c)b;7VfG(pIJb{(@4`4JZ_YHLj z{9p2=KTi6`r~8hWo60ad!V9b9-S9wJ)92DwiIK)I@;^PSqo?-I{8-_aL+DPT0>&^W zqHsaU}%N3Ckh?uv?@0%e}>uum6yfsqKJZ?d0$J4oSx%r0`*_xB^W`gu$aOJ}q1 z#*|C9;qeb+@as=9AsG1t6_0w&bnx$EZGr7Jq{1jd6`|WFu?p>94f+oYxNo;E2%hJ{ zYM9S_m=llXQ-YuTvF%@eqGUb>AoRe;xU3MWb#UTBunU;b7)%85$0fo?srS$6g_;b{ zVOh~93}tH8eu&I(K2ZuBat&fbm4E#(K>zeS#y7ZCp>+s;_!rhaWY_QPmhoMcws3bf zRElFM`o;Qts!+gu{Wlx=!3RQ>-|Y+^3D#D+{Pi9C{v}@28q3zd6RO0!7}o&gZ2*7%Z~VJ~Fh6L@R_I5L&0@k<{JbR099VMwpu)d@+QtQD27_Gzc5j>Xi8glihZrf>JyD2h%?LXA zjgKeFnr|)>y!G;0HBbbIf%ohNgtT($Q6K0aGRuhO1qJ6>ufOh8@?>Ir0sI*?zNup_ z+b`ksX=hTfNAW`AyPJeOb~JsZ&{D8&p5OlO7Jmd|eIP9ukRvc=`*+v>vI+Kw|2)G= z3C!{kIbRR>QlY~vHoAAxh7j;#1fuoEPRN8t8U|54^*8^rsV%K~asD_wTtZG%$C=u4 z#ct&5u=!LARd24N`#j8a#6Gr*o@u+CVf$y$%YPkO{((ZD_?muLg1iB0GfDWJo39CM zhX#aYJ!_!r)Bs?r$)<~u#-jrWFd-;&t7rkBHyT8qA-D>9{{7tkalVTW_Pr?qH4cu$ zHiDy=k|_0oYiDK&0p$9fsAtfO6tXkLUz17~+Cev4tT}SEL@|CH2`cEEpaj3`b8<*^ zr-Rq>^{h?B68{CS%je?OZKM9PkM~qDjcZgxkCqzBL!HJ)mcek4i5IAa)C!PDs>_|@ zO_-TI>;8uJ3e#lzDW1>^KRl%)m_TO4 z*mMGJbBgz07K(~m4{Gb-7ilB|fo{-iFN_749p1B4<&&LD9cGySf`4t)e*ATZ2%{D} z;JX?Uc897h3}Yn`TnRPw{Gs235vL*_wz(U2=jMz>Uvv;i^f8F&*~D{hfSGjPuamhk zzEneZ2y6T=mi&H**WZ81(4x`aa}gW|O~KzYYl#)0hD4U1yDi%Z5Sy`fQ=&caB*?p(?lkWLyqJQ z7NP2gUt5FPT1;|KT5YSt2{o^_X*(9ESToi0Bvq9g41YR78oKJ>;Mf7DkqQHQ*lTI- z2cr}3za8Cs2f$9^AYlHKv?lU6xG^P6%{CKgYhb11iz`M;$2|;9yr(N~NEZ*Octx01M_L> z+5uU;`fpU%#(^ATP(NAKcx|yzUN9HWG;$B7aZ5dWgZ>J;U9s)u_?oViub<6gw#<&( zKpxqxSsP%c{E4M+e{KwCm6YS^AGBDTVGq{a0L5&4)%p|dMGBm@lhZU$lUL%)Beld- z%NQY%DOV69m=X)P-}?D$9cUdiwY&zVHnVA)6*^H*kht!^kXB^#_2e^WKD&gR5gGHUy>j+4n*)+9HxY>RjOASE^oI2U1@ni&SHIArtJt;e}B8>*THE=H_m6& zcPkzj4j}qzk12yd@6Q;G`w2uY^npwr!^h5O@2&np1CDR%QPz_19I#oG9i-yXxknSNIDWmZ;N{#|R# zYejWBHr06bJKUhKFo7;VQi}K*ccyMP5+Y>PF=Zz2_B?0)ojXP5y7z+Dn2oyAv}nwG zbA?l9&U6kY;+DdE6Lg>b^ddDhYw0pPQ(P*S(V>Hu`kzu@aT2EEVU9qKNsA=tTu>212(zaS3M=^das zn8kdDJVo=cAjVYGr0zyupEA^6JT$q-?o%cjukyKtb?W7?7)Mdqj#KG98JMN+U>os& zP>2MFM$^#}{kz0YTlo12KHPfp?1Yk3k)I^0&XuR0vF-l^|C z?{Hrp_YX+1)Sv9jIcb~QCsCLpTf+ecGN{F`Eh#+;_$atx`gzE*Y3A8`hEV7W>xMv$ zSjU=qyOJW@h7zy(P6O}yPIiN0N~X?a#%V9gY$ZsKY)kLydqH$cB05(fDNX0{xp$>$ zq=_KUlqEx*cGX2hL>eJWPOGSoFlEbTb@bX&p5Yc%^~aJcA92y8TXv2miG}MrIkT0g zd8}s!WI2rcKGC~5-_DO@H*|KOc3=_JX%0?X!5L236>p1sptY8ya{$ijFhV*j6ZnZ3 zJqU0%<6+iviONbk*>LD4L>_%$7DJ>`+uPi}WQY2UOG>kDR)m_O7eo&?GplwqUrE`1 z^32Ps`!&YK0QjAXApYmBB$HF!cCm3wP4$HrNJ-IWw7Suli1v)z*659fF!{vDbNai+ zTDGHa#ii!{kt+J9C8Sl-M9r6&k54hzg>h%`sjMYlj_1*Z6K!QF<%}ZM43e+P(7k}Y zOwix5>kY!R8{l8qh`00ZwiL=8;Wc@%ZN)&QP-UQwli7(Val<2eFN*i6qRNMiTOMgi zR4O0IN<(lrS)6B)7DnhiF%rGfnY3MKf$S?^GPQH6s)w*VUo_<} zvuZL=TDVNI)$(nDxkG+f+WF#G~W;g9;wz)hpJ{=FM&0mU~33y9jA+T5@ ztk;v^CNR0$OfBBag0F}e@%0UcBrJ`tVBq#i($L8ujob&IFmG-2E0eCoyQ`>>q*3(8 zOPfU2t~aJ;rQ8lZurK&7m8Gp&cWRZ)ZdiTmDZcyG5sYHo2kf|8+j$|~T9?zx0`OmZ znfBF~MT<{(u&h=b0Uej^YIL~m*TdNK+uF9`5|tBQcFySPHYVEV`N-tK4JNPt-lG(P z5#FZf*(MG_gFbc3Pn$Ti)gp%m$2*lT};uq6_}3VmFXIaX>|#hp;P2 zdJ@4g74=FGpRp}I!CWUtC0%(Vrvz1{V4i2iOhwgpk_UBe)cd+T#X*ZLES1&M289;lOJjL0YX917cJ`U%BR9AsUG3EQP}_mjbO*DZ`d z7DI3ef4LfV-!jZ7CeUg@-D}S6-DZkp&d3ZzjFP(uO4+MdBB5CzRr1<=XX62;UN6=< zZ7MQ^*>_DF>&DmgT8k5N zNV^*WZaG#o$;Xb>IsiJ>Cn$h~-0VLMgMC#1fNxs3@eU|o(zL|%Qw0?#g&`|nak6em zUwu_j!X1ZXx<$mGT)BZWzQXg(;M3{-g6eYBZ1QakU@B!(SWeMly|L~BF>%P0Frt;h zI|v}l-WA)f)Mm!6+_-+dl32r#bx8GMH)uN4pzwL`3qGcV5t%v+5ZsuS2+bEQd?Z6H zf4t87%fh-vz$`wKhJ7)UA?tR4*^^jsXjs^6aU{dw1K+}}E%Q>D)I0G?F@;w8O=HzQ ze(zC1xAD^`Oa}53Dca*CuYq8I6mq|6^YGg8Z@#lk;S1b3tC<1TYCV{E)!H!ZqOO~E z&e&W3_|KqlmPan>XfEBYP>@c)?07tLBtDYkJ_@xp%?Npvqw5P-w_K2JQG#%Rfe_IG z@Dr}vb$HE!h)!m7Z*9L8BY-a^Z|>fsm7f*R>*slxsai1_^$pPFN8Y8-b~ykcZx(#peR4>%Dh)Y$S&Lo!<|bUmKwvXyMMU#TIXV1-7} z@hHGHJ~|DB@mj09ce-EhUW#@n|A5%t&J<7;$K?T#)>8!GCANeaXAa$ES0RxT;d7VG z<@p{Ea7n?&LZnZbyo7_MG~;eWF&dSp$=ZhJq^A>zbOT^_%U;MakeYQazJNvzr^lIP( zK1gPR;aX&+b5xhcuOZS_1R|+X1G1D|jyq}v_9*qSk4Bc96AeNBr^dv@`?B>)W;j5{ zBQSKgHlcNFjrl^-Q_Coy0`2K;7Q>BucC#0&ec#tmBt;=01SV_rbu+{q0REfJe6(%y z1Bjc0v^r=)tviKi=A5E^M>dVE1u z_`u-w(puk{RlEz;K08V3DWyr4Q5HNHQd+wKE2fi1B)R zyyS;ur7W94XNQ+?n2dR3sp~2;3>0+!y^UgaV&h$atliVpU5dEX(d}r$eGoX#{A`<(F#| zg4C*7t0AIboibckieFFqeset^gHrs z0UA^fYK?q67^aX+s@7Tn;OEQmeiLORsV*ZZ0nRnrQ_J054o%i5d+baPNl_T?*ja7Q zc+Y(2cuiCA?^_+o#C~BaGxX1$E1H2u0!-Zp`}BvW-NEpV`+4(@n0h?B!OBw_-J0Zq=cFX4>(E*TS7d=RMjf?O%d4^whd!EAZz9GmaWNm_B+l)9Z*M5ys+FL| zu>f<(xnDQH{KJ45COIfiHAYoggdEN9D-XEYg^V9J=1?I@ zk z^hKjZaBi@zIx}&YfX+5qh(`Z9S)D1g*lCjMAo>}L*!+DL(a+j0AX4-$yl8#uFKAIN z!_%-C&{YeRX3G~2sx7jzu!tYWzrqMOr>p-or+|qghl`*I1Y!*;mAj7&dR<|y4^#5T zl+{&TwpTq_9u{gj~9HGG31xL#2{pcfHkcF*P(KG5Nfja7=pXon(w?*!a$o`j8W%}&>7ZhB1MS-cUb78BsW(0hz(&{(RamjTZk zYsG|iaE_YA=pGLREhqHvS|yJgir?7h=ZHMeP69It6jUSJEm4Fp(Xr^lwXLEl?sDU6?%nR@A(R#XhC}vnXahqI{wCS9F=rWVwI=qcfGIbdwtv>mh5<5nVRuZQ`EZz zHB|H|ijw0NB^^h{^M_u<{%}A=FR^m|K0m$vup6C7yS#^Iqmzm5Kx35=;3Y`Jd2Y{S0VK8#*l9?5QRetXJ#kO=SAZRY{&W+OMPS@qKV2V)HH zob}p#42-T%sp3^$KOjz2!BGaY7zN&`fdPS>s`WVnE@LFxX=CKx(u9IW!2N}y1(*Dp z8H23prMyAKkVvu8vW?N$6Q7seGXvz6nc=r~j#@5N5qZjGY{rGwR1+xpH0F{OZ>MH7 z54lRrfzjl78LibS)kGQ&@6e+x5F@Gnc&d{6DUXqB5@ol^ovNxbwq}w7bJ<1y`?SD8 zy1?oD=>A%;{u13g63aPEZo46z(ISGU)9x#{q)lqE__%i?#2}Ttg0U#-_#NAmcD3II zpMEpu?Nn43XwA~~wYw8Tq{eqEVgot+v>b=<&85;5la2YJh0%PG`pQTlI<+06iaHq;wkj0t(RDVoe}zzVqh@3`TVhYE@ar1?%~#ZWW*{)oBgAVp=-St zHiL95zwL2=`l3^!Mp!YZKc+k?mUh{KaThlud2_($Y|&F2tH1dzhD(r+wFcAhc#`$( z;Z=#s?BU$YXE)FzOXI`4tqE$9`5=UBm@yP<+2H&nSSLmUYQ`lHifC8o_ZhSnTdYm{E;oQt;CwVV8=vOv40iBLm6$6I!ap^@-?|C+Im5B zG^<&l8TUb~E$uh^2FdQqPoBGb3r1xd%MFTqLEdRY4)t|4)zl<=uzXMA$a|!gB7DoW zF}+TJDS-bzmMPry;qF1r`ldT@USs3i&-*_{tprrut4c6PH8B;ea;sw~3C?d@ z1oW(i7tOz82vM3qPR_67bPvCov%ahtLo!Vo_f@lM#G`@f`R(iKs!Wb>@fO?JeBRN4 z6`f-NHACiVx3U^#CL|%GO!ys<*7MUDLrhx=s%czV1p>4;BZsKfNCOq0F5MSiAN4!h z5=7(xhVMNN>r8GAtSw_p`g<=gBMK^UQ{VMKMLnW!xxi^BEg3?(eU?8zxpPmjFKuxv zfSzRI#?+ohmQjsyzS+Zvp&b0V!^Zu|%cd%`{1CQM%h~*oV9M{)pm5}#n~}u&1nLCY zd1o|on50wN?%YHCR}**a&a{dKsh)4`NCTsd_8N&f})mj><(1Ticsig*Pjm;pt|CL5j-3 z6nN(2^QF=pyb#X$cHQ2-q)S6|4wkB{g_A08k;$vhti-rHg4?rDW*c90Cc8A(ZtcdL zPH0E>L(f^(5(e(@X2BheHRLF~>!$V%AHLD3jdJ`zT6oAb0;5ccRBe=UhZ^a4G(aa_ zv*~9QS(YXw)^~2@j9*|iDzn*@{kD;t!P%I7TS+3!pGe(?HfcyTg8TlH#kstGy7fNj zqeg-4S=KpgErsWAcOkYT&d&Q7W+)kvSs1MA{Kjhj6VKmxO>_V+m#rZt9M-y`3Y z<=aj}d>Wo{jB(zx?E7r*E4X|2p`D$1a^|wQTld(Gbm(kWtkrT;-Y_9~_OO>5q3Uh> zDI>$8=>Rd>Z{bdEVdNZ$P?Mo*V}1VLoP@GVv*6yA1U}t3i}!O6K#Kjzs49+$)@DqsN^EicQ>Pjk*1X1fC4JibFXx&U_R~gg1Znta zem(wG$eGarKp-c1^2S6pyZ2d42yv+vz&`BjrSg&UUz2Qy8Vg%Y)=FE! zAa6yR5w{Sua+JkNh|~G)diu1=&+#<6b4(?xGR&GQ!?}o&KF~hJcWNP$@ zS&Pe^v3P@&R$3f^y&cbd^Nm_CM>)}~E0_lKBg?X`A9Gkq$s2o#$K)BAoGBB32Ff{6 zIdNm}>eRr8EZu(|e`$hZZvne?c6~j4)fRG3+F)L!|KB~bLqh;QxG>WC1?_l7L4%5S zNZI!H-V*YirJA%1ANI?}OL+r9WgfEIp1Yrx^?)Eal+|Kkh<`FXPvKTU<%Nt<5Bkcd zo(x@KlZFz%bSw7Pe&j1ezRa{Q)Xk?@LJxFui<}GJz!ZDVLhiNyzq|jUrJp<4au(7L z`)k~zw)w3FZWV13;nFg%B^^IMtqvni|rMzyx)4t%kFy8QUCn;gXnb-WC&cVE_H%yRT0pA{=fE0?;FIGcVkXpT*&qLCi4qJY6Q)!b zXfv^#)57Lb3^+0cm3#I7k?g-#o0{1_3+pxd)}@2PWMK3IU~WRe+h;EP>V9;vy2U9M zzHtp03?|Z2Afak}_Wk~&o=ac^BWGf%kLXVh1972NVpp`K0IH_o^Ll@US{EU8<5hE^ zXuLmRYqCfCY<<>dX^Lh4iGC&+N=&FcSon=z{!Y4Ox_y13o^}p>Kslad%no>NMfn_1 z=9e4EP7+dIW&#{(ccq7We+MmBz6;hBBeIKsLIfn<_;)qAh3F&4awIk8EEucjP5+1^ z?^EJ$2F=XOoU<^Fz6iU5HMNf^@j30PN;j_m0Y^~YPTFUQ=9%CufrD*pQe!l0=mSm$ z>OWcH5qKa*GUy|SS+V?;kz=>7yFMCQo+M$nH1mt-9O<79`}P4#_Y^59jxGU3~0)rYZuh0{(ufs zLI=VXaY@L?+m2vwYrlGzY|lfp zHNY4@EOoF8_$`d0gU=#+e)VJQ1C$l^WvdHRnH@Mrg;5yMD5Na8^Ct}P{D@2OxW=(? zm2cYmSl#%D@sU#uYWH4bwLOKCa%p~rH&do&+EmG-w43A#_jq4)pe#<4>POS;}McS5$&h<*k89#O{k?{P}=3};Yr^E|6r+_BmM`^Z{av1 z0!f@2;E3;6KcGeGb;_xM0C=v}jbH5j;7=9;E_|S%UO#WqagtjfGag{zDPE1_%20zl<;D)LqsIz!o%|?GFU&WOfMPfuvUbKXCw} z&Kz3?HHz+upP(dRhD8TlR2T?W=;j&r3H;TA_czj}-jFD8>_DycX#hH) zn_bAURK*hL--yblhGE1GdxG##r?W;_)=jucIi>op>cC0;B|o{Gy$a4ySn7i@*5S~B z2({SCS0zjT@^|~M;75aDq9hnh&H~;p8qKu7MIi)`gLzU!>*GIog+iDRIVfo=Rk3_B z1*0i9!Kv? zmk(HoQV=Y*$xUSU>xk$6w{IiCm$Qs@@UZ6I9lUykS;&z6LW#}9M9|av541}l(0CUD zvCM*NpymfZDWutIfq<;9Km!8>z?m7#+jIPh9#6Oh&a}5m_3%MN=PZ0|b~4H;@tBHR zUau=<`+`9^h1K!(z4YR`0Rax516*)g^&V1&#?1erOkFq9!s=S z63Sb^ajWtx9@8aIb88}GH0cSH{HQCwfR}>0?G0*ve(rwFw>N^kyg7%oCrMPWVY6SU zp{Q1j4vUB5@^Ef_PYa%~vBj|3F8vf_qzwk|-iL?7AoR>yqcEV8RI0kUi6Usey=CF50R;SGl&pMoOk< zvnyjPvu@Z}AS%6V=(lN#{nrbj@^g=Z&Xjt;=qW<$&&+^$Uxa155u5C)jGNJ&fAZxtJ;uo`k9Y^!0gX4I;wrZQ1n1NYfFUe zkB8&)OfBAjf)K9|B?>12L1}rt$DWNvMgu(`1sv_NMcENg-8~`UAYN74qtid!Y$ z_J5V9gJWaEh~O2Q!&e$tisE;L2dK&{a^pmuAcXPc={!TUc6)ijU^ABs7lv8^JBzF7 zE!l$T2=lDRh#T6{Q@99UZ)u(V{_mB^lm`$cwWVZUoqg_&k~lfeFcsF)t>GLakI&;v zY-?%dgc>#(=HPD*Qgaf`Ei1pX{=6OCcjZ8E|LYOsvH;)_cNcW;ehTEyAlzN?QbGp8GUhu7!L+KEc#P*77>f*(^GBDNYe=CT{c@I; zmVA3Vc)c95aSy#k36;14mGu+9hK4JI>oI3?4m;4RJFX2c^%#Dg?8Yg>f6D?zH}b&5K{u_UUx@`N0SEj=IU4By1dgZC&LFUiK2lJMKFznKWq zNX<_W1#v!=SC6k@_23S;XHPjaO(9u7KE=@$M(n83*xmgvIvpr$2AaiA1&x|9U%~UJ zAztR)CEo{T-(0q9#HLgC!;HPX(7@~%iWs}bvAN1|)@)Je3e z2UK@^UtSCcP6qg@I*0j-&T0YNbqU8n{fgQcHxFEkFtCr!eb0{8c528w3;k4rp zMkB*tgo|EBLH(toy?-S&fQ(VDCqKi=FVYAoZdf}zEL8=?s&i6L6?e+_*VIsOs^FyOaFZ}-izWH9CX??dOFoof^0N_djU^Db`Qj%p@c@*s9yqQON1~& zoC?t)3Ownsn_0gj>>WHnx=Jq803IEAMI)H(S-AX~WS6>s{j_MDR{zNjvk()eFi3PfKW1q zrjivpEtb2FuC_PB1LyLF1u_P$RDyEpHLRwhPgG5YnkXx;SCg1j8yB6ai`!mTV_+A*Abtb@3s>fc?Pc>B^om|@Yyv{_nI)mPO}l~QCL{G ztmE=@6PZgzoFKEXN$#@llyO6J-6m&Wo=NTn0sB1mkhHv}2F9|hDjYVoso z91u@W&}BwDI_lS;GXl1U0hQFnRr~Vo?t&lWZ>+IGx+8x11 zRnKNMM|czMky>^vEp?X(TuD?0`S4-ouy9AG&559;&|$-O-U>X{dBaY+st!vNz03CV z1u>6G?B+-Sz&xYRm4ybNKwLHEl^R+Fb8~MeLp{o7df#c?MF4M0jbZ z3mHMebb-BVvx=#UVMoMTb7#?AFoC&jNB9Q6L!3r@AU=h|;*<4|Ppdq!7{z;;UEhX^ zZLq|FVC>(I2kai}Xl2rU zooG<8+v(Ag_5gD*_>#WZ&t}}~(sOG296#oFN2gJmz|(X1jNsOkmeNwnvp^*tdFAOE z%Us@_MXk{V=e>K$g)?+OSMQY-uC+v;s0Qg53KgRq(ekHdJpGbk8$w~0UADbDMf1cI zC3cQ!aGorlYjX>0-NQFu`61q}b#2>*H<=VpcZp2diJi|mK~bD{Zhd!8cnVk?POBa; z6bdQ##2&rYos@yDz!$s_A7(Db!Q}Q?RFFu5jCv+%y@f7c3$;jO<9Eji-A5 ze&VQ552nx%Ba>xOIbzOx+p=Z=i4nvhF*3zex{=8iE~dXH!^Ph?SGw(`a4A-!Pu*#= zDpq4XPJ=P7d*NXS8@GX0<(me)vTC(dF?;G?tGkwfV;(Nu!8qX!Wo2Z7yOTC^Io;O? zLX<69hun@r1ie60pUzK)uE*zs=d|L(t=^QZ6U)TR#YgVylG@Lnie2ypX~$$m0AOM7 zN@QEwL}*l6_0N4Y%Bvy_ttmf2@klSnV}-G7r(WcXy@ULdE#O}#=SxX6-y+-+FJEQW zN=<2Xu%rL3Uqcn96=f#o<;r;p{vzSuf)V!zD!2-u23WOH3no2iW#b6H_ODcCHZYQu z*fYs!p#wiY_eRE3MLxaHhf`eRT||pFQ?^`RmX&T(f9h6FhYZ6mwVp5{FkdEH80*GH z3#l9rU%6l|6(5~+ESw1##gDf~=4b0A@FV{|ZWzda9gWmzu6aunaUn6&9QXFHd4sp5 z(^BD}6>rt{g0mlbdHsW|R4t4X1VwbyCLfGUvwc=*@B+#fAdprnFG^Q~La0c|K*3c) z3hlO+!Tg_z`j>z0Zo9y5we&apw&&unT#RdEhlNT^zNCJ;9P@;`Q~Zzk#Zs9--jC&G^OWGuXuG#M5co43bUG>dPL zCU3@rQ)u09WZD%86b`jL)U1j?<@uy;q$45cfT`?&!%9zb6<}vBj($V2gaQYm7%?>! zo1$g!-efdtm=iqR|9*}G!2ay!&t}qRZf?&P=|(TFSWSeAX7<=3gxMzpq*oXAvbaXy z+|dGqMd%|3la~UEoruR|lTVh`)6wg?OzMK^H)4CTU6cgR4C)?P138%9Nt#j}lMBV( zwb?YHQeMJsaY0wWR1oV(>$$>Z>N|V2_gN5`mM_0mnpyb=reVGKVFD*N-u!Gn{+q@{ zb3VNmvF>gCCS|OQr5nqJoBXJO$2I}Y1F=T!_w5{|aXI2gzT!1Ayh=iNIj#pU84Rq} zM_iQVJV@M;O;Lsyh| zr*<&O+$*|a{sh(Hb7wCv_RF-Uh!4}oTUL9MPylDZ+F@hFJ$9x!@mzOC4fz#hYQJC# zOFI=rO3E!Cqi2=Qry)~G2r!rGhk2o$1iL8bNN*^-fKuj7-hjooFKW0Z>_aI}p@}Bo zu$=f7zfjOI4nv#E-+8!#8A&PC%es+hh1s&ba^S|zn89WMz(rPkrET;7s{87&rrS2` z$H2fqA3ziYR8*t|q()kZAfR+lN$Ktq6?~Kuk!EyAP8dBH3Q`h78b%M;=&p_U?kV$o zpXYnuNB{ji4v#~{?f1Luit|3t>#A7m3(=$)YilwNxUo)%QjLc>(Q9B`+IZ7imqA(< zrb?;!>fOYEO*J0k`XY@fEx}%S+~OYjbd*YIAA~KR0jDE{1GIQ8n;s;^)cG6>YZz-b zvCEtfab{v8FO{)qZ?7BSP?Tc8S>Eh|@+|>T^W0we!m!I7&XVEhspB9qTLdHl<8~0d z-!t{H9jn~kwm$FBIugRv+E#s^&}ox-62?@UTV|#)a?>boH1k(HJtGQw1_!UHjQb!U zf4M=JhUW|6xeGhqMfGOEcSIE+lLeeo(Z(tBp6%EdN9}z3%-XW@g8Zkv!n>J0qb(UqFI$&Y&&`eI|X| z>f>iZuZ!I7{hL!P!D2-U2;yw9Vxmlsnq$>h(;5&MSbru?DeanB$5IBJILCM0IL5Mw z-e2i1ZW_)^%~QE0oA|gVF0V_=+^{iSK86Vw=l%qgQp5JH%zI1TC>nHYq{j$4CY5%h zvk5ft_>LhJUr}F_`wBk9(R*t{bo8B^@fh{mpnGtSZQble$NQAzS^zO_8UjU)w_8Pw z*i;;HZM7bd;jd_(*1nrKF+b1^O#KLij(J0=#HA_HoI{VZc+gGzID?>=_S!=Ax(Pgh zEms4@**x71x6Ven4FTKTY2Zs64qv{m)}OnvNkTvpZo0qsii(*?f4gkgD6pGYRzem3 z3pZa+IyFKL0lQ!?>n{vfAXJ?&mbj{oPkw6F9r^kX1w4mzvTwxh?_iDhxW$Ru&?RGcO#Cw!wJ3tM@Mo}(= zu?Q93TDU!Bp*<7;uiSw+^%|{ns-W6rCAmG~y=^_Sih8zcbtDl}%H_G_m>c3LPn)AW zQt&<60qzLW7{kXx!a=QX;?iQpG30rtKlSu=f;}bwuKg0fqm{xky`92&T~JHHtB_dF z;vGa_I{&Vk95c{!iG2tR+?teBw|Xyv$4` zMSVEs$%_+RXs_Ow+7tgi`4>(-I{uQ$Wq2pAQ|&{9tV_oycpdPAfDMVZ=t__GIs=S?qhQ=x#F{ALq9wn}f?goyqQurhJmrv4e4M~0 z$j%FVlkcoE;btbD7>Pn#<<_gI-)tx!UMutaI5VtuD~#pm#x zy0EkM`|#8dTWoEeQG{+(b4=&+$CILj>0BhQ(&`KVEfLbl90A^}Zgi8!n{G$S^z^rG zvx)ubPLGQErUjj}T1)eky2z-i!*!oJ!ViJt}${CHv zKJ?QbtDWk3xVYO`;0AyWN%D-2&1aX@PHz(|IKoDp1+C8ox`fE@@Zaa&C->UJY!A%C zyEvM&;;S9!tfv^oTprduTm-$M&jV}?F4GwtEIRkWSUK&K8D(;px<-~*fSA)vqz2%_ zvZ!u~Z!IKa!R~&|Reb(!#cHwBz1ko~<_M?+7C9+<6BhyXxV5e+n z1!ExMz%ev&&a$d9<%+*ox6Ea9P@s)a9v{D9yGyh!}ryn2NKU*A-_Wwtc^d z*=ys88ign=U6wda^)Q#}x6+JmMSBl`FMY^<+xLbe_Y^>`O=oWh@ETYJoo10XI`yziUR^Ua!c5?1)o%vM1m*;u{atJIEeNm zj`z}yLe+I_O-Xcd8aktR6PTmbgV>G7f^lA4vCmsTuBAvqkiG$A2f!Zu96Nl)(k#D9 z92zL-sT~yZ8ghyUFLJ0APDF3#FIbB-zGqW5sAF_)GzRI3m9Nlz%LY@42TYT(a(hh_ zJL=Da7L)^S`MS-fO^XPw4hR9_DO9bIvlDHY7r@d#EnjKl0Jt@JG=N`$ZRj$Cd`b=SLf>^q;9 zZJlTU3BP+2KUyqxJmb0sB>YCo1#3v$5~zXz4e(rtJ!%jZxg0$DkW(gnP1I>d-q#7o z&HV;UE%%`lef%8kMN^qsU#>*xJk;vy2uafepi}Ag+EL$WTz+W6#b!|uBxu91G&;=uoiZ1+xDS-uqDwl}b<-c;y(+y0hP zH}z|?KX;$#py&F4@Zy*DQGf|Hg%8*@uKI5J8)FN1Qv`Q**3d_ty}Ar zyUm37DugKs%QJ}3b!w_@k2h^kt7}cHM5C$|_6=v{mL)Bu4g1PAHr@mHT6m$R1YCFr zKs9viTJi7YPoCqu=C$bWh**>*8B54Xk+FJ=);pD>czCvNE#=5CDgzy2Lw_x1wrlyUki}dZ&AfKZXSR z1}U;XFIsLnfS6`AI;|kNJ*Hur%3KG~n0-0xhyP8x3%q_I)4l z{n_nL4am1`x<28@A?b$`QJ(5q$k6jG=RBM1s}5*59v^U?Z{v~EM#fC~SohFYA0tkm zdEo>n_QiDd>;e-XDeeJq+M0{vcT!$`8?~uAT6ae8+=^sPLz~Iwfv3@%B;>`VBsN^t zh&xw>xO#tFHKiRc$5X!0PahWJUpXa@NzZIC&ncA7WBXNSERJlB!k zdbjn{Va6}5Ic|bGriMj)a?Gjxv5-!yfS<{4_C%AT^O$StM8 zVguML?6U(W*(l)cO|lqWk40AjlpK?Yodb~LM4k(58k@i5}nUR|$vOLQ7+@XH`c z4LzjIAZX#z?>23j>ZpVv0sE8gi!>@s;)E&ufO|+Aq$UK!{@-rZZ*`0sW|U}bt}lWp zM=2X=wM+WhGP?5G97tv1QHScU?W(V3wGRgBa<+S%F$0W}R~K z{NGr50o;&;9e%k@C9cCV9NW^o@9>N^LDe)haF@`{YS8h)9083D=YfJdj=bqy(e8~^ z^GyziDfb@YQX`K+{aa7j%BqU-a0cyF)!XBqf(rk75#v*S6cAegXe(s_Lcl%2?zE(*TR%KVH$!pX0X5ddL-Uqe$d_~}S<0Nr7 zr>O5zR*x9KbGuEi`kK`RSF!-zM;iU-u7Ux8MbKa@5JrK;htdzVIro`v*B(DX0gHE^ z+k9T*qsf1d(NSZq3+vbSfTB$)fd~{l&Ft4B;4!z_kn<8BA2yWP8BG>|P)mZ2MOudu zEw*g2nHG{MHD8K*yRjIo4lqjL5EN8VHL%?_;&5_%X|EMB$KVxXQP$~$JXY#k<(m_E zw%`WNC{$=r7!s~AO02oN>Lp0Jr$K}L@bH7QMEURvT&c2c69Z5Nqi%Q4n{#bn5!c_5 z?pt#cmN{c@WRdMTJxlAKpmDcX?m16S+k%x+w;@$~&GF5}x*a8#Q|=cDIfFukb!d9W zP}h0atwmP-w)Rj1@|C%Ov#K>FqiUH1zsPZy-cfNI&bF?$Mr~dNq<#9y?pKqm_w1Vm z)IGDJf5nQ(x%PJO>K2HE42QPUo=t-ovG+s8Y}xcMXHyJ2FVv~mH?S|QM2XO{0eo|i zD-KrtdDz-^dlXm4?0tUHeTwFc-eVt%Hwf)nMETbxkcZKlXMcl#BNDcjdGtwKeK5<0 z6z#wO58^FD(H$A{#?w4SJxQdzLE2grNbRaNJtQ$E?6F;uBfzEeyzDel8IKdTy_F32 z>2Okplc4I@D&#yWLicc>cx|oldpHYTC-+G#`2zm+K`lOfe~1Q1HY-Yqxkoi4FiDyA zAam;*u@+)}=pr>a5K^)d_6vRsOqw$Y3={WG)bR#@cPbo z%F0UC9#LE#yg0at4r3uRdz;=p118BP`nn2gE8$Ps`cxykTRhLEH4X_jz#i>?I=pM_NM;Zu*n{;HG~4h-b=mh&g1~= z0C@0;VU1sr6G&joTX!%`{qdI=$rFEr#2hrW`YqCZ{VPD9k!X3LM}BE79q{3r`@h3b zxzOtOop!0Ney_MHeo9cx3Q6YqJGg;&Qt*Dmc;SDp7!R~etARR+xE)!Z9vM&thvUifz042`KQD5}G9k`#fzxRiycfk~@ zed*kjFG(ecgB^)c9zy-jt4DK?7+A9~a9}?WFOJEABPL#B|B_ z{L?`KnT11M?HhU*wk7>ncDW%_yUwOtAzGpT*va@0`#E^lx1DC)NUZT(@sIZ8xZSe>cgV@%{gE+#!L$K&Oj@ zoqW0X@awk|&N^7l18LXquu8v6yWahfcA1++E|6S2(Eb}P;+a$gaL+rbfZ%=* zhWs)JwA*p~>5q~4oIe6|I6Q}G%6`jF@1yvk zlRKa%T=w9Hof(6Y6iu7zZMT1CCdw&+t|}?X{{M4n*LT_G8AxI@**npY)Me^3!HT~z z3H$aVE`8q*%h|C4(?1i|?`kAzhtA*fxCf_z&D+ymIw}O7`)O~E0?{Je_1@#(5|?s1xxES9q$8csozxYw!uQ`c_=Vsf@-W=uR4eO` zB}};eU7>cHWlHRKCIU&4usjlHZ6}YVhV)0O zs-4+Zj{i*soxNtUceMW9Dru60eK&DmakW210Eq9Z+w22ReF8zXSH(q8f5+S>e9Brs zEKL2)YWHqDLH#4yj{e(pB;4QcT3?xx~bMZard%{Qyg0aE!j~2i{nLH z{&5O9VS*fFrkC+|!EMxffl+rP#L+AOIlGqq4OEsW>b%ubqX$}}=NQx(g<`A_s+@pr z`1^{0@8+LhA?c?UEbL(4vh;k${ZN+eEb*Dbx`aN2mPeUJbLn0M3a#>O*%J~w8`PvZ z%!H^{@dp3H`;y)Cf9#UhJ3ebol{845?|SUJC&(DF&l#XTV5so)V>%xS&RKh+F7Hg0 zMly8h4CHHBbH5EXG7?bQNV|*oUN2KQS>OMVf{@PNVdzOhL2LSbJlHJ$m#&w?-E*4Z441wR!UtETKUs0)LlHwgG zwKs7}WHGW2J;`Ko%y%eyuQdW`0Mu!dwwIeE4Or4GCb+oI7P~y2_g;ANpnU$b#*>=y zQBX1AQS9tLqnUrsXP?Y4U>%YKEdo2+@!bY-t`k9kVK9kD_9^NEa461{N`ipLy3Cc* zjiyFG8{SxO0ivnKWF3dJ8^T8Wc)SRaMm$Mg`}4uFZU7 zQRCD(#w7x*8gSQgagQv?5yp-pX=Pb*nP97F8lN>=OINwk_AM3HY6qN5ie9{8iaiAi z9hz0ZOn(J@$nKB#TyxbCw73(%ESY!%E}Z{q|8gDgJ?1mJh{3WNO-Bjlt!id$4^|q4QGC2-qXtdv*6eEISAc9bm8_!<=NnUrt~~4ULgsMHjRH5b*&;2K>}WJ_^pmf3dW$>CZjjFl!b<4hEZ&6$FA+j`A9T~NG3 zsQe2XES|J5KvIs_YUwE?Qj=IA620Gh|)a1v2YZjkDfLb zP(T$P9t#dCn;?LiA0K3>*qs&6#%%vt;Om?y@{0)M!rBPzPS@2 z+tf~ZvGu6$b!%IhC*Nc{pE0{Ej0n$dC?h(<_1qdZHp`|B!~B>x+mlnTFH+!OrzLkc zAvI}QTg$I2ceqZ9;p>%fxYEBX>9}TeID#hY*LR)&-Ip8z^1+QGJ^5-#GR#Kff#v^Q> zMw_TCFj=uK^3gC<&?+#&KJyT&TcR>}G|w2uxplwJd7zNxO{k+pd#Uhv2V%O3C;kz% zbu(%gaP{(VJL6f#Skc)M-SZB^t&rsy{^SZ^-%x+IZ!!tu)+_A3vF%TeLW)}(a?+!O zhTKHmc=BzUz_ssc_LE@WIbY0X^?7Ld8JM}Z# z&biWcYow;WXn}fc8qFxN@AM z;3zZONB*91-k(!#8*{LL$8&~9^({#yu+pw*Pz|N3U(;rb-CFI2*40+_LXK6=A=Zb_ zf>M5|5<$q>7GYe!|0PxAp#CT0Mak)Hu`X@zP&W*_WluoJz@fP?UvHs}aW~Cpqog{Y zbx%hNS7!Nu0gAITu zoh=QP_X(FaJs1lPq2;H9!UDV?z)Xsd) zEpJ{aixz)%JYeMy!+*N>zXym?>Zi|^*Lf`h1xU>r#*+3GBY_Bc1!KREE?aNvg8zJ! zR2`}fA~a;Dt#+jZHSemdiqpTaQDP8$%_E)|(^kaAyVSJ1!?D(5znh)$BtrMp?RCk^ z3~(C2OM0Q~B7DNYx|BOy(>TMTd9~X1j^AuMJG+g2CW!OMiUQECd|z?; zRr!|eP}kXus!|GJZ>L2~Ot%YmUr>oan7l_D@EGS#jd{9l>^nJlQ?yw_!m`ki7efqH zkHoP@>9V64NgLV6$wm3{R=W<2eqcFi)sY4-Uz+bRjkwrbmL6xPV^RLiFR(9Hgro4@ zPO6eO1&kvjlFUYa>L;Z=gde{+7F*H>vC$E`YgsXLz{}f3Y_r&##uQ%No-5-~ z5Z#WY$Glfe>7I^tt-a3+$UoueAfVgeabhTNo{UH{ed6XK2j^oynX`CG%K}3_!2iT* z_f`@T{pl_pl|QdgV9wcqiiM;`Kr5;<>P&zmo$dtQmZS9vmRK8;QH8Z%H(apFTh~K& zYov=%XFzNzvr&t++M1_?DW3a}U;)L9<}dlrJvYR*ULmpWLow+EM4Ea9+8E^zq9=ed zPAQ;_u++9B%TnW6SnJ%B;kE=$8#~4_Q$9&j4qT^q8N{)jBmBXI7bwnHQb8SK#l>YJk$VyYVoVW@T+OwTmQkDZ=`$W%9> z&}cQYv3Qz~iZ_Wj`t92BGiQ}r#VVp)OUDUc?0hLlfUq;WxKM>lOcy#?CaYQm^~N^8 zZwq3kEz&k?xMHTl%p+*Gy((mKw^J!>%6*=R4v?G8%2hVHlj~*{v9uAv;I6N1u*$4P z(0CP*v&^%)s@Pg8ac-H6H_FpIZDgn@e;G@ys(m=fKRrEXoe1dal>4we{>b3h>$?|o zkvnM?Wr>HAi-+R=oczprf+SHLQH8L67jQm^mk=j*n!0^bxIL?WG}Sd7W^45z(#D#; zSx>vYa<{M7Jfe+9Fj#!&{RY}w4;`KgMW(%?|3%nemj8*!>~R)jS*fiiW|q!a?Em8A zd94@N$XjnWsi?&N1X4Y>ls8{%E~@UAnCMY9qk;9=`483d-a~8E4C=dwNi=fM2P0R@ zvfCVZJ#^UcVmoWd(QJgt%Hr#~orjd4Q9Fbf-#=CsQ|JBLQEuycm*?Va%u@%#Cur9@ z>2KnI=PleAP~g8c0_u7SXJy7ZZ2?l6;gGwe%5@&*xpM3TsR$@Sv*t|;gH?&w2yunF zQN6LYJtm@^A+p^@@gg1xijf)t^A7ZVwiXq$+`Xluk1Hz-x^=xHC-;f4YckidkHNfOsG&xuv#*3yfNjbsZaf9h!#Lj~vqL#_OMS<@=kwEK50 zvGV~4bm_Gii)(-ZEfDP`9_>eDJ+r@Ix%>F#ZVf$-kL9y#NaM^@$TI5E z<2}__p2cRGr?X?mZaO8y%x{?h_|vK~13E;H{R|A1e0O z%@z)g8hz_YSSB!7sLjKDm9@vI3JRekp-ffG+l^Sw!U;KU305@?uhLP#uvvj5-2lSY zg!5EpX5!Ie4DNHFMa_(fq&5e4DL&Ssd;=6Vs0@5ko%^P8dpo15uu#*Y zqVpN&d)NfjeKt~twz7Reayo|r7iX^}7`H>if7nz^m5mwVfX4SG-;3rv_@%DS6$gzD zq|4GYp>E!4KeHJT<;d&XPXRMYGu*2uCiVCXg%-%kf-mCkbm;kD*ZQm%^PfIwb?qyd z%=>m#+c+jgeJ15qbKh-H>SHT=_fYT5N?*##W2N&~cbB~l;1%A`*npK|9V(@+fM_T^ zRK;_nok#2!>H$z9ZrlgG=U8enw&qB{37bTAiA><5RIL=SINIl_BzssyusX1A_ASAl z*CA$28Tr)#oFR^!0{t`Z6&S_FhPMq~%@zk)4V2NM;LIV&gk_*o)yz~X?=@zqJN=50 z25_59)J%~|fDh1q&LoZ*)HZgeZ}wBkDbqMwCd}h0vDm|`U({>dXzU5N>LG*g0B^Hh zpA`G!QT$bHrcb_!1q!YBO%!;j`MsbLhh%ZXTE=yq2hRgwAT!UEk^}0vTG(6O*O_6S zt??wu#WL+KTaN_b_Zgbg!b51XQTjc;jztefrfBjNe3rDW=ygq8m5mFWc2e^^|8%g* ze!ogKZGkjTUo%wD7{`Gm)7B^_roG%RmRjDOA_!w%S<{%vdlR>0)=aL}IXWRA;SZ0# ze-TIH#LcYdF*#nvV}CD9uSOYVfrAyHnR<4h?#@gm1_QgcTL$vsoR17FvAKt>gpQ_S z?3Nn`OLAUcJI-g!>0AHqi@aac*?>Hga|UvEiel>J`#J+Lp6Q0?CbUqEj^gM|Y;2t?G(PL;H_QxD^Vhus>;gV@d81fZq=N*yF$Jau zuA8Z+gIGr=WS0qrUl(fSwPAqHmXn#xK7W=?b;$`Q!GZ5b>6)K|7$(?ztEnkmhP^ME zEsM-$(L2u>Tx>SN7obXG-ulTaXu(eOo{Q##XPOK-+UrFD#Cz`%o{OV3hO!+l8Cr$; z_RyIC7tM0vM>o!v8#_L?_txT2d+by{yss_MQ}%OiL7$P)(6{8e)N1MhowBLbqLY@B z{l%cG#9Fy(k2YO*U$+q26|Z1zy2-PvaT8a-E;xPa)yZweGV%7hfFc{O z*r!qhn7bU}_wJk&Y^Dxx34OCZVBVF}EniKfA9aR?U&(!!@r}R9szME_lg_imGlz@n zwPc5ws0FN%E9XC>+mG5vFrkQ^b*9lGR#nA?4?aP=*k0|$Tz=?-m1;Jh1Pvj&MDN82 zS{sz%v9DHm@67po3B#9VSP)3>F~pKe1Z#gxYv0J3SGXfy?r*;6qe|9EuADtv^g!;v5e~Hb!1|*!8(>G(Sj{s@iDG z=hks7Z4-#<$6vF?=Q%gqc;>TQ)~nPTIF3o}{xEKr;PcybJm4OzfE8HVR zZU>tS{Y1ySlKl`t>rhnmLSQW0%!l&)VKcpH*rOe;#nsn3w@;c##!%5+~()@7tRZPyw>)NXO z9rxaOYe&+fXSrp&>y3CprT*r$-MTJq)5U4=l+MIL*#hDcA?aWguYJ(dn)zmi?h@vf zwj$EvMEB%S-!u_AB}kq&pK02Kn#1B8Jr-1uX;%t^D<+K`KTeb`sU^h-i(a@T#!2S$ za|)yFGTICj{=u6!g2BDtY-gb<>&zR$EBJF(X)zF^=VAnWbyvs4uA(F?y~j;D76}^tXTWiBY}4Hpwt~`ivDjkGZhR+>8dBQi_aUggMo{SL-LJxipNR zgM%e^Ysi?2R+BX9FnF@0#LCZWe zqi<{@*|NjbY9^@fv!+@i-!C(Z=zn-AG1!k4bNe)O6PH*m-5A7(Y!aDq!C6M6|G5i@ z^M4Z76_x;xRSxuFF>I2nZWmV<|3Dj57>!uVc$gTQEu%BG&|pNE3=QScEgQ29_%fa) zzoE`B(^uM1&=|o}iKwg#I(L2p5O-7My05ph=d7c@+*ckC6zYn?BAqQAQQ>6<1KJEm z{Tufudd}AoRjW7GjHFXjf$^a{`?Ir&mv-NUxegFdIXKZhVfbmD6!t+qTJ6D&3XaW4Ze5BZ2;n{m%5A-c z^61z^TRC`q?i5vUbTx4NnjDz@!bmp4$?InRkWrSihQit1ckj6w_2&-i0agE~ajKZp zhkNU}OBV4=U8nSS+cJaKzGXJ|LFu+H(a}jN3R?776k)OYDbj&v#xO~;r6xBXyYSCm zhM$@_7qE(wQAv;Jow}YY`_natD_xOGb8VmxDBPc{_Tu90dtY0eont6Vl#^=ZIy1wX z6FuX%wGW-7H-28D)u71%ao0*RF#hW9F8TJ)8h^R|ri{2~qmm&?W-2dQnzVR9&-i*kLkA!oNRe9@lKI!8Bd3NmmQF+tDg^336Bypl>| zMW81Uv=-*;d6FtOBq7f4@%3W`!H(#ZbN84Nkm+zu6fZU?>py5!uakYCaRHPZE6y$B z)S8)Yga_4wD`NR^Y;#O;6qZ1bj^Wn@4KJ7?)+Q~Vt{Qp)e40)KJgn0%!PNo;zEvrr09|yBk|k*)OMi^0wt^1i0?bu=%0 zsx#}gnkBc&hlIk$t=-}3;47ExKHA5xwbu+5+hYCr1{WzrkuxyXYD#k3v48H1pBv`X zA3mCk%SJoTYxJ74@20LaAlJsH;lZ-;r~|M{3pq2*v#bexQ3RF1wkIx|2_RJWg`GjjI#BuYf!O>HNFw9HRgwnGY1SMWRUvE0pK zT~-mhuYi<(lo8so8l+E5g4(R`%Fg!r8M~O|RxnTh`bYAgL)Cyc z-&v>*=3`^mDym%0l~d=sApn|2vgvWA9tmr_iSbkO8eASEUZtsU#nNL!nsVHzB}k6_ z3p$P`OAYRLw8l(zc%(Wml(?(Xkaa(&)bHfEYg)D<$#<(e#j6NW##*H%AcQ&R$Xh35 z)yIy&aoQXeHXkmXM?6Ui%NOUOSBMigN$mG@reK4jvO9?8y1-NW)D5+X2PP9|!#?t7 z;>%s`Cw)-}7OKwCE4)1L3@LzHABuk$6||nXN@F|#&u})9|KpECb@%VwR2jjZX=V=H z3Gqyo^3l#t%h)l0>T2At6EX8_&2puf!1wfV2@RXlWmV>ZyxmXUmupX7-kn+AZov|E zyg;zG>}Hl~4dp`BSL)1{J`J;Y-qM{VL{KgVLANe{yN36?7}MSq|l8 zVV#GlmmbutA=;tR$84xcweEJ@l=u* zC~m2oA=cvIuU`q26o7gIdGuEa!HSE{jP= z9n6_4TAE%47QS0<2yIZRf0QUX)*@OyXI>i4uG&WPs&Rvpf2b;AGolH-bC2qIi?_x{ zKeDCRxN|{60>3$?&&MlcXP1v{`SzY_yZ2FNZ{|dHdJjsMp)SJr?Soh@d2*2Rw}Jl* zOMlEwec30rdp#w0v(}8C{pD4Ws@=_skkB}_9!oEN8)PPYCL41>@{?+8Cr2A));n(K z41gF|#BS_EN5=NsFADy$#hwZxXE`_N0C{_yvCeVt{7MxaJ=l1-!UFjib4N|pB!{oR z;6AmoZI4rrNfy1`V7ZY$_GBkQ$WXu}{^s>lzch`{q@)gxn((}JU8cJaLb36j!q-7& zHFx*hG3~?xNGX1NH~M8XTik5>Z8wMcDfHxi!L`H8UYw^xUNmnl+VUzTOBX(a$z7K} ze|(cJr%0hyByx~8_SoKI`)T%nUbxBg_U-hb*1XFNw5>fQRo4e@S`M}M@2*&{6TV5r zwdhKgPci0!ezoC>5(6gDsvjQe-D0*L&p1Z>ojG3cf97Y941D*eeIq2#RM~VIe-jOw z;~_?I4Pg2CY^xgI@jwTq;@?3hB)u-(*NcJZ?&uUQ$umr}Q0jafgC2pHjCUqektgbH zkkm(yRyiEawpV@T%nbT;~1WByA!sRQkC0e98_@L-_qRv*OvqhJbaxFAnK{-Xx#&pch zFPVq@R%FxtKkVkS!#vUtDsU;s|8uFE~9e zfIJYFi;pQ_6;EZUfAdv*5~%BG9ZcR+D_-+Pm8&?QPD3}$yK@KrN^chV(E<6b!NHSE z5>W=ZVaM+Na$Miv%SvzGezcE=e5=S?o@d1VgOLMwd!)aAe7Kh8BTzGOgqQO2 zJVX5Ww_kp*U4m4u&cT=$lSbV-mfUsBUk@DKP#w8)WZ~GSl^<)dp)vf4j*S+UrE&>B tW1!{t8)ltk-L|-;hI{9~=qWDjMmK(;jhmsP`2+mAe^=p7?ybkq{|~cs9n}B; diff --git a/docs/discover/try-esql.asciidoc b/docs/discover/try-esql.asciidoc index 32718d87c955a..53862be75f010 100644 --- a/docs/discover/try-esql.asciidoc +++ b/docs/discover/try-esql.asciidoc @@ -78,7 +78,7 @@ FROM kibana_sample_data_logs . Click **▶Run**. + [role="screenshot"] -image:images/esql-full-query.png[] +image:images/esql-full-query.png[An image of the full query result] + . Click **Save** to save the query and visualization to a dashboard. From b9c90273d01ee43863015e73b5d7a8ac567f8753 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 10 Jul 2024 09:29:35 -0500 Subject: [PATCH 40/82] skip failing test suite (#168340) --- .../automated_response_actions.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts index 9da25023f0778..02c367976c163 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/automated_response_actions/automated_response_actions.cy.ts @@ -20,7 +20,8 @@ import { createEndpointHost } from '../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../tasks/delete_all_endpoint_data'; import { enableAllPolicyProtections } from '../../tasks/endpoint_policy'; -describe( +// Failing: See https://github.com/elastic/kibana/issues/168340 +describe.skip( 'Automated Response Actions', { tags: ['@ess', '@serverless'], From 2d573bc90688d24779fc4f5546225a5f60a1a5d9 Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 10 Jul 2024 09:33:09 -0500 Subject: [PATCH 41/82] skip failing test suite (#173464) --- .../e2e/response_actions/response_console/isolate.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts index f89f2a6f62ecf..c90ae66c7166a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/isolate.cy.ts @@ -26,7 +26,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/173464 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; From ac91af821fb44da063040b9d0a0b094c18a42092 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Wed, 10 Jul 2024 10:33:36 -0400 Subject: [PATCH 42/82] [Synthetics] Accept project monitors with `monitor.url` of type `string` that contains commas (#186112) ## Summary Resolves #186093. Result of an [SDH](https://github.com/elastic/sdh-synthetics/issues/97) that lead to a desire to refine Kibana's acceptance criteria for lightweight project monitors. Heartbeat accepts `monitor.url` values of type `string` as a comma-delimited list, like: `https://elastic.co,https://amazon.com` This is not supported for Synthetics, the design goals of the product demand a 1:1 ratio relationship between URL<->Monitor. Thus the code attempts to handle this parsing. It has the unintended side effect of rejecting otherwise valid URLs that contain commas. Rather than creating even more sophisticated parsing for this case, this patch would remove all parsing of string fields, and simply convert them to a list with one entry, which is what we then store in the monitor's definition. _NOTE:_ this also adds a call to `new URL` to attempt to parse the URL value. This wasn't present before, but the Agent team made it clear that we should do best-effort checks to ensure that an invalid URL doesn't actually make it to the point of executing on the service. I've added a fourth test case to the testing instructions below. ## Testing There are several cases we must cover to ensure we aren't breaking anything with this change. We must initiate these checks against both public and private locations, as the backend behavior of the two differs. - Create a monitor in a list containing a comma. Example: ```yaml heartbeat.monitors: - type: http name: Todos Lightweight id: todos-lightweight enabled: true urls: - "https://elastic.github.io/synthetics-demo/?demo=123,345" schedule: '@every 10s' timeout: 16s ``` - Create a monitor with the URL defined as a string, containing a comma: ```yaml heartbeat.monitors: - type: http name: Todos Lightweight id: todos-lightweight enabled: true urls: "https://elastic.github.io/synthetics-demo/?demo=123,345" schedule: '@every 10s' timeout: 16s ``` - Create a monitor with a URL defined as a string, containing a comma-delimited list of valid URLs: ```yaml heartbeat.monitors: - type: http name: Trollface two montiors id: todos-lightweight-multiple enabled: true urls: "https://elastic.github.io/synthetics-demo/,https://elastic.co" schedule: '@every 10s' timeout: 16s alert.status.enabled: true ``` - Create a monitor with a URL defined as a string, containing an invalid URL: ```yaml - type: http name: Unhandled text id: unhandled-text enabled: true urls: "unhandledtext" schedule: '@every 10s' timeout: 16s alert.status.enabled: true ``` --- .../normalizers/common_fields.test.ts | 26 +++++++++++ .../normalizers/common_fields.ts | 43 +++++++++++++++++++ .../normalizers/http_monitor.test.ts | 6 +-- .../normalizers/http_monitor.ts | 10 +++-- 4 files changed, 79 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts index 6c381283c1824..650c9b964aaec 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.test.ts @@ -8,9 +8,35 @@ import { flattenAndFormatObject, getNormalizeCommonFields, + getUrlsField, + isValidURL, NormalizedProjectProps, } from './common_fields'; +describe('isValidUrl', () => { + it('returns false for invalid URL', () => { + expect(isValidURL('invalid')).toBeFalsy(); + }); + + it('returns true for valid URL', () => { + expect(isValidURL('https://elastic.co')).toBeTruthy(); + }); +}); + +describe('getUrlsField', () => { + it('supports a string value containing a comma', () => { + expect(getUrlsField('https://elastic.co?foo=bar,baz')).toEqual([ + 'https://elastic.co?foo=bar,baz', + ]); + }); + + it('supports lists containing exactly one entry, even with commas', () => { + expect(getUrlsField(['https://elastic.co?foo=bar,baz'])).toEqual([ + 'https://elastic.co?foo=bar,baz', + ]); + }); +}); + describe('normalizeYamlConfig', () => { it('does not continue flattening when encountering an array', () => { const array = ['value1', 'value2']; diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts index fad8e096a483c..4019151dc44f6 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/common_fields.ts @@ -306,6 +306,24 @@ export const getInvalidUrlsOrHostsError = ( ), }); +export const getUnparseableUrlError = (monitor: ProjectMonitor, version: string) => ({ + id: monitor.id, + reason: INVALID_CONFIGURATION_TITLE, + details: i18n.translate( + 'xpack.synthetics.projectMonitorApi.validation.unparseableUrl.description', + { + defaultMessage: + '`{monitorType}` project monitors must specify a valid URL for field `{key}` in version `{version}`. Your monitor definition with ID `{monitorId}` was not saved.', + values: { + monitorType: monitor.type, + key: 'monitor.urls', + version, + monitorId: monitor.id, + }, + } + ), +}); + const getInvalidLocationError = ( invalidPublic: string[], invalidPrivate: string[], @@ -356,6 +374,17 @@ export const getValueInSeconds = (value: string) => { return typeof valueInSeconds === 'number' ? `${valueInSeconds}` : null; }; +/** + * Accounts for url values in a string or list + * + * @param {Array | string} [value] + * @returns {array} Returns an array + */ +export const getUrlsField = (value?: string[] | string): string[] => { + if (!value) return []; + return Array.isArray(value) ? value : [value]; +}; + /** * Accounts for array values that are optionally defined as a comma seperated list * @@ -369,6 +398,20 @@ export const getOptionalListField = (value?: string[] | string): string[] => { return value ? value.split(',') : []; }; +/** + * Does a best-effort check to ensure that the `monitor.url` field will evaluate to a valid URL. + * @param url the value of a single entry in the `monitor.url` list intended to pass to the service + * @returns `true` if `new URL` does not throw an error, `false` otherwise + */ +export const isValidURL = (url: string): boolean => { + try { + new URL(url); + return true; + } catch { + return false; + } +}; + /** * Accounts for heartbeat fields that are optionally an array or single string * diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts index 0e92fd6155a5e..d77c03de45d48 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.test.ts @@ -48,7 +48,7 @@ describe('http normalizers', () => { enabled: false, id: 'my-monitor-2', name: 'My Monitor 2', - urls: ['http://localhost:9200', 'http://anotherurl:9200'], + urls: ['http://localhost:9200?withComma=1,2,3', 'http://anotherurl:9200'], schedule: 60, timeout: '80s', 'check.request': { @@ -202,7 +202,7 @@ describe('http normalizers', () => { tags: [], timeout: '80', type: 'http', - urls: 'http://localhost:9200', + urls: 'http://localhost:9200?withComma=1,2,3', 'url.port': null, username: '', id: '', @@ -374,7 +374,7 @@ describe('http normalizers', () => { tags: [], timeout: '80', type: 'http', - urls: 'http://localhost:9200', + urls: 'http://localhost:9200?withComma=1,2,3', 'url.port': null, username: '', id: '', diff --git a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.ts b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.ts index 113b75924b1c1..caef8a1ba3381 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/project_monitor/normalizers/http_monitor.ts @@ -20,10 +20,12 @@ import { getNormalizeCommonFields, normalizeYamlConfig, getOptionalListField, - getOptionalArrayField, getUnsupportedKeysError, getInvalidUrlsOrHostsError, getHasTLSFields, + isValidURL, + getUnparseableUrlError, + getUrlsField, } from './common_fields'; export const getNormalizeHTTPFields = ({ @@ -50,9 +52,11 @@ export const getNormalizeHTTPFields = ({ errors.push(...commonErrors); /* Check if monitor has multiple urls */ - const urls = getOptionalListField(monitor.urls); + const urls = getUrlsField(monitor.urls); if (urls.length !== 1) { errors.push(getInvalidUrlsOrHostsError(monitor, 'urls', version)); + } else if (isValidURL(urls[0]) === false) { + errors.push(getUnparseableUrlError(monitor, version)); } if (unsupportedKeys.length) { errors.push(getUnsupportedKeysError(monitor, unsupportedKeys, version)); @@ -63,7 +67,7 @@ export const getNormalizeHTTPFields = ({ ...commonFields, [ConfigKey.MONITOR_TYPE]: MonitorTypeEnum.HTTP, [ConfigKey.FORM_MONITOR_TYPE]: FormMonitorType.HTTP, - [ConfigKey.URLS]: getOptionalArrayField(monitor.urls) || defaultFields[ConfigKey.URLS], + [ConfigKey.URLS]: urls.length > 0 ? urls[0] : defaultFields[ConfigKey.URLS], [ConfigKey.MAX_REDIRECTS]: formatMaxRedirects(monitor[ConfigKey.MAX_REDIRECTS]), [ConfigKey.REQUEST_BODY_CHECK]: getRequestBodyField( (yamlConfig as Record)[ConfigKey.REQUEST_BODY_CHECK] as string, From 8fcf4b9dbb0f51ae2e39d7d3b0886b99db47c5f3 Mon Sep 17 00:00:00 2001 From: Alex Szabo Date: Wed, 10 Jul 2024 16:36:45 +0200 Subject: [PATCH 43/82] Revert vault-related changes from #187762 (#187990) Only revert one bit of the problem. It's failing in the bazel-cache builds: https://buildkite.com/elastic/kibana-macos-bazel-cache/builds/37383 because the bazel-cache was never migrated to the new infra, so there are different `vault` defaults. --- .buildkite/scripts/common/vault_fns.sh | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.buildkite/scripts/common/vault_fns.sh b/.buildkite/scripts/common/vault_fns.sh index fa99b214c1be6..c9c51b2c7bb92 100644 --- a/.buildkite/scripts/common/vault_fns.sh +++ b/.buildkite/scripts/common/vault_fns.sh @@ -1,9 +1,17 @@ #!/bin/bash +# TODO: rewrite after https://github.com/elastic/kibana-operations/issues/15 is done export LEGACY_VAULT_ADDR="https://secrets.elastic.co:8200" -export VAULT_PATH_PREFIX="secret/ci/elastic-kibana" -export VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" -export IS_LEGACY_VAULT_ADDR=false +if [[ "${VAULT_ADDR:-}" == "$LEGACY_VAULT_ADDR" ]]; then + VAULT_PATH_PREFIX="secret/kibana-issues/dev" + VAULT_KV_PREFIX="secret/kibana-issues/dev" + IS_LEGACY_VAULT_ADDR=true +else + VAULT_PATH_PREFIX="secret/ci/elastic-kibana" + VAULT_KV_PREFIX="kv/ci-shared/kibana-deployments" + IS_LEGACY_VAULT_ADDR=false +fi +export IS_LEGACY_VAULT_ADDR retry() { local retries=$1; shift From fe312f78d4305e61426036b187f66e9b41dac43a Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 10 Jul 2024 09:38:12 -0500 Subject: [PATCH 44/82] skip failing test suite (#172326) --- .../e2e/response_actions/response_console/release.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts index d11b7210713a8..4ad892155cb54 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/response_actions/response_console/release.cy.ts @@ -27,7 +27,8 @@ import { enableAllPolicyProtections } from '../../../tasks/endpoint_policy'; import { createEndpointHost } from '../../../tasks/create_endpoint_host'; import { deleteAllLoadedEndpointData } from '../../../tasks/delete_all_endpoint_data'; -describe('Response console', { tags: ['@ess', '@serverless'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/172326 +describe.skip('Response console', { tags: ['@ess', '@serverless'] }, () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; let policy: PolicyData; let createdHost: CreateAndEnrollEndpointHostResponse; From 141e6191c84de8c448b805eadd6a7b4d7e0fe72b Mon Sep 17 00:00:00 2001 From: Mykola Harmash Date: Wed, 10 Jul 2024 16:54:54 +0200 Subject: [PATCH 45/82] [Onboarding] k8s quickstart flow (#186380) Depends on: https://github.com/elastic/elastic-agent/pull/4754 Depends on: https://github.com/elastic/kibana/pull/186106 Closes: https://github.com/elastic/kibana/issues/182407 ## Summary Adds a Kubernetes onboarding quick start flow using `kubectl kustomize` command. ![CleanShot 2024-06-18 at 15 10 27@2x](https://github.com/elastic/kibana/assets/793851/522d2481-6a0e-43d3-b9ef-d09ee9953b3c) ## How to test 1. Run Kibana and ES locally (make sure to expose ES on 0.0.0.0 so elastic agent can reach it from within a container, I use this command `yarn es snapshot --license trial -E xpack.security.authc.api_key.enabled=true -E http.host=0.0.0.0`) 2. Setup a test cluster with [minikube](https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Fx86-64%2Fstable%2Fbinary+download) 3. Open Kibana and navigate to the Onboarding screen 4. Make sure Kubernetes quick start card is visible under the infrastructure category and click on it 5. Copy the command snippet 6. Paste the command into a terminal, but don't run it yet 7. Replace `localhost` in the command with you local IP `ipconfig getifaddr en0` 8. In case https://github.com/elastic/elastic-agent/pull/4754 was not merged yet, you'd need to also clone the elastic-agent repo and replace the template URL with a local path to the `elastic-agent-kustomize/default/elastic-agent-standalone` folder. 9. Run the command and make sure all resources were created 10. Go back to Kibana, after ~1 minute UI should identify that the data was ingested 11. Click on the cluster overview link and make sure it works --------- Co-authored-by: Elastic Machine --- .../observability_onboarding_flow.tsx | 5 + .../use_custom_cards_for_category.ts | 19 +- .../public/application/packages_list/utils.ts | 2 +- .../kubernetes/build_kubectl_command.ts | 38 ++++ .../kubernetes/command_snippet.tsx | 72 +++++++ .../kubernetes/data_ingest_status.tsx | 182 ++++++++++++++++++ .../quickstart_flows/kubernetes/index.tsx | 73 +++++++ .../public/assets/kubernetes.svg | 1 + .../hooks/use_flow_progress_telemetry.ts | 4 +- .../api_key/create_install_api_key.ts | 2 +- .../api_key/create_shipper_api_key.ts | 2 +- .../api_key/has_log_monitoring_privileges.ts | 0 .../logs => lib}/api_key/monitoring_config.ts | 0 .../server/routes/flow/route.ts | 13 +- .../server/routes/index.ts | 2 + .../server/routes/kubernetes/route.ts | 112 +++++++++++ .../server/routes/logs/route.ts | 9 +- .../observability_onboarding_status.ts | 4 +- .../authentication.ts | 2 +- 19 files changed, 525 insertions(+), 17 deletions(-) create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/build_kubectl_command.ts create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/command_snippet.tsx create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/data_ingest_status.tsx create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/public/assets/kubernetes.svg rename x-pack/plugins/observability_solution/observability_onboarding/server/{routes/logs => lib}/api_key/create_install_api_key.ts (96%) rename x-pack/plugins/observability_solution/observability_onboarding/server/{routes/logs => lib}/api_key/create_shipper_api_key.ts (93%) rename x-pack/plugins/observability_solution/observability_onboarding/server/{routes/logs => lib}/api_key/has_log_monitoring_privileges.ts (100%) rename x-pack/plugins/observability_solution/observability_onboarding/server/{routes/logs => lib}/api_key/monitoring_config.ts (100%) create mode 100644 x-pack/plugins/observability_solution/observability_onboarding/server/routes/kubernetes/route.ts diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/observability_onboarding_flow.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/observability_onboarding_flow.tsx index 33e472d841bbc..dd22b1735fc9f 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/observability_onboarding_flow.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/observability_onboarding_flow.tsx @@ -19,6 +19,7 @@ import { SystemLogsPanel } from './quickstart_flows/system_logs'; import { CustomLogsPanel } from './quickstart_flows/custom_logs'; import { OtelLogsPanel } from './quickstart_flows/otel_logs'; import { AutoDetectPanel } from './quickstart_flows/auto_detect'; +import { KubernetesPanel } from './quickstart_flows/kubernetes'; import { BackButton } from './shared/back_button'; const queryClient = new QueryClient(); @@ -66,6 +67,10 @@ export function ObservabilityOnboardingFlow() { + + + + diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts index 5bc63403365cc..03d7d0278f374 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/onboarding_flow_form/use_custom_cards_for_category.ts @@ -34,6 +34,7 @@ export function useCustomCardsForCategory( const { href: systemLogsUrl } = reactRouterNavigate(history, `/systemLogs/${location.search}`); const { href: customLogsUrl } = reactRouterNavigate(history, `/customLogs/${location.search}`); const { href: otelLogsUrl } = reactRouterNavigate(history, `/otel-logs/${location.search}`); + const { href: kubernetesUrl } = reactRouterNavigate(history, `/kubernetes/${location.search}`); const otelCard: VirtualCard = { id: 'otel-logs', @@ -112,7 +113,23 @@ export function useCustomCardsForCategory( ]; case 'infra': return [ - toFeaturedCard('kubernetes'), + { + id: 'kubernetes-quick-start', + type: 'virtual', + title: 'Kubernetes', + description: 'Collect logs and metrics from Kubernetes using minimal configuration', + name: 'kubernetes-quick-start', + categories: ['observability'], + icons: [ + { + type: 'svg', + src: http?.staticAssets.getPluginAssetHref('kubernetes.svg') ?? '', + }, + ], + url: kubernetesUrl, + version: '', + integration: '', + }, toFeaturedCard('docker'), isServerless ? toFeaturedCard('prometheus') : otelCard, { diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts index 52e9a0f09c807..e0e468b0d80db 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/packages_list/utils.ts @@ -7,7 +7,7 @@ import { IntegrationCardItem } from '@kbn/fleet-plugin/public'; -export const QUICKSTART_FLOWS = ['system-logs-virtual']; +export const QUICKSTART_FLOWS = ['system-logs-virtual', 'kubernetes-quick-start']; export const toCustomCard = (card: IntegrationCardItem) => ({ ...card, diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/build_kubectl_command.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/build_kubectl_command.ts new file mode 100644 index 0000000000000..59de30111649d --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/build_kubectl_command.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +interface Params { + encodedApiKey: string; + onboardingId: string; + elasticsearchUrl: string; + elasticAgentVersion: string; +} + +const KUSTOMIZE_TEMPLATE_URL = + 'https://github.com/elastic/elastic-agent/deploy/kubernetes/elastic-agent-kustomize/default/elastic-agent-standalone'; + +export function buildKubectlCommand({ + encodedApiKey, + onboardingId, + elasticsearchUrl, + elasticAgentVersion, +}: Params) { + const escapedElasticsearchUrl = elasticsearchUrl.replace(/\//g, '\\/'); + + return ` + kubectl kustomize ${KUSTOMIZE_TEMPLATE_URL}\\?ref\\=v${elasticAgentVersion} + | sed -e 's/JUFQSV9LRVkl/${encodedApiKey}/g' + -e "s/%ES_HOST%/${escapedElasticsearchUrl}/g" + -e "s/%ONBOARDING_ID%/${onboardingId}/g" + -e "s/\\(docker.elastic.co\\/beats\\/elastic-agent\:\\).*$/\\1${elasticAgentVersion}/g" + -e "/{CA_TRUSTED}/c\\ " + | kubectl apply -f- + ` + .trim() + .replace(/\n/g, ' ') + .replace(/\s\s+/g, ' '); +} diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/command_snippet.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/command_snippet.tsx new file mode 100644 index 0000000000000..be7857676427c --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/command_snippet.tsx @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiCodeBlock, EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import { buildKubectlCommand } from './build_kubectl_command'; +import { CopyToClipboardButton } from '../shared/copy_to_clipboard_button'; + +interface Props { + encodedApiKey: string; + onboardingId: string; + elasticsearchUrl: string; + elasticAgentVersion: string; +} + +export function CommandSnippet({ + encodedApiKey, + onboardingId, + elasticsearchUrl, + elasticAgentVersion, +}: Props) { + const command = buildKubectlCommand({ + encodedApiKey, + onboardingId, + elasticsearchUrl, + elasticAgentVersion, + }); + + return ( + <> + +

+ + {i18n.translate( + 'xpack.observability_onboarding.kubernetesPanel.scalingElasticAgentOnLinkLabel', + { defaultMessage: 'Scaling Elastic Agent on Kubernetes' } + )} + + ), + }} + /> +

+ + + + + + {command} + + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/data_ingest_status.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/data_ingest_status.tsx new file mode 100644 index 0000000000000..3e91c20752bd4 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/data_ingest_status.tsx @@ -0,0 +1,182 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect, useState } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiImage, EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; +import { css } from '@emotion/react'; +import { i18n } from '@kbn/i18n'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { DASHBOARD_APP_LOCATOR } from '@kbn/deeplinks-analytics'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + StepsProgress, + useFlowProgressTelemetry, +} from '../../../hooks/use_flow_progress_telemetry'; +import { ObservabilityOnboardingContextValue } from '../../../plugin'; +import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; +import { ProgressIndicator } from '../shared/progress_indicator'; + +interface Props { + onboardingId: string; +} + +const FETCH_INTERVAL = 2000; +const SHOW_TROUBLESHOOTING_DELAY = 120000; // 2 minutes +const CLUSTER_OVERVIEW_DASHBOARD_ID = 'kubernetes-f4dc26db-1b53-4ea2-a78b-1bfab8ea267c'; + +export function DataIngestStatus({ onboardingId }: Props) { + const { + services: { share, http }, + } = useKibana(); + const [progress, setProgress] = useState(undefined); + const [checkDataStartTime] = useState(Date.now()); + + const dashboardLocator = share.url.locators.get(DASHBOARD_APP_LOCATOR); + + const { data, status, refetch } = useFetcher( + (callApi) => { + return callApi('GET /internal/observability_onboarding/kubernetes/{onboardingId}/has-data', { + params: { path: { onboardingId } }, + }); + }, + [onboardingId] + ); + + useEffect(() => { + const pendingStatusList = [FETCH_STATUS.LOADING, FETCH_STATUS.NOT_INITIATED]; + + if (pendingStatusList.includes(status) || data?.hasData === true) { + return; + } + + const timeout = setTimeout(() => { + refetch(); + }, FETCH_INTERVAL); + + return () => clearTimeout(timeout); + }, [data?.hasData, refetch, status]); + + useEffect(() => { + if (data?.hasData === true) { + setProgress({ 'logs-ingest': { status: 'complete' } }); + } + }, [data?.hasData]); + + useFlowProgressTelemetry(progress, onboardingId); + + const isTroubleshootingVisible = + data?.hasData === false && Date.now() - checkDataStartTime > SHOW_TROUBLESHOOTING_DELAY; + + return ( + <> + + + {isTroubleshootingVisible && ( + <> + + + + {i18n.translate( + 'xpack.observability_onboarding.dataIngestStatus.troubleshootingLinkText', + { + defaultMessage: 'Open documentation', + } + )} + + ), + }} + /> + + + )} + + {data?.hasData === true && ( + <> + + + + + + + + + +

+ {i18n.translate( + 'xpack.observability_onboarding.kubernetesPanel.monitoringCluster', + { + defaultMessage: + 'Overview your Kubernetes cluster with this pre-made dashboard', + } + )} +

+
+ + + {i18n.translate('xpack.observability_onboarding.kubernetesPanel.exploreDashboard', { + defaultMessage: 'Explore Kubernetes cluster', + })} + +
+
+ + + + + + {i18n.translate( + 'xpack.observability_onboarding.dataIngestStatus.viewAllAssetsLinkText', + { + defaultMessage: 'View all assets', + } + )} + + ), + }} + /> + + + )} + + ); +} diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx new file mode 100644 index 0000000000000..58de3a72ca92f --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/kubernetes/index.tsx @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { + EuiPanel, + EuiSkeletonRectangle, + EuiSkeletonText, + EuiSpacer, + EuiSteps, + EuiStepStatus, +} from '@elastic/eui'; +import useEvent from 'react-use/lib/useEvent'; +import { FETCH_STATUS, useFetcher } from '../../../hooks/use_fetcher'; +import { EmptyPrompt } from '../shared/empty_prompt'; +import { CommandSnippet } from './command_snippet'; +import { DataIngestStatus } from './data_ingest_status'; + +export const KubernetesPanel: React.FC = () => { + const [windowLostFocus, setWindowLostFocus] = useState(false); + const { data, status, error, refetch } = useFetcher((callApi) => { + return callApi('POST /internal/observability_onboarding/kubernetes/flow'); + }, []); + + useEvent('blur', () => setWindowLostFocus(true), window); + + if (error !== undefined) { + return ; + } + + const isMonitoringStepActive = + status === FETCH_STATUS.SUCCESS && data !== undefined && windowLostFocus; + + const steps = [ + { + title: 'Install Elastic Agent on your host', + children: ( + <> + {status !== FETCH_STATUS.SUCCESS && ( + <> + + + + + )} + {status === FETCH_STATUS.SUCCESS && data !== undefined && ( + + )} + + ), + }, + { + title: 'Monitor your Kubernetes cluster', + status: (isMonitoringStepActive ? 'current' : 'incomplete') as EuiStepStatus, + children: isMonitoringStepActive && , + }, + ]; + + return ( + + + + ); +}; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/assets/kubernetes.svg b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/kubernetes.svg new file mode 100644 index 0000000000000..7f3e86f5482b9 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/assets/kubernetes.svg @@ -0,0 +1 @@ + diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.ts b/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.ts index 95d93ad6af985..a580055f8e3c7 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/hooks/use_flow_progress_telemetry.ts @@ -11,9 +11,9 @@ import { type LogsFlowProgressStepId } from '../../common/logs_flow_progress_ste import { OBSERVABILITY_ONBOARDING_TELEMETRY_EVENT } from '../../common/telemetry_events'; import { useKibana } from './use_kibana'; -type EuiStepStatus = EuiStepsProps['steps'][number]['status']; +export type EuiStepStatus = EuiStepsProps['steps'][number]['status']; -type StepsProgress = Partial< +export type StepsProgress = Partial< Record >; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/create_install_api_key.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_install_api_key.ts similarity index 96% rename from x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/create_install_api_key.ts rename to x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_install_api_key.ts index d97dd6ac6580c..eddc5e10b5c65 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/create_install_api_key.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_install_api_key.ts @@ -13,7 +13,7 @@ import type { CreateAPIKeyParams } from '@kbn/security-plugin/server'; */ export function createInstallApiKey(name: string): CreateAPIKeyParams { return { - name: `onboarding_install_${name}`, + name, expiration: '1h', // This API key is only used for initial setup and should be short lived metadata: { managed: true, diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/create_shipper_api_key.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_shipper_api_key.ts similarity index 93% rename from x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/create_shipper_api_key.ts rename to x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_shipper_api_key.ts index 70a3bf344fee6..942ebdbbd07cd 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/create_shipper_api_key.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/create_shipper_api_key.ts @@ -12,7 +12,7 @@ export function createShipperApiKey(esClient: ElasticsearchClient, name: string) // Based on https://www.elastic.co/guide/en/fleet/master/grant-access-to-elasticsearch.html#create-api-key-standalone-agent return esClient.security.createApiKey({ body: { - name: `standalone_agent_logs_onboarding_${name}`, + name, metadata: { managed: true, application: 'logs', diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/has_log_monitoring_privileges.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/has_log_monitoring_privileges.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/has_log_monitoring_privileges.ts rename to x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/has_log_monitoring_privileges.ts diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/monitoring_config.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/monitoring_config.ts similarity index 100% rename from x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/api_key/monitoring_config.ts rename to x-pack/plugins/observability_solution/observability_onboarding/server/lib/api_key/monitoring_config.ts diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts index c58a5ef257fbb..80f0159f66594 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts @@ -20,12 +20,12 @@ import { ObservabilityOnboardingFlow } from '../../saved_objects/observability_o import { createObservabilityOnboardingServerRoute } from '../create_observability_onboarding_server_route'; import { getHasLogs } from './get_has_logs'; import { getKibanaUrl } from '../../lib/get_fallback_urls'; -import { hasLogMonitoringPrivileges } from '../logs/api_key/has_log_monitoring_privileges'; -import { createShipperApiKey } from '../logs/api_key/create_shipper_api_key'; -import { createInstallApiKey } from '../logs/api_key/create_install_api_key'; import { getAgentVersion } from '../../lib/get_agent_version'; import { getFallbackESUrl } from '../../lib/get_fallback_urls'; import { ElasticAgentStepPayload, InstalledIntegration, StepProgressPayloadRT } from '../types'; +import { createShipperApiKey } from '../../lib/api_key/create_shipper_api_key'; +import { createInstallApiKey } from '../../lib/api_key/create_install_api_key'; +import { hasLogMonitoringPrivileges } from '../../lib/api_key/has_log_monitoring_privileges'; const updateOnboardingFlowRoute = createObservabilityOnboardingServerRoute({ endpoint: 'PUT /internal/observability_onboarding/flow/{onboardingId}', @@ -229,8 +229,11 @@ const createFlowRoute = createObservabilityOnboardingServerRoute({ progress: {}, }, }), - createShipperApiKey(client.asCurrentUser, name), - securityPluginStart.authc.apiKeys.create(request, createInstallApiKey(name)), + createShipperApiKey(client.asCurrentUser, `onboarding_ingest_${name}`), + securityPluginStart.authc.apiKeys.create( + request, + createInstallApiKey(`onboarding_install_${name}`) + ), getAgentVersion(fleetPluginStart, kibanaVersion), ]); diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/index.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/index.ts index 2f9ce174cf040..e444f2266f18f 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/index.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/index.ts @@ -7,6 +7,7 @@ import type { EndpointOf, ServerRouteRepository } from '@kbn/server-route-repository'; import { elasticAgentRouteRepository } from './elastic_agent/route'; import { flowRouteRepository } from './flow/route'; +import { kubernetesOnboardingRouteRepository } from './kubernetes/route'; import { logsOnboardingRouteRepository } from './logs/route'; function getTypedObservabilityOnboardingServerRouteRepository() { @@ -14,6 +15,7 @@ function getTypedObservabilityOnboardingServerRouteRepository() { ...flowRouteRepository, ...logsOnboardingRouteRepository, ...elasticAgentRouteRepository, + ...kubernetesOnboardingRouteRepository, }; return repository; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/kubernetes/route.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/kubernetes/route.ts new file mode 100644 index 0000000000000..efbea4a0bcd4e --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/kubernetes/route.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { v4 as uuidv4 } from 'uuid'; +import * as t from 'io-ts'; +import Boom from '@hapi/boom'; +import { termQuery } from '@kbn/observability-plugin/server'; +import type { estypes } from '@elastic/elasticsearch'; +import { getFallbackESUrl } from '../../lib/get_fallback_urls'; +import { createObservabilityOnboardingServerRoute } from '../create_observability_onboarding_server_route'; +import { hasLogMonitoringPrivileges } from '../../lib/api_key/has_log_monitoring_privileges'; +import { createShipperApiKey } from '../../lib/api_key/create_shipper_api_key'; +import { getAgentVersion } from '../../lib/get_agent_version'; + +export interface CreateKubernetesOnboardingFlowRouteResponse { + apiKeyEncoded: string; + onboardingId: string; + elasticsearchUrl: string; + elasticAgentVersion: string; +} + +export interface HasKubernetesDataRouteResponse { + hasData: boolean; +} + +const createKubernetesOnboardingFlowRoute = createObservabilityOnboardingServerRoute({ + endpoint: 'POST /internal/observability_onboarding/kubernetes/flow', + options: { tags: [] }, + async handler({ + context, + request, + plugins, + services, + kibanaVersion, + }): Promise { + const { + elasticsearch: { client }, + } = await context.core; + + const hasPrivileges = await hasLogMonitoringPrivileges(client.asCurrentUser); + + if (!hasPrivileges) { + throw Boom.forbidden( + "You don't have enough privileges to start a new onboarding flow. Contact your system administrator to grant you the required privileges." + ); + } + + const fleetPluginStart = await plugins.fleet.start(); + const packageClient = fleetPluginStart.packageService.asScoped(request); + + await packageClient.ensureInstalledPackage({ pkgName: 'kubernetes' }); + + const [{ encoded: apiKeyEncoded }, elasticAgentVersion] = await Promise.all([ + createShipperApiKey(client.asCurrentUser, 'kubernetes_onboarding'), + getAgentVersion(fleetPluginStart, kibanaVersion), + ]); + const elasticsearchUrlList = plugins.cloud?.setup?.elasticsearchUrl + ? [plugins.cloud?.setup?.elasticsearchUrl] + : await getFallbackESUrl(services.esLegacyConfigService); + + return { + onboardingId: uuidv4(), + apiKeyEncoded, + elasticsearchUrl: elasticsearchUrlList.length > 0 ? elasticsearchUrlList[0] : '', + elasticAgentVersion, + }; + }, +}); + +const hasKubernetesDataRoute = createObservabilityOnboardingServerRoute({ + endpoint: 'GET /internal/observability_onboarding/kubernetes/{onboardingId}/has-data', + params: t.type({ + path: t.type({ + onboardingId: t.string, + }), + }), + options: { tags: [] }, + async handler(resources): Promise { + const { onboardingId } = resources.params.path; + const { elasticsearch } = await resources.context.core; + + try { + const result = await elasticsearch.client.asCurrentUser.search({ + index: ['logs-*', 'metrics-*'], + ignore_unavailable: true, + size: 0, + terminate_after: 1, + query: { + bool: { + filter: termQuery('fields.onboarding_id', onboardingId), + }, + }, + }); + const { value } = result.hits.total as estypes.SearchTotalHits; + + return { + hasData: value > 0, + }; + } catch (error) { + throw Boom.internal(`Elasticsearch responses with an error. ${error.message}`); + } + }, +}); + +export const kubernetesOnboardingRouteRepository = { + ...createKubernetesOnboardingFlowRoute, + ...hasKubernetesDataRoute, +}; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/route.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/route.ts index 524037c1c4222..6d17617e1a94e 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/route.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/logs/route.ts @@ -10,10 +10,10 @@ import { createObservabilityOnboardingServerRoute } from '../create_observabilit import { getFallbackESUrl } from '../../lib/get_fallback_urls'; import { getKibanaUrl } from '../../lib/get_fallback_urls'; import { getAgentVersion } from '../../lib/get_agent_version'; -import { hasLogMonitoringPrivileges } from './api_key/has_log_monitoring_privileges'; import { saveObservabilityOnboardingFlow } from '../../lib/state'; -import { createShipperApiKey } from './api_key/create_shipper_api_key'; +import { createShipperApiKey } from '../../lib/api_key/create_shipper_api_key'; import { ObservabilityOnboardingFlow } from '../../saved_objects/observability_onboarding_status'; +import { hasLogMonitoringPrivileges } from '../../lib/api_key/has_log_monitoring_privileges'; const logMonitoringPrivilegesRoute = createObservabilityOnboardingServerRoute({ endpoint: 'GET /internal/observability_onboarding/logs/setup/privileges', @@ -115,7 +115,10 @@ const createFlowRoute = createObservabilityOnboardingServerRoute({ const { elasticsearch: { client }, } = await context.core; - const { encoded: apiKeyEncoded } = await createShipperApiKey(client.asCurrentUser, name); + const { encoded: apiKeyEncoded } = await createShipperApiKey( + client.asCurrentUser, + `standalone_agent_logs_onboarding_${name}` + ); const generatedState = type === 'systemLogs' ? { namespace: 'default' } : state; const savedObjectsClient = coreStart.savedObjects.getScopedClient(request); diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts index a7ef942d7ea0a..bf996b96e1958 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts @@ -23,10 +23,10 @@ export interface SystemLogsState { namespace: string; } -export type ObservabilityOnboardingType = 'logFiles' | 'systemLogs' | 'autoDetect'; - type ObservabilityOnboardingFlowState = LogFilesState | SystemLogsState | undefined; +type ObservabilityOnboardingType = 'logFiles' | 'systemLogs' | 'autoDetect' | 'kubernetes'; + export interface ObservabilityOnboardingFlow { type: ObservabilityOnboardingType; state: ObservabilityOnboardingFlowState; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/test_helpers/create_observability_onboarding_users/authentication.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/test_helpers/create_observability_onboarding_users/authentication.ts index 95da640fa40ae..340f0cb615651 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/test_helpers/create_observability_onboarding_users/authentication.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/test_helpers/create_observability_onboarding_users/authentication.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { cluster, indices } from '../../routes/logs/api_key/monitoring_config'; +import { cluster, indices } from '../../lib/api_key/monitoring_config'; export enum ObservabilityOnboardingUsername { noAccessUser = 'no_access_user', From 7988c1711e63169dde104a19fc6ea317196a3cd5 Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:07:57 +0200 Subject: [PATCH 46/82] [Fleet] Reusable integration policies fixes (#187980) ## Summary Related to https://github.com/elastic/ingest-dev/issues/3335 Fixing issues found during testing. Updated validation message in Edit integration page: image API validation: at least one agent policy id must be provided when updating a package policy ``` PUT kbn:/api/fleet/package_policies/3e725032-66cf-47cb-af1a-261b3b92f260 { "policy_ids": [ ] } { "statusCode": 400, "error": "Bad Request", "message": "At least one agent policy id must be provided" } ``` API validation: multiple `policy_ids` are not accepted if the feature flag is off ``` PUT kbn:/api/fleet/package_policies/3e725032-66cf-47cb-af1a-261b3b92f260 { "policy_ids": [ "ca0cb008-d243-4f93-8bab-ac2f9a60683b", "397c47dd-8d58-459c-8171-1a81f95e9656" ] } { "statusCode": 400, "error": "Bad Request", "message": "Reusable integration policies are not supported" } ``` Fixed modal to show shared warning when deleting integration policy from Agent policy / Integrations list: image ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../steps/step_select_agent_policy.test.tsx | 4 +-- .../steps/step_select_agent_policy.tsx | 2 +- .../steps/step_select_hosts.test.tsx | 2 +- .../package_policy_delete_provider.tsx | 14 ++++++-- .../routes/package_policy/handlers.test.ts | 33 +++++++++++++++++++ .../server/routes/package_policy/handlers.ts | 4 +++ .../routes/package_policy/utils/index.ts | 9 +++-- 7 files changed, 59 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx index 30688c7a99b11..237ab76465fdd 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.test.tsx @@ -105,7 +105,7 @@ describe('step select agent policy', () => { const select = renderResult.container.querySelector('[data-test-subj="agentPolicySelect"]'); expect((select as any)?.value).toEqual(''); - expect(renderResult.getByText('An agent policy is required.')).toBeVisible(); + expect(renderResult.getByText('At least one agent policy is required.')).toBeVisible(); }); }); @@ -178,7 +178,7 @@ describe('step select agent policy', () => { ); expect((select as any)?.value).toEqual(undefined); - expect(renderResult.getByText('An agent policy is required.')).toBeVisible(); + expect(renderResult.getByText('At least one agent policy is required.')).toBeVisible(); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx index 349105eafee4c..ecfd18ef9aac4 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/step_select_agent_policy.tsx @@ -244,7 +244,7 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ selectedPolicyIds.length === 0 ? ( ) : someNewAgentPoliciesHaveLimitedPackage ? ( { }); waitFor(() => { - expect(renderResult.getByText('An agent policy is required.')).toBeInTheDocument(); + expect(renderResult.getByText('At least one agent policy is required.')).toBeInTheDocument(); }); }); }); diff --git a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx index 35f2313f37e0a..6369d344a2d9f 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx @@ -43,6 +43,16 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent = ({ const onSuccessCallback = useRef(null); const { canUseMultipleAgentPolicies } = useMultipleAgentPolicies(); + const isShared = useMemo(() => { + if (agentPolicies?.length !== 1) { + return false; + } + const packagePolicy = agentPolicies[0].package_policies?.find( + (policy) => policy.id === packagePolicies[0] + ); + return (packagePolicy?.policy_ids?.length ?? 0) > 1; + }, [agentPolicies, packagePolicies]); + const hasMultipleAgentPolicies = canUseMultipleAgentPolicies && agentPolicies && agentPolicies.length > 1; @@ -59,7 +69,7 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent = ({ const request = await sendGetAgents({ kuery, - showInactive: false, + showInactive: true, }); setAgentsCount(request.data?.total || 0); setIsLoadingAgentsCount(false); @@ -196,7 +206,7 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent = ({ /> ) : agentsCount && agentPolicies ? ( <> - {hasMultipleAgentPolicies && ( + {(hasMultipleAgentPolicies || isShared) && ( <> { it('should not throw if enterprise license and multiple policy_ids is provided', async () => { jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ enableReusableIntegrationPolicies: true } as any); const request = getUpdateKibanaRequest({ policy_ids: ['1', '2'] } as any); await routeHandler(context, request, response); expect(response.ok).toHaveBeenCalled(); }); + + it('should throw if enterprise license and feature flag is disabled and multiple policy_ids is provided', async () => { + jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ enableReusableIntegrationPolicies: false } as any); + const request = getUpdateKibanaRequest({ policy_ids: ['1', '2'] } as any); + await routeHandler(context, request, response); + expect(response.customError).toHaveBeenCalledWith({ + statusCode: 400, + body: { + message: 'Reusable integration policies are not supported', + }, + }); + }); + + it('should throw if empty policy_ids are provided', async () => { + jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); + jest + .spyOn(appContextService, 'getExperimentalFeatures') + .mockReturnValue({ enableReusableIntegrationPolicies: true } as any); + const request = getUpdateKibanaRequest({ policy_ids: [] } as any); + await routeHandler(context, request, response); + expect(response.customError).toHaveBeenCalledWith({ + statusCode: 400, + body: { + message: 'At least one agent policy id must be provided', + }, + }); + }); }); describe('list api handler', () => { diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts index abad84ef9db9d..a40b2a41d89db 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts @@ -421,6 +421,10 @@ export const updatePackagePolicyHandler: FleetRequestHandler< throw new PackagePolicyRequestError(errorMessage); } + if (newData.policy_ids && newData.policy_ids.length === 0) { + throw new PackagePolicyRequestError('At least one agent policy id must be provided'); + } + const updatedPackagePolicy = await packagePolicyService.update( soClient, esClient, diff --git a/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts b/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts index da1fca175b9cf..7a88899d8ba28 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/utils/index.ts @@ -8,7 +8,7 @@ import type { TypeOf } from '@kbn/config-schema'; import type { CreatePackagePolicyRequestSchema, PackagePolicyInput } from '../../../types'; -import { licenseService } from '../../../services'; +import { appContextService, licenseService } from '../../../services'; import type { SimplifiedPackagePolicy } from '../../../../common/services/simplified_package_policy_helper'; export function isSimplifiedCreatePackagePolicyRequest( @@ -44,9 +44,12 @@ const LICENCE_FOR_MULTIPLE_AGENT_POLICIES = 'enterprise'; export function canUseMultipleAgentPolicies() { const hasEnterpriseLicence = licenseService.hasAtLeast(LICENCE_FOR_MULTIPLE_AGENT_POLICIES); + const { enableReusableIntegrationPolicies } = appContextService.getExperimentalFeatures(); return { - canUseReusablePolicies: hasEnterpriseLicence, - errorMessage: 'Reusable integration policies are only available with an Enterprise license', + canUseReusablePolicies: hasEnterpriseLicence && enableReusableIntegrationPolicies, + errorMessage: !hasEnterpriseLicence + ? 'Reusable integration policies are only available with an Enterprise license' + : 'Reusable integration policies are not supported', }; } From 696bb88d7c33eebfeabec6064ea8a97a2e2bb1bb Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Wed, 10 Jul 2024 17:17:31 +0200 Subject: [PATCH 47/82] [Fleet] Display view in logs button when logs app is available (#187871) Closes https://github.com/elastic/kibana/issues/185711 ## Summary This change fixes https://github.com/elastic/kibana/issues/185711, but while working on that I also realised that we should move away from using hardcoded urls. So this PR does two things: - Displays the button only when the user has `authz.fleet.readAgents` privilege - Refactors the button functionality to use the new locators that take care of linking to the observability logs/discover app ### Why the refactor While testing this button, I noticed that the functionality was broken in some cases, that's because we were manually routing the urls to Logs UI/Discover apps based if we are in serverless or not. I found a PR that already implements this functionality: https://github.com/elastic/kibana/pull/155156 I also found https://github.com/elastic/kibana/pull/154145 that takes care of the redirect to the correct app. So I'm replacing the current manual functionality with these utilities so that `getLogsLocatorsFromUrlService` takes care of where the open in logs button should link. ### ESS https://github.com/elastic/kibana/assets/16084106/3f0760c9-3afb-4793-a3af-317f625b36d7 https://github.com/elastic/kibana/assets/16084106/3436cf5a-36c9-425d-a114-e116ddaa1a03 ### Serverless https://github.com/elastic/kibana/assets/16084106/84176f09-96a4-4932-9508-5f7682d03aae --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../fleet/common/constants/locators.ts | 1 + .../components/agent_logs/agent_logs.test.tsx | 49 +++++++---- .../components/agent_logs/agent_logs.tsx | 10 +-- .../agent_logs/view_logs_button.tsx | 84 +++++++------------ .../agent_activity_flyout/index.test.tsx | 26 +++++- .../components/view_errors.test.tsx | 75 ++++++++++++----- .../components/view_errors.tsx | 23 +++-- .../public/custom_logs_assets_extension.tsx | 1 + .../plugins/fleet/public/hooks/use_locator.ts | 4 + x-pack/plugins/fleet/tsconfig.json | 1 - .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 13 files changed, 165 insertions(+), 112 deletions(-) diff --git a/x-pack/plugins/fleet/common/constants/locators.ts b/x-pack/plugins/fleet/common/constants/locators.ts index daa00bcae46e0..cca0687a172d8 100644 --- a/x-pack/plugins/fleet/common/constants/locators.ts +++ b/x-pack/plugins/fleet/common/constants/locators.ts @@ -8,6 +8,7 @@ export const LOCATORS_IDS = { APM_LOCATOR: 'APM_LOCATOR', DASHBOARD_APP: 'DASHBOARD_APP_LOCATOR', + DISCOVER_APP_LOCATOR: 'DISCOVER_APP_LOCATOR', } as const; // Dashboards ids diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx index 7824b8abd2a5c..78e32727212c9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.test.tsx @@ -12,8 +12,6 @@ import { createFleetTestRendererMock } from '../../../../../../../mock'; import { AgentLogsUI } from './agent_logs'; -jest.mock('../../../../../../../hooks/use_authz'); - jest.mock('@kbn/kibana-utils-plugin/public', () => { return { ...jest.requireActual('@kbn/kibana-utils-plugin/public'), @@ -28,6 +26,13 @@ jest.mock('@kbn/logs-shared-plugin/public', () => { LogStream: () =>
, }; }); +jest.mock('@kbn/logs-shared-plugin/common', () => { + return { + getLogsLocatorsFromUrlService: jest.fn().mockReturnValue({ + logsLocator: { getRedirectUrl: jest.fn(() => 'https://discover-redirect-url') }, + }), + }; +}); jest.mock('@kbn/shared-ux-link-redirect-app', () => { return { @@ -52,6 +57,13 @@ jest.mock('../../../../../hooks', () => { ...jest.requireActual('../../../../../hooks'), useLink: jest.fn(), useStartServices: jest.fn(), + useAuthz: jest.fn(), + useDiscoverLocator: jest.fn().mockImplementation(() => { + return { + id: 'DISCOVER_APP_LOCATOR', + getRedirectUrl: jest.fn().mockResolvedValue('app/discover/logs/someview'), + }; + }), }; }); @@ -62,6 +74,7 @@ describe('AgentLogsUI', () => { jest.mocked(useAuthz).mockReturnValue({ fleet: { allAgents: true, + readAgents: true, }, } as any); }); @@ -100,34 +113,36 @@ describe('AgentLogsUI', () => { }, }, }, - http: { - basePath: { - prepend: (url: string) => 'http://localhost:5620' + url, + share: { + url: { + locators: { + get: () => ({ + useUrl: () => 'https://locator.url', + }), + }, }, }, - cloud: { - isServerlessEnabled, - }, }); }; - it('should render Open in Logs UI if capabilities not set', () => { + it('should render Open in Logs button if privileges are set', () => { mockStartServices(); const result = renderComponent(); expect(result.getByTestId('viewInLogsBtn')).toHaveAttribute( 'href', - `http://localhost:5620/app/logs/stream?logPosition=(end%3A'2023-20-04T14%3A20%3A00.340Z'%2Cstart%3A'2023-20-04T14%3A00%3A00.340Z'%2CstreamLive%3A!f)&logFilter=(expression%3A'elastic_agent.id%3Aagent1%20and%20(data_stream.dataset%3Aelastic_agent)%20and%20(log.level%3Ainfo%20or%20log.level%3Aerror)'%2Ckind%3Akuery)` + `https://discover-redirect-url` ); }); - it('should render Open in Discover if serverless enabled', () => { - mockStartServices(true); + it('should not render Open in Logs button if privileges are not set', () => { + jest.mocked(useAuthz).mockReturnValue({ + fleet: { + readAgents: false, + }, + } as any); + mockStartServices(); const result = renderComponent(); - const viewInDiscover = result.getByTestId('viewInDiscoverBtn'); - expect(viewInDiscover).toHaveAttribute( - 'href', - `http://localhost:5620/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'2023-20-04T14:00:00.340Z',to:'2023-20-04T14:20:00.340Z'))&_a=(columns:!(event.dataset,message),index:'logs-*',query:(language:kuery,query:'elastic_agent.id:agent1 and (data_stream.dataset:elastic_agent) and (log.level:info or log.level:error)'))` - ); + expect(result.queryByTestId('viewInLogsBtn')).not.toBeInTheDocument(); }); it('should show log level dropdown with correct value', () => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx index 34cc206967d62..5a9bfecd22144 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx @@ -35,7 +35,7 @@ import { LogLevelFilter } from './filter_log_level'; import { LogQueryBar } from './query_bar'; import { buildQuery } from './build_query'; import { SelectLogLevel } from './select_log_level'; -import { ViewLogsButton } from './view_logs_button'; +import { ViewLogsButton, getFormattedRange } from './view_logs_button'; const WrapperFlexGroup = styled(EuiFlexGroup)` height: 100%; @@ -112,9 +112,8 @@ const AgentPolicyLogsNotEnabledCallout: React.FunctionComponent<{ agentPolicy: A export const AgentLogsUI: React.FunctionComponent = memo( ({ agent, agentPolicy, state }) => { - const { data, application, cloud } = useStartServices(); + const { data, application } = useStartServices(); const { update: updateState } = AgentLogsUrlStateHelper.useTransitions(); - const isLogsUIAvailable = !cloud?.isServerlessEnabled; // Util to convert date expressions (returned by datepicker) to timestamps (used by LogStream) const getDateRangeTimestamps = useCallback( @@ -321,10 +320,9 @@ export const AgentLogsUI: React.FunctionComponent = memo( }} > diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx index 762c34ad7bc36..7b859596987c0 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/view_logs_button.tsx @@ -5,81 +5,61 @@ * 2.0. */ -import url from 'url'; -import { stringify } from 'querystring'; - import React, { useMemo } from 'react'; -import { encode } from '@kbn/rison'; import { EuiButton } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useStartServices } from '../../../../../hooks'; +import { getLogsLocatorsFromUrlService } from '@kbn/logs-shared-plugin/common'; + +import moment from 'moment'; + +import { useDiscoverLocator, useStartServices, useAuthz } from '../../../../../hooks'; interface ViewLogsProps { - viewInLogs: boolean; logStreamQuery: string; - startTime: string; - endTime: string; + startTime: number; + endTime: number; } +export const getFormattedRange = (date: string) => new Date(date).getTime(); + /* - Button that takes to the Logs view Ui when that is available, otherwise fallback to the Discover UI - The urls are built using same logStreamQuery (provided by a prop), startTime and endTime, ensuring that they'll both will target same log lines + Button that takes to the Logs view UI or the Discover logs, depending on what's available + If none is available, don't display the button at all */ export const ViewLogsButton: React.FunctionComponent = ({ - viewInLogs, logStreamQuery, startTime, endTime, }) => { - const { http } = useStartServices(); + const discoverLocator = useDiscoverLocator(); - // Generate URL to pass page state to Logs UI - const viewInLogsUrl = useMemo( - () => - http.basePath.prepend( - url.format({ - pathname: '/app/logs/stream', - search: stringify({ - logPosition: encode({ - start: startTime, - end: endTime, - streamLive: false, - }), - logFilter: encode({ - expression: logStreamQuery, - kind: 'kuery', - }), - }), - }) - ), - [http.basePath, startTime, endTime, logStreamQuery] - ); + const { share } = useStartServices(); + const { logsLocator } = getLogsLocatorsFromUrlService(share.url); + const authz = useAuthz(); - const viewInDiscoverUrl = useMemo(() => { - const index = 'logs-*'; - const query = encode({ - query: logStreamQuery, - language: 'kuery', + const logsUrl = useMemo(() => { + const now = moment().toISOString(); + const oneDayAgo = moment().subtract(1, 'day').toISOString(); + const defaultStartTime = getFormattedRange(oneDayAgo); + const defaultEndTime = getFormattedRange(now); + + return logsLocator.getRedirectUrl({ + time: endTime ? endTime : defaultEndTime, + timeRange: { + startTime: startTime ? startTime : defaultStartTime, + endTime: endTime ? endTime : defaultEndTime, + }, + filter: logStreamQuery, }); - return http.basePath.prepend( - `/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'${startTime}',to:'${endTime}'))&_a=(columns:!(event.dataset,message),index:'${index}',query:${query})` - ); - }, [logStreamQuery, http.basePath, startTime, endTime]); + }, [endTime, logStreamQuery, logsLocator, startTime]); - return viewInLogs ? ( - + return authz.fleet.readAgents && (logsLocator || discoverLocator) ? ( + - ) : ( - - - - ); + ) : null; }; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx index 433cd687208fc..c649b3829a41e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/agent_activity_flyout/index.test.tsx @@ -11,7 +11,7 @@ import { act, render, fireEvent } from '@testing-library/react'; import { IntlProvider } from 'react-intl'; import { useActionStatus } from '../../hooks'; -import { useGetAgentPolicies, useStartServices } from '../../../../../hooks'; +import { useGetAgentPolicies, useStartServices, useAuthz } from '../../../../../hooks'; import { AgentActivityFlyout } from '.'; @@ -25,6 +25,15 @@ jest.mock('@kbn/shared-ux-link-redirect-app', () => ({ const mockUseActionStatus = useActionStatus as jest.Mock; const mockUseGetAgentPolicies = useGetAgentPolicies as jest.Mock; const mockUseStartServices = useStartServices as jest.Mock; +const mockedUseAuthz = useAuthz as jest.Mock; + +jest.mock('@kbn/logs-shared-plugin/common', () => { + return { + getLogsLocatorsFromUrlService: jest.fn().mockReturnValue({ + logsLocator: { getRedirectUrl: jest.fn(() => 'https://discover-redirect-url') }, + }), + }; +}); describe('AgentActivityFlyout', () => { const mockOnClose = jest.fn(); @@ -65,7 +74,22 @@ describe('AgentActivityFlyout', () => { docLinks: { links: { fleet: { upgradeElasticAgent: 'https://elastic.co' } } }, application: { navigateToUrl: jest.fn() }, http: { basePath: { prepend: jest.fn() } }, + share: { + url: { + locators: { + get: () => ({ + useUrl: () => 'https://locator.url', + }), + }, + }, + }, }); + mockedUseAuthz.mockReturnValue({ + fleet: { + readAgents: true, + allAgents: true, + }, + } as any); }); beforeEach(() => { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx index b5018f812da4e..e8f73eae3a2b9 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.test.tsx @@ -12,7 +12,7 @@ import { I18nProvider } from '@kbn/i18n-react'; import type { ActionStatus } from '../../../../../../../common/types'; -import { useStartServices } from '../../../../hooks'; +import { useStartServices, useAuthz } from '../../../../hooks'; import { ViewErrors } from './view_errors'; @@ -21,6 +21,13 @@ jest.mock('../../../../hooks', () => { ...jest.requireActual('../../../../hooks'), useLink: jest.fn(), useStartServices: jest.fn(), + useAuthz: jest.fn(), + useDiscoverLocator: jest.fn().mockImplementation(() => { + return { + id: 'DISCOVER_APP_LOCATOR', + getRedirectUrl: jest.fn().mockResolvedValue('app/discover/logs/someview'), + }; + }), }; }); @@ -32,6 +39,14 @@ jest.mock('@kbn/shared-ux-link-redirect-app', () => ({ }, })); +jest.mock('@kbn/logs-shared-plugin/common', () => { + return { + getLogsLocatorsFromUrlService: jest.fn().mockReturnValue({ + logsLocator: { getRedirectUrl: jest.fn(() => 'https://discover-redirect-url') }, + }), + }; +}); + const mockStartServices = (isServerlessEnabled?: boolean) => { mockUseStartServices.mockReturnValue({ application: {}, @@ -47,18 +62,27 @@ const mockStartServices = (isServerlessEnabled?: boolean) => { }, }, }, - http: { - basePath: { - prepend: (url: string) => 'http://localhost:5620' + url, + share: { + url: { + locators: { + get: () => ({ + useUrl: () => 'https://locator.url', + }), + }, }, }, - cloud: { - isServerlessEnabled, - }, }); }; describe('ViewErrors', () => { + beforeEach(() => { + jest.mocked(useAuthz).mockReturnValue({ + fleet: { + allAgents: true, + readAgents: true, + }, + } as any); + }); const renderComponent = (action: ActionStatus) => { return render( @@ -67,7 +91,7 @@ describe('ViewErrors', () => { ); }; - it('should render error message with btn to Logs view if serverless not enabled', () => { + it('should render error message with btn to Logs view', () => { mockStartServices(); const result = renderComponent({ actionId: 'action1', @@ -82,15 +106,32 @@ describe('ViewErrors', () => { const errorText = result.getByTestId('errorText'); expect(errorText.textContent).toEqual('Agent agent1 is not upgradeable'); + }); + + it('should render open in Logs button if correct privileges are set', () => { + mockStartServices(); + const result = renderComponent({ + actionId: 'action1', + latestErrors: [ + { + agentId: 'agent1', + error: 'Agent agent1 is not upgradeable', + timestamp: '2023-03-06T14:51:24.709Z', + }, + ], + } as any); const viewErrorBtn = result.getByTestId('viewInLogsBtn'); - expect(viewErrorBtn.getAttribute('href')).toEqual( - `http://localhost:5620/app/logs/stream?logPosition=(end%3A'2023-03-06T14%3A56%3A24.709Z'%2Cstart%3A'2023-03-06T14%3A46%3A24.709Z'%2CstreamLive%3A!f)&logFilter=(expression%3A'elastic_agent.id%3Aagent1%20and%20(data_stream.dataset%3Aelastic_agent)%20and%20(log.level%3Aerror)'%2Ckind%3Akuery)` - ); + expect(viewErrorBtn.getAttribute('href')).toEqual(`https://discover-redirect-url`); }); - it('should render error message with btn to Discover view if serverless enabled', () => { - mockStartServices(true); + it('should not render open in Logs button if privileges are not set', () => { + jest.mocked(useAuthz).mockReturnValue({ + fleet: { + readAgents: false, + }, + } as any); + mockStartServices(); const result = renderComponent({ actionId: 'action1', latestErrors: [ @@ -102,12 +143,6 @@ describe('ViewErrors', () => { ], } as any); - const errorText = result.getByTestId('errorText'); - expect(errorText.textContent).toEqual('Agent agent1 is not upgradeable'); - - const viewErrorBtn = result.getByTestId('viewInDiscoverBtn'); - expect(viewErrorBtn.getAttribute('href')).toEqual( - `http://localhost:5620/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'2023-03-06T14:46:24.709Z',to:'2023-03-06T14:56:24.709Z'))&_a=(columns:!(event.dataset,message),index:'logs-*',query:(language:kuery,query:'elastic_agent.id:agent1 and (data_stream.dataset:elastic_agent) and (log.level:error)'))` - ); + expect(result.queryByTestId('viewInLogsBtn')).not.toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx index 4d43c9a60a618..e73d7778d1405 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_list_page/components/view_errors.tsx @@ -17,7 +17,10 @@ import { i18n } from '@kbn/i18n'; import type { ActionErrorResult } from '../../../../../../../common/types'; import { buildQuery } from '../../agent_details_page/components/agent_logs/build_query'; -import { ViewLogsButton } from '../../agent_details_page/components/agent_logs/view_logs_button'; +import { + ViewLogsButton, + getFormattedRange, +} from '../../agent_details_page/components/agent_logs/view_logs_button'; import type { ActionStatus } from '../../../../types'; import { useStartServices } from '../../../../hooks'; @@ -30,11 +33,12 @@ const TruncatedEuiText = styled(EuiText)` export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ action }) => { const coreStart = useStartServices(); - const isLogsUIAvailable = !coreStart.cloud?.isServerlessEnabled; - const getLogsButton = (agentId: string, timestamp: string, viewInLogs: boolean) => { - const startTime = moment(timestamp).subtract(5, 'm').toISOString(); - const endTime = moment(timestamp).add(5, 'm').toISOString(); + const getLogsButton = (agentId: string, timestamp: string) => { + const start = moment(timestamp).subtract(5, 'm').toISOString(); + const end = moment(timestamp).add(5, 'm').toISOString(); + const startTime = getFormattedRange(start); + const endTime = getFormattedRange(end); const logStreamQuery = buildQuery({ agentId, @@ -43,12 +47,7 @@ export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ userQuery: '', }); return ( - + ); }; @@ -86,7 +85,7 @@ export const ViewErrors: React.FunctionComponent<{ action: ActionStatus }> = ({ const errorItem = (action.latestErrors ?? []).find((item) => item.agentId === agentId); return ( - {getLogsButton(agentId, errorItem!.timestamp, !!isLogsUIAvailable)} + {getLogsButton(agentId, errorItem!.timestamp)} ); }, diff --git a/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx b/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx index 26668c4062981..09a101ef85b8f 100644 --- a/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx +++ b/x-pack/plugins/fleet/public/custom_logs_assets_extension.tsx @@ -17,6 +17,7 @@ export const CustomLogsAssetsExtension: PackageAssetsComponent = () => { const { http, cloud } = useStartServices(); const isLogsUIAvailable = !cloud?.isServerlessEnabled; // if logs ui is not available, link to discover + // TODO: move away from hardcoded link and use locators instead const logStreamUrl = isLogsUIAvailable ? http.basePath.prepend('/app/logs/stream') : http.basePath.prepend('/app/discover'); diff --git a/x-pack/plugins/fleet/public/hooks/use_locator.ts b/x-pack/plugins/fleet/public/hooks/use_locator.ts index a3fed97679456..25a673b694670 100644 --- a/x-pack/plugins/fleet/public/hooks/use_locator.ts +++ b/x-pack/plugins/fleet/public/hooks/use_locator.ts @@ -21,3 +21,7 @@ export function useLocator( export function useDashboardLocator() { return useLocator(LOCATORS_IDS.DASHBOARD_APP); } + +export function useDiscoverLocator() { + return useLocator(LOCATORS_IDS.DISCOVER_APP_LOCATOR); +} diff --git a/x-pack/plugins/fleet/tsconfig.json b/x-pack/plugins/fleet/tsconfig.json index 8986527bed977..b45bd90010b42 100644 --- a/x-pack/plugins/fleet/tsconfig.json +++ b/x-pack/plugins/fleet/tsconfig.json @@ -64,7 +64,6 @@ "@kbn/utility-types-jest", "@kbn/es-query", "@kbn/ui-theme", - "@kbn/rison", "@kbn/config-schema", "@kbn/telemetry-plugin", "@kbn/task-manager-plugin", diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5cbe8f43a1322..5b97f97d5a585 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -17668,7 +17668,6 @@ "xpack.fleet.agentLogs.downloadLink": "télécharger", "xpack.fleet.agentLogs.logDisabledCallOutTitle": "La collecte de logs est désactivée", "xpack.fleet.agentLogs.logLevelSelectText": "Niveau du log", - "xpack.fleet.agentLogs.openInDiscoverUiLinkText": "Ouvrir dans Discover", "xpack.fleet.agentLogs.openInLogsUiLinkText": "Ouvrir dans Logs", "xpack.fleet.agentLogs.searchPlaceholderText": "Rechercher dans les logs…", "xpack.fleet.agentLogs.selectLogLevel.errorTitleText": "Erreur lors de la mise à jour du niveau de logging de l'agent", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a7dcd7e5416c6..624ab8b984ad9 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -17646,7 +17646,6 @@ "xpack.fleet.agentLogs.downloadLink": "ダウンロード", "xpack.fleet.agentLogs.logDisabledCallOutTitle": "ログ収集は無効です", "xpack.fleet.agentLogs.logLevelSelectText": "ログレベル", - "xpack.fleet.agentLogs.openInDiscoverUiLinkText": "Discoverで開く", "xpack.fleet.agentLogs.openInLogsUiLinkText": "ログで開く", "xpack.fleet.agentLogs.searchPlaceholderText": "ログを検索…", "xpack.fleet.agentLogs.selectLogLevel.errorTitleText": "エージェントログレベルの更新エラー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index b6203a35743e3..e3f237c9ac047 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -17675,7 +17675,6 @@ "xpack.fleet.agentLogs.downloadLink": "下载", "xpack.fleet.agentLogs.logDisabledCallOutTitle": "日志收集已禁用", "xpack.fleet.agentLogs.logLevelSelectText": "日志级别", - "xpack.fleet.agentLogs.openInDiscoverUiLinkText": "在 Discover 中打开", "xpack.fleet.agentLogs.openInLogsUiLinkText": "在日志中打开", "xpack.fleet.agentLogs.searchPlaceholderText": "搜索日志……", "xpack.fleet.agentLogs.selectLogLevel.errorTitleText": "更新代理日志记录级别时出错", From 46b21546aac66ca509f4c1ea197c12eac5675f32 Mon Sep 17 00:00:00 2001 From: Saarika Bhasi <55930906+saarikabhasi@users.noreply.github.com> Date: Wed, 10 Jul 2024 11:18:53 -0400 Subject: [PATCH 48/82] [Index management] Refactor api_integration tests for create inference endpoint (#187521) ## Summary * delete underlying trained model during `after all` clean up * handle request time out error when creating inference endpoint Tested against QA deployment and locally. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../index_management/inference_endpoints.ts | 65 +++++++++--------- x-pack/test/functional/services/ml/api.ts | 14 ++-- x-pack/test/tsconfig.json | 3 +- .../index_management/inference_endpoints.ts | 67 ++++++++++--------- x-pack/test_serverless/tsconfig.json | 1 + 5 files changed, 82 insertions(+), 68 deletions(-) diff --git a/x-pack/test/api_integration/apis/management/index_management/inference_endpoints.ts b/x-pack/test/api_integration/apis/management/index_management/inference_endpoints.ts index ecfcff804d69a..f5d67ba06bc15 100644 --- a/x-pack/test/api_integration/apis/management/index_management/inference_endpoints.ts +++ b/x-pack/test/api_integration/apis/management/index_management/inference_endpoints.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; import { FtrProviderContext } from '../../../ftr_provider_context'; const API_BASE_PATH = '/api/index_management'; @@ -17,46 +18,48 @@ export default function ({ getService }: FtrProviderContext) { const inferenceId = 'my-elser-model'; const taskType = 'sparse_embedding'; const service = 'elser'; + const modelId = '.elser_model_2'; describe('Inference endpoints', function () { - before(async () => { - log.debug(`Creating inference endpoint`); - try { - await ml.api.createInferenceEndpoint(inferenceId, taskType, { - service, - service_settings: { - num_allocations: 1, - num_threads: 1, - }, - }); - } catch (err) { - log.debug('[Setup error] Error creating inference endpoint'); - throw err; - } - }); - after(async () => { - // Cleanup inference endpoints created for testing purposes try { - log.debug(`Deleting inference endpoint`); - await ml.api.deleteInferenceEndpoint(inferenceId, taskType); + log.debug(`Deleting underlying trained model`); + await ml.api.deleteTrainedModelES(modelId); + await ml.testResources.cleanMLSavedObjects(); } catch (err) { - log.debug('[Cleanup error] Error deleting inference endpoint'); + log.debug('[Cleanup error] Error deleting trained model or saved ml objects'); throw err; } }); - - describe('get inference endpoints', () => { - it('returns the existing inference endpoints', async () => { - const { body: inferenceEndpoints } = await supertest - .get(`${API_BASE_PATH}/inference/all`) - .set('kbn-xsrf', 'xxx') - .set('x-elastic-internal-origin', 'xxx') - .expect(200); - - expect(inferenceEndpoints).to.be.ok(); - expect(inferenceEndpoints[0].model_id).to.eql(inferenceId); + it('create inference endpoint', async () => { + log.debug(`create inference endpoint`); + await ml.api.createInferenceEndpoint(inferenceId, taskType, { + service, + service_settings: { + num_allocations: 1, + num_threads: 1, + model_id: modelId, + }, }); }); + it('get all inference endpoints and confirm inference endpoint exist', async () => { + const { body: inferenceEndpoints } = await supertest + .get(`${API_BASE_PATH}/inference/all`) + .set('kbn-xsrf', 'xxx') + .set('x-elastic-internal-origin', 'xxx') + .expect(200); + + expect(inferenceEndpoints).to.be.ok(); + expect( + inferenceEndpoints.some( + (endpoint: InferenceAPIConfigResponse) => endpoint.model_id === inferenceId + ) + ).to.be(true); + }); + it('can delete inference endpoint', async () => { + log.debug(`Deleting inference endpoint`); + await ml.api.deleteInferenceEndpoint(inferenceId, taskType); + log.debug('> Inference endpoint deleted'); + }); }); } diff --git a/x-pack/test/functional/services/ml/api.ts b/x-pack/test/functional/services/ml/api.ts index 452abe6a54ea5..c9d97825f381c 100644 --- a/x-pack/test/functional/services/ml/api.ts +++ b/x-pack/test/functional/services/ml/api.ts @@ -247,18 +247,22 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { log.debug(`Inference endpoint '${inferenceId}' already exists. Nothing to create.`); return; } - const { body, status } = await esSupertest - .put(`/_inference/${taskType}/${inferenceId}`) + const response = await kbnSupertest + .put(`/internal/ml/_inference/${taskType}/${inferenceId}`) + .set(getCommonRequestHeader('1')) .send(requestBody); - this.assertResponseStatusCode(200, status, body); - return body; + this.assertResponseStatusCode(200, response.status, response.body); + log.debug('> Inference endpoint created'); + return response; }, async deleteInferenceEndpoint(inferenceId: string, taskType: string) { const { body, status } = await esSupertest.delete(`/_inference/${taskType}/${inferenceId}`); this.assertResponseStatusCode(200, status, body); - + expect(body) + .to.have.property('acknowledged') + .eql(true, 'Response for delete inference endpoint should be acknowledged'); return body; }, diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index cda6e59087262..2a97ed4bcc9c0 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -171,6 +171,7 @@ "@kbn/alerting-comparators", "@kbn/alerting-state-types", "@kbn/reporting-server", - "@kbn/data-quality-plugin" + "@kbn/data-quality-plugin", + "@kbn/ml-trained-models-utils" ] } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/index_management/inference_endpoints.ts b/x-pack/test_serverless/api_integration/test_suites/common/index_management/inference_endpoints.ts index 3a075c8546660..e52ae73a548bb 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/index_management/inference_endpoints.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/index_management/inference_endpoints.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; @@ -17,6 +18,8 @@ export default function ({ getService }: FtrProviderContext) { const inferenceId = 'my-elser-model'; const taskType = 'sparse_embedding'; const service = 'elser'; + + const modelId = '.elser_model_2'; const svlCommonApi = getService('svlCommonApi'); const svlUserManager = getService('svlUserManager'); const supertestWithoutAuth = getService('supertestWithoutAuth'); @@ -24,50 +27,52 @@ export default function ({ getService }: FtrProviderContext) { let internalReqHeader: InternalRequestHeader; // FLAKY: https://github.com/elastic/kibana/issues/185216 - describe.skip('Inference endpoints', function () { - // test adds new trained model '.elser_model_2_linux-x86_64', but does not clean it. Follow up tests are affected - this.tags(['failsOnMKI']); + describe('Inference endpoints', function () { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); internalReqHeader = svlCommonApi.getInternalRequestHeader(); - log.debug(`Creating inference endpoint`); - try { - await ml.api.createInferenceEndpoint(inferenceId, taskType, { - service, - service_settings: { - num_allocations: 1, - num_threads: 1, - }, - }); - } catch (err) { - log.debug('[Setup error] Error creating inference endpoint'); - throw err; - } }); - after(async () => { - // Cleanup inference endpoints created for testing purposes try { - log.debug(`Deleting inference endpoint`); - await ml.api.deleteInferenceEndpoint(inferenceId, taskType); + log.debug(`Deleting underlying trained model`); + await ml.api.deleteTrainedModelES(modelId); + await ml.testResources.cleanMLSavedObjects(); } catch (err) { - log.debug('[Cleanup error] Error deleting inference endpoint'); + log.debug('[Cleanup error] Error deleting trained model and saved ml objects'); throw err; } await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); - describe('get inference endpoints', () => { - it('returns the existing inference endpoints', async () => { - const { body: inferenceEndpoints } = await supertestWithoutAuth - .get(`${API_BASE_PATH}/inference/all`) - .set(internalReqHeader) - .set(roleAuthc.apiKeyHeader) - .expect(200); - - expect(inferenceEndpoints).to.be.ok(); - expect(inferenceEndpoints[0].model_id).to.eql(inferenceId); + it('create inference endpoint', async () => { + log.debug(`create inference endpoint`); + await ml.api.createInferenceEndpoint(inferenceId, taskType, { + service, + service_settings: { + num_allocations: 1, + num_threads: 1, + model_id: modelId, + }, }); }); + it('get all inference endpoints and confirm inference endpoint exist', async () => { + const { body: inferenceEndpoints } = await supertestWithoutAuth + .get(`${API_BASE_PATH}/inference/all`) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) + .expect(200); + + expect(inferenceEndpoints).to.be.ok(); + expect( + inferenceEndpoints.some( + (endpoint: InferenceAPIConfigResponse) => endpoint.model_id === inferenceId + ) + ).to.be(true); + }); + it('can delete inference endpoint', async () => { + log.debug(`Deleting inference endpoint`); + await ml.api.deleteInferenceEndpoint(inferenceId, taskType); + log.debug('> Inference endpoint deleted'); + }); }); } diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index ebc11815da754..4c25ad902117c 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -105,5 +105,6 @@ "@kbn/config-schema", "@kbn/features-plugin", "@kbn/observability-ai-assistant-plugin", + "@kbn/ml-trained-models-utils", ] } From a0b018b12cced8ec0075de37b0bd4124e6553ff4 Mon Sep 17 00:00:00 2001 From: Drew Tate Date: Wed, 10 Jul 2024 09:22:59 -0600 Subject: [PATCH 49/82] [ES|QL] remove chrono literals (#186536) ## Summary The "chrono-literals" can be replaced with the simpler system of `literalOptions`. This is better because it moves us toward having _one_ way to do things and removing Kibana-specific types which don't actually exist in ES|QL and, therefore, can be confusing. --- .../scripts/generate_function_definitions.ts | 36 +++++++++++++++++-- .../generate_function_validation_tests.ts | 10 ++---- .../src/autocomplete/autocomplete.test.ts | 5 +-- .../src/autocomplete/factories.ts | 5 +-- .../src/definitions/functions.ts | 34 +++++++++++++++++- .../src/shared/helpers.ts | 5 +-- .../esql_validation_meta_tests.json | 12 +++++-- .../src/validation/validation.test.ts | 22 ++++++------ 8 files changed, 94 insertions(+), 35 deletions(-) diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts index d50d7cc903fce..aa92c7bd024d5 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts @@ -145,6 +145,39 @@ const dateDiffOptions = [ 'ns', ]; +const dateExtractOptions = [ + 'ALIGNED_DAY_OF_WEEK_IN_MONTH', + 'ALIGNED_DAY_OF_WEEK_IN_YEAR', + 'ALIGNED_WEEK_OF_MONTH', + 'ALIGNED_WEEK_OF_YEAR', + 'AMPM_OF_DAY', + 'CLOCK_HOUR_OF_AMPM', + 'CLOCK_HOUR_OF_DAY', + 'DAY_OF_MONTH', + 'DAY_OF_WEEK', + 'DAY_OF_YEAR', + 'EPOCH_DAY', + 'ERA', + 'HOUR_OF_AMPM', + 'HOUR_OF_DAY', + 'INSTANT_SECONDS', + 'MICRO_OF_DAY', + 'MICRO_OF_SECOND', + 'MILLI_OF_DAY', + 'MILLI_OF_SECOND', + 'MINUTE_OF_DAY', + 'MINUTE_OF_HOUR', + 'MONTH_OF_YEAR', + 'NANO_OF_DAY', + 'NANO_OF_SECOND', + 'OFFSET_SECONDS', + 'PROLEPTIC_MONTH', + 'SECOND_OF_DAY', + 'SECOND_OF_MINUTE', + 'YEAR', + 'YEAR_OF_ERA', +]; + /** * Enrichments for function definitions * @@ -168,8 +201,7 @@ const functionEnrichments: Record> date_extract: { signatures: [ { - // override the first param as type chrono_literal - params: [{ type: 'chrono_literal' }], + params: [{ literalOptions: dateExtractOptions }], }, ], }, diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts index 0ace35433b67e..8d6394fe96af6 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts @@ -15,7 +15,7 @@ import { statsAggregationFunctionDefinitions } from '../src/definitions/aggs'; import { evalFunctionDefinitions } from '../src/definitions/functions'; import { groupingFunctionDefinitions } from '../src/definitions/grouping'; import { getFunctionSignatures } from '../src/definitions/helpers'; -import { timeUnits, chronoLiterals } from '../src/definitions/literals'; +import { timeUnits } from '../src/definitions/literals'; import { nonNullable } from '../src/shared/helpers'; import { SupportedFieldType, @@ -1045,14 +1045,10 @@ function getFieldName( } const literals = { - chrono_literal: chronoLiterals[0].name, time_literal: timeUnits[0], }; -function getLiteralType(typeString: 'chrono_literal' | 'time_literal') { - if (typeString === 'chrono_literal') { - return literals[typeString]; - } +function getLiteralType(typeString: 'time_literal') { return `1 ${literals[typeString]}`; } @@ -1116,7 +1112,7 @@ function getFieldMapping( } if (/literal$/.test(typeString) && useLiterals) { return { - name: getLiteralType(typeString as 'chrono_literal' | 'time_literal'), + name: getLiteralType(typeString as 'time_literal'), type, ...rest, }; diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index 6f0562d7f118e..57e66a825c37c 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -10,7 +10,7 @@ import { suggest } from './autocomplete'; import { evalFunctionDefinitions } from '../definitions/functions'; import { builtinFunctions } from '../definitions/builtin'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; -import { chronoLiterals, timeUnitsToSuggest } from '../definitions/literals'; +import { timeUnitsToSuggest } from '../definitions/literals'; import { commandDefinitions } from '../definitions/commands'; import { getUnitDuration, TRIGGER_SUGGESTION_COMMAND } from './factories'; import { camelCase, partition } from 'lodash'; @@ -207,9 +207,6 @@ function getLiteralsByType(_type: string | string[]) { // return only singular return timeUnitsToSuggest.map(({ name }) => `1 ${name}`).filter((s) => !/s$/.test(s)); } - if (type.includes('chrono_literal')) { - return chronoLiterals.map(({ name }) => name); - } return []; } diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts index 53e65c2f95aba..a5f21d426c5fc 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts @@ -12,7 +12,7 @@ import { groupingFunctionDefinitions } from '../definitions/grouping'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import { evalFunctionDefinitions } from '../definitions/functions'; import { getFunctionSignatures, getCommandSignature } from '../definitions/helpers'; -import { chronoLiterals, timeUnitsToSuggest } from '../definitions/literals'; +import { timeUnitsToSuggest } from '../definitions/literals'; import { FunctionDefinition, CommandDefinition, @@ -336,9 +336,6 @@ export function getCompatibleLiterals(commandName: string, types: string[], name if (types.includes('time_literal_unit')) { suggestions.push(...buildConstantsDefinitions(timeUnitsToSuggest.map(({ name }) => name))); // i.e. year, month, ... } - if (types.includes('chrono_literal')) { - suggestions.push(...buildConstantsDefinitions(chronoLiterals.map(({ name }) => name))); // i.e. EPOC_DAY, ... - } if (types.includes('string')) { if (names) { const index = types.indexOf('string'); diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts index ceb5789e0dd39..87c9f82360b44 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts @@ -668,8 +668,40 @@ const dateExtractDefinition: FunctionDefinition = { params: [ { name: 'datePart', - type: 'chrono_literal', + type: 'string', optional: false, + literalOptions: [ + 'ALIGNED_DAY_OF_WEEK_IN_MONTH', + 'ALIGNED_DAY_OF_WEEK_IN_YEAR', + 'ALIGNED_WEEK_OF_MONTH', + 'ALIGNED_WEEK_OF_YEAR', + 'AMPM_OF_DAY', + 'CLOCK_HOUR_OF_AMPM', + 'CLOCK_HOUR_OF_DAY', + 'DAY_OF_MONTH', + 'DAY_OF_WEEK', + 'DAY_OF_YEAR', + 'EPOCH_DAY', + 'ERA', + 'HOUR_OF_AMPM', + 'HOUR_OF_DAY', + 'INSTANT_SECONDS', + 'MICRO_OF_DAY', + 'MICRO_OF_SECOND', + 'MILLI_OF_DAY', + 'MILLI_OF_SECOND', + 'MINUTE_OF_DAY', + 'MINUTE_OF_HOUR', + 'MONTH_OF_YEAR', + 'NANO_OF_DAY', + 'NANO_OF_SECOND', + 'OFFSET_SECONDS', + 'PROLEPTIC_MONTH', + 'SECOND_OF_DAY', + 'SECOND_OF_MINUTE', + 'YEAR', + 'YEAR_OF_ERA', + ], }, { name: 'date', diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 32bd23e393431..6f2da35031997 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -24,7 +24,7 @@ import { commandDefinitions } from '../definitions/commands'; import { evalFunctionDefinitions } from '../definitions/functions'; import { groupingFunctionDefinitions } from '../definitions/grouping'; import { getFunctionSignatures } from '../definitions/helpers'; -import { timeUnits, chronoLiterals } from '../definitions/literals'; +import { timeUnits } from '../definitions/literals'; import { byOption, metadataOption, @@ -233,9 +233,6 @@ function compareLiteralType(argType: string, item: ESQLLiteral) { return false; } - if (argType === 'chrono_literal') { - return chronoLiterals.some(({ name }) => name === item.text); - } // date-type parameters accept string literals because of ES auto-casting return ['string', 'date'].includes(argType); } diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index c49f5c7af82df..7f70b266458f7 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -11006,6 +11006,13 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval date_extract(\"SOME_RANDOM_STRING\", now())", + "error": [], + "warning": [ + "Invalid option [\"SOME_RANDOM_STRING\"] for date_extract. Supported options: [\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", \"ALIGNED_DAY_OF_WEEK_IN_YEAR\", \"ALIGNED_WEEK_OF_MONTH\", \"ALIGNED_WEEK_OF_YEAR\", \"AMPM_OF_DAY\", \"CLOCK_HOUR_OF_AMPM\", \"CLOCK_HOUR_OF_DAY\", \"DAY_OF_MONTH\", \"DAY_OF_WEEK\", \"DAY_OF_YEAR\", \"EPOCH_DAY\", \"ERA\", \"HOUR_OF_AMPM\", \"HOUR_OF_DAY\", \"INSTANT_SECONDS\", \"MICRO_OF_DAY\", \"MICRO_OF_SECOND\", \"MILLI_OF_DAY\", \"MILLI_OF_SECOND\", \"MINUTE_OF_DAY\", \"MINUTE_OF_HOUR\", \"MONTH_OF_YEAR\", \"NANO_OF_DAY\", \"NANO_OF_SECOND\", \"OFFSET_SECONDS\", \"PROLEPTIC_MONTH\", \"SECOND_OF_DAY\", \"SECOND_OF_MINUTE\", \"YEAR\", \"YEAR_OF_ERA\"]." + ] + }, { "query": "from a_index | eval var = date_extract(\"ALIGNED_DAY_OF_WEEK_IN_MONTH\", dateField)", "error": [], @@ -11024,7 +11031,6 @@ { "query": "from a_index | eval date_extract(stringField, stringField)", "error": [ - "Argument of [date_extract] must be [chrono_literal], found value [stringField] type [string]", "Argument of [date_extract] must be [date], found value [stringField] type [string]" ], "warning": [] @@ -11044,7 +11050,7 @@ { "query": "row var = date_extract(true, true)", "error": [ - "Argument of [date_extract] must be [chrono_literal], found value [true] type [boolean]", + "Argument of [date_extract] must be [string], found value [true] type [boolean]", "Argument of [date_extract] must be [date], found value [true] type [boolean]" ], "warning": [] @@ -11057,7 +11063,7 @@ { "query": "from a_index | eval date_extract(booleanField, booleanField)", "error": [ - "Argument of [date_extract] must be [chrono_literal], found value [booleanField] type [boolean]", + "Argument of [date_extract] must be [string], found value [booleanField] type [boolean]", "Argument of [date_extract] must be [date], found value [booleanField] type [boolean]" ], "warning": [] diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 14d9c50d5c88c..062e0b9ae78f1 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -12,7 +12,7 @@ import { ignoreErrorsMap, validateQuery } from './validation'; import { evalFunctionDefinitions } from '../definitions/functions'; import { getFunctionSignatures } from '../definitions/helpers'; import { FunctionDefinition, SupportedFieldType, supportedFieldTypes } from '../definitions/types'; -import { chronoLiterals, timeUnits, timeUnitsToSuggest } from '../definitions/literals'; +import { timeUnits, timeUnitsToSuggest } from '../definitions/literals'; import { statsAggregationFunctionDefinitions } from '../definitions/aggs'; import capitalize from 'lodash/capitalize'; import { camelCase } from 'lodash'; @@ -58,13 +58,9 @@ const nestedFunctions = { }; const literals = { - chrono_literal: chronoLiterals[0].name, time_literal: timeUnitsToSuggest[0].name, }; -function getLiteralType(typeString: 'chrono_literal' | 'time_literal') { - if (typeString === 'chrono_literal') { - return literals[typeString]; - } +function getLiteralType(typeString: 'time_literal') { return `1 ${literals[typeString]}`; } @@ -144,7 +140,7 @@ function getFieldMapping( } if (/literal$/.test(typeString) && useLiterals) { return { - name: getLiteralType(typeString as 'chrono_literal' | 'time_literal'), + name: getLiteralType(typeString as 'time_literal'), type, ...rest, }; @@ -2610,6 +2606,13 @@ describe('validation logic', () => { describe('date_extract', () => { testErrorsAndWarnings('row var = date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", now())', []); testErrorsAndWarnings('row date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", now())', []); + testErrorsAndWarnings( + 'from a_index | eval date_extract("SOME_RANDOM_STRING", now())', + [], + [ + 'Invalid option ["SOME_RANDOM_STRING"] for date_extract. Supported options: ["ALIGNED_DAY_OF_WEEK_IN_MONTH", "ALIGNED_DAY_OF_WEEK_IN_YEAR", "ALIGNED_WEEK_OF_MONTH", "ALIGNED_WEEK_OF_YEAR", "AMPM_OF_DAY", "CLOCK_HOUR_OF_AMPM", "CLOCK_HOUR_OF_DAY", "DAY_OF_MONTH", "DAY_OF_WEEK", "DAY_OF_YEAR", "EPOCH_DAY", "ERA", "HOUR_OF_AMPM", "HOUR_OF_DAY", "INSTANT_SECONDS", "MICRO_OF_DAY", "MICRO_OF_SECOND", "MILLI_OF_DAY", "MILLI_OF_SECOND", "MINUTE_OF_DAY", "MINUTE_OF_HOUR", "MONTH_OF_YEAR", "NANO_OF_DAY", "NANO_OF_SECOND", "OFFSET_SECONDS", "PROLEPTIC_MONTH", "SECOND_OF_DAY", "SECOND_OF_MINUTE", "YEAR", "YEAR_OF_ERA"].', + ] + ); testErrorsAndWarnings( 'from a_index | eval var = date_extract("ALIGNED_DAY_OF_WEEK_IN_MONTH", dateField)', @@ -2627,7 +2630,6 @@ describe('validation logic', () => { ); testErrorsAndWarnings('from a_index | eval date_extract(stringField, stringField)', [ - 'Argument of [date_extract] must be [chrono_literal], found value [stringField] type [string]', 'Argument of [date_extract] must be [date], found value [stringField] type [string]', ]); @@ -2642,7 +2644,7 @@ describe('validation logic', () => { ); testErrorsAndWarnings('row var = date_extract(true, true)', [ - 'Argument of [date_extract] must be [chrono_literal], found value [true] type [boolean]', + 'Argument of [date_extract] must be [string], found value [true] type [boolean]', 'Argument of [date_extract] must be [date], found value [true] type [boolean]', ]); @@ -2652,7 +2654,7 @@ describe('validation logic', () => { ); testErrorsAndWarnings('from a_index | eval date_extract(booleanField, booleanField)', [ - 'Argument of [date_extract] must be [chrono_literal], found value [booleanField] type [boolean]', + 'Argument of [date_extract] must be [string], found value [booleanField] type [boolean]', 'Argument of [date_extract] must be [date], found value [booleanField] type [boolean]', ]); testErrorsAndWarnings('from a_index | eval date_extract(null, null)', []); From 97e1163b497b026c258c209da50d737def8ade4e Mon Sep 17 00:00:00 2001 From: elena-shostak <165678770+elena-shostak@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:47:28 +0200 Subject: [PATCH 50/82] Unskipped and added additional filters to test (#187869) ## Summary Unskipped and added additional filter for testing audit events when reading and writing saved objects. We were filtering event by action only (`http_request` and `saved_object_create`), which probably sometimes returned audit events logged for background tasks, that lack user information. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed __Fixes: https://github.com/elastic/kibana/issues/119267__ --------- Co-authored-by: Elastic Machine --- .../tests/audit/audit_log.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/x-pack/test/security_api_integration/tests/audit/audit_log.ts b/x-pack/test/security_api_integration/tests/audit/audit_log.ts index fba60de2ffadd..e8c5d03bfc562 100644 --- a/x-pack/test/security_api_integration/tests/audit/audit_log.ts +++ b/x-pack/test/security_api_integration/tests/audit/audit_log.ts @@ -23,23 +23,27 @@ export default function ({ getService }: FtrProviderContext) { await logFile.reset(); }); - // FLAKY: https://github.com/elastic/kibana/issues/119267 - it.skip('logs audit events when reading and writing saved objects', async () => { + it('logs audit events when reading and writing saved objects', async () => { await supertest.get('/audit_log?query=param').set('kbn-xsrf', 'foo').expect(204); await logFile.isWritten(); const content = await logFile.readJSON(); - const httpEvent = content.find((c) => c.event.action === 'http_request'); + const httpEvent = content.find( + (c) => c.event.action === 'http_request' && c.url.path === '/audit_log' + ); expect(httpEvent).to.be.ok(); expect(httpEvent.trace.id).to.be.ok(); expect(httpEvent.user.name).to.be(username); expect(httpEvent.kibana.space_id).to.be('default'); expect(httpEvent.http.request.method).to.be('get'); - expect(httpEvent.url.path).to.be('/audit_log'); expect(httpEvent.url.query).to.be('query=param'); - const createEvent = content.find((c) => c.event.action === 'saved_object_create'); + const createEvent = content.find( + (c) => + c.event.action === 'saved_object_create' && c.kibana.saved_object.type === 'dashboard' + ); + expect(createEvent).to.be.ok(); expect(createEvent.trace.id).to.be.ok(); expect(createEvent.user.name).to.be(username); From ee7c047653cd905f2ffa0d3aec324a7bc00150ca Mon Sep 17 00:00:00 2001 From: Marta Bondyra <4283304+mbondyra@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:48:25 +0200 Subject: [PATCH 51/82] [Lens] [Unified Search] [Dashboards] [Maps] fuzzy search for field pickers and field lists (#186894) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To @elastic/kibana-esql and @elastic/appex-sharedux reviewers - the only change in your code is moving to a `fastest-levenshtein` npm module - it's way more performant than `js-levenshtein` so I replaced it everywhere in the codebase (see screenshots at the bottom of this description). ### Summary This PR implements fuzzy search for field pickers and field lists across Kibana. Fixes https://github.com/elastic/kibana/issues/179898 ### Details * We allow one typo (addition, omission, or substitution of a character) in the search phrase. Allowing more than one typo results in too many nonsensical suggestions. * The feature does not activate for search phrases shorter than 4 characters to avoid nonsensical results (2 or 3 characters and one of them is typo doesn't sounds correct). If we were to turn it on for phrases with 3 characters, for example for `geo` search string we'll activate "messa**ge**", "a**ge**nt" etc (see screenshot) The decision is up to us, but to me it feels unneccessary. Screenshot 2024-06-26 at 11 23 17 * Wildcards and fuzzy search do not work together to avoid performance problems and potential complex implementation. For example for searching a field named `content.twitter.image`: * `contnt.twitter` (typo) matches the field by fuzzy search. * `content:*image` matches the field by wildcard. * `content mage` matches the field by space wildcard. * `contnt:*image` will not work, as combining wildcards with fuzzy search can significantly impact performance. #### Peformance improvements (tested on metricbeat data and ~6000 fields) Unfortunately, adding fuzzy search affects the performance. Before typing a character in a list so big (6000 fields) would be around 80ms on my Macbook on dev environment, after adding a fuzzy search it was around 120ms so I introduced some more performance improvements: * the fuzzy search compares strings of similar lengths to the search phrase (±1 character in length) only (not building the whole matrix). * I also turned off the `i` flag for regex checking wildcards and used `toLowerCase` instead. That speeds up things a little (10% improvement checking 50 iterations) * I also replaced the js-levenshtein npm module with fastest-levenshtein - that gives around 20-30% speed improvement and with other optimizations, we cannot see the difference between 'before' and 'after'. (for comparison, see after without moving to fastest-levenshtein) I ran the performance profiling many times and the results were stable, not differing a lot. **TEST: Typing the string activemp** before: Screenshot 2024-06-28 at 11 17 42 after: Screenshot 2024-06-28 at 11 42 10 after without moving to fastest-levenshtein: Screenshot 2024-06-28 at 12 55 15 ### Example Screenshot 2024-06-25 at 16 14 10 --- package.json | 3 +- .../BUILD.bazel | 2 +- .../src/code_actions/actions.ts | 9 +- .../field_name_wildcard_matcher.test.tsx | 142 ++++++++++++------ .../src/utils/field_name_wildcard_matcher.ts | 73 +++++++-- packages/kbn-ui-shared-deps-npm/BUILD.bazel | 1 + .../kbn-ui-shared-deps-npm/webpack.config.js | 1 + .../kbn-ui-shared-deps-src/src/definitions.js | 1 + packages/kbn-ui-shared-deps-src/src/entry.js | 1 + .../src/hooks/use_field_filters.test.tsx | 44 +++++- .../apps/discover/group3/_doc_viewer.ts | 12 +- .../apps/discover/group6/_sidebar.ts | 17 +++ .../public/providers/get_app_results.ts | 6 +- .../common/discover/group6/_sidebar.ts | 17 +++ yarn.lock | 5 - 15 files changed, 255 insertions(+), 79 deletions(-) diff --git a/package.json b/package.json index 845c3432a2dec..97a82c8da8e93 100644 --- a/package.json +++ b/package.json @@ -1035,6 +1035,7 @@ "extract-zip": "^2.0.1", "fast-deep-equal": "^3.1.1", "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.12", "fflate": "^0.6.9", "file-saver": "^1.3.8", "flat": "5", @@ -1064,7 +1065,6 @@ "joi": "^17.13.3", "joi-to-json": "^4.3.0", "jquery": "^3.5.0", - "js-levenshtein": "^1.1.6", "js-search": "^1.4.3", "js-sha256": "^0.9.0", "js-yaml": "^3.14.1", @@ -1484,7 +1484,6 @@ "@types/inquirer": "^7.3.1", "@types/jest": "^29.5.3", "@types/jquery": "^3.3.31", - "@types/js-levenshtein": "^1.1.0", "@types/js-search": "^1.4.0", "@types/js-yaml": "^3.11.1", "@types/jsdom": "^20.0.1", diff --git a/packages/kbn-esql-validation-autocomplete/BUILD.bazel b/packages/kbn-esql-validation-autocomplete/BUILD.bazel index 07106718615d1..1e956d1903dca 100644 --- a/packages/kbn-esql-validation-autocomplete/BUILD.bazel +++ b/packages/kbn-esql-validation-autocomplete/BUILD.bazel @@ -22,7 +22,7 @@ SRCS = glob( SHARED_DEPS = [ "//packages/kbn-i18n", - "@npm//js-levenshtein", + "@npm//fastest-levenshtein", ] js_library( diff --git a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts index 2c8620223ebb3..f6469a736a0e8 100644 --- a/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/code_actions/actions.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ import { i18n } from '@kbn/i18n'; -import levenshtein from 'js-levenshtein'; +import { distance } from 'fastest-levenshtein'; import type { AstProviderFn, ESQLAst, EditorError, ESQLMessage } from '@kbn/esql-ast'; import { uniqBy } from 'lodash'; import { @@ -90,8 +90,7 @@ function createAction(title: string, solution: string, error: EditorError): Code async function getSpellingPossibilities(fn: () => Promise, errorText: string) { const allPossibilities = await fn(); const allSolutions = allPossibilities.reduce((solutions, item) => { - const distance = levenshtein(item, errorText); - if (distance < 3) { + if (distance(item, errorText) < 3) { solutions.push(item); } return solutions; @@ -306,8 +305,8 @@ async function getSpellingActionForMetadata( ) { const errorText = queryString.substring(error.startColumn - 1, error.endColumn - 1); const allSolutions = METADATA_FIELDS.reduce((solutions, item) => { - const distance = levenshtein(item, errorText); - if (distance < 3) { + const dist = distance(item, errorText); + if (dist < 3) { solutions.push(item); } return solutions; diff --git a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx index 1311d1c5bbc2f..ef9b0572c689d 100644 --- a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx +++ b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.test.tsx @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { type DataViewField } from '@kbn/data-views-plugin/common'; import { fieldNameWildcardMatcher, getFieldSearchMatchingHighlight, @@ -16,54 +15,107 @@ const name = 'test.this_value.maybe'; describe('fieldNameWildcardMatcher', function () { describe('fieldNameWildcardMatcher()', () => { it('should work correctly with wildcard', async () => { - expect(fieldNameWildcardMatcher({ displayName: 'test' } as DataViewField, 'no')).toBe(false); - expect( - fieldNameWildcardMatcher({ displayName: 'test', name: 'yes' } as DataViewField, 'yes') - ).toBe(true); + expect(fieldNameWildcardMatcher({ displayName: 'test', name: 'test' }, 'no')).toBe(false); + expect(fieldNameWildcardMatcher({ displayName: 'test', name: 'yes' }, 'yes')).toBe(true); const search = 'test*ue'; - expect(fieldNameWildcardMatcher({ displayName: 'test' } as DataViewField, search)).toBe( - false - ); - expect(fieldNameWildcardMatcher({ displayName: 'test.value' } as DataViewField, search)).toBe( - true - ); - expect(fieldNameWildcardMatcher({ name: 'test.this_value' } as DataViewField, search)).toBe( - true - ); - expect(fieldNameWildcardMatcher({ name: 'message.test' } as DataViewField, search)).toBe( - false - ); - expect(fieldNameWildcardMatcher({ name } as DataViewField, search)).toBe(false); - expect(fieldNameWildcardMatcher({ name } as DataViewField, `${search}*`)).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, '*value*')).toBe(true); + expect(fieldNameWildcardMatcher({ displayName: 'test', name: 'test' }, search)).toBe(false); + expect( + fieldNameWildcardMatcher({ displayName: 'test.value', name: 'test.value' }, search) + ).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'test.this_value' }, search)).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'message.test' }, search)).toBe(false); + expect(fieldNameWildcardMatcher({ name }, search)).toBe(false); + expect(fieldNameWildcardMatcher({ name }, `${search}*`)).toBe(true); + expect(fieldNameWildcardMatcher({ name }, '*value*')).toBe(true); }); it('should work correctly with spaces', async () => { - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test maybe ')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test maybe*')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test. this')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'this _value be')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'this')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, ' value ')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'be')).toBe(true); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test this here')).toBe(false); - expect(fieldNameWildcardMatcher({ name } as DataViewField, 'test that')).toBe(false); - expect(fieldNameWildcardMatcher({ name } as DataViewField, ' ')).toBe(false); - expect(fieldNameWildcardMatcher({ name: 'geo.location3' } as DataViewField, '3')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'geo_location3' } as DataViewField, 'geo 3')).toBe( - true - ); + expect(fieldNameWildcardMatcher({ name }, 'test maybe ')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test maybe*')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test. this')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'this _value be')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'this')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, ' value ')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'be')).toBe(true); + expect(fieldNameWildcardMatcher({ name }, 'test this here')).toBe(false); + expect(fieldNameWildcardMatcher({ name }, 'test that')).toBe(false); + expect(fieldNameWildcardMatcher({ name }, ' ')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'geo.location3' }, '3')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'geo_location3' }, 'geo 3')).toBe(true); }); it('should be case-insensitive', async () => { - expect(fieldNameWildcardMatcher({ name: 'Test' } as DataViewField, 'test')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'test' } as DataViewField, 'Test')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 'Tes*')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 'tes*')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 't T')).toBe(true); - expect(fieldNameWildcardMatcher({ name: 'tesT' } as DataViewField, 't t')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'Test' }, 'test')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'test' }, 'Test')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 'Tes*')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 'tes*')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 't T')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'tesT' }, 't t')).toBe(true); + }); + + describe('fuzzy search', () => { + test('only matches strings longer than 3 characters', () => { + expect(fieldNameWildcardMatcher({ name: 'a' }, 'b')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'ab' }, 'cb')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abc' }, 'abb')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcd' }, 'abbd')).toBe(true); + }); + test('is case insensitive', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefg' }, 'AAbcdef')).toBe(true); + }); + test('tests both displayName and name', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefg' }, 'aabcdefg')).toBe(true); + expect( + fieldNameWildcardMatcher({ name: 'abcdefg', displayName: 'irrelevantstring' }, 'bbcdefg') + ).toBe(true); + expect( + fieldNameWildcardMatcher({ name: 'irrelevantstring', displayName: 'abcdefg' }, 'bbcdefg') + ).toBe(true); + }); + test('finds matches with a typo at the beginning of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, '.bcdefghijklmno')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, '.bcde')).toBe(true); + }); + test('finds matches with a typo in the middle of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'abcdefghi.klmno')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'ghi.klm')).toBe(true); + }); + test('finds matches with a typo at the end of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'abcdefghijklmn.')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmno' }, 'klmn.')).toBe(true); + }); + test('finds matches with an additional character at the beginning of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, '.abcdefghijklmn')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, '.abcde')).toBe(true); + }); + test('finds matches with an additional character in the middle of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'abcdefgh.ijklmn')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'fgh.ijklm')).toBe(true); + }); + test('finds matches with an additional character at the end of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'abcdefghijklmn.')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'ghijklmn.')).toBe(true); + }); + test('finds matches with a missing character in the middle of the string', () => { + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'abcdefgijklmn')).toBe(true); + expect(fieldNameWildcardMatcher({ name: 'abcdefghijklmn' }, 'gijkl')).toBe(true); + }); + test('does not find matches exceeding edit distance 1', () => { + // swapping edit distance = 2 + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abdcefhghijklm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abdce')).toBe(false); + // 2 char removed + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abcfhghijklm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abcfhg')).toBe(false); + // 2 chars added + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'abcfhghijklmmm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'hijklmmm')).toBe(false); + // 2 typos + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'cccdefhghijklm')).toBe(false); + expect(fieldNameWildcardMatcher({ name: 'abcdefhghijklm' }, 'cccdefh')).toBe(false); + }); }); }); @@ -74,10 +126,10 @@ describe('fieldNameWildcardMatcher', function () { expect(getFieldSearchMatchingHighlight('test this')).toBe(''); }); - it('should correctly return a full match for a wildcard search', async () => { - expect(getFieldSearchMatchingHighlight('Test this', 'test*')).toBe('Test this'); - expect(getFieldSearchMatchingHighlight('test this', '*this')).toBe('test this'); - expect(getFieldSearchMatchingHighlight('test this', ' te th')).toBe('test this'); + it('should correctly return a match for a wildcard search', async () => { + expect(getFieldSearchMatchingHighlight('Test this', 'test*')).toBe('test'); + expect(getFieldSearchMatchingHighlight('test this', '*this')).toBe(' this'); + expect(getFieldSearchMatchingHighlight('test this', ' te th')).toBe('t th'); }); }); }); diff --git a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts index ba06e36e95c9f..472f377ccddae 100644 --- a/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts +++ b/packages/kbn-field-utils/src/utils/field_name_wildcard_matcher.ts @@ -7,6 +7,7 @@ */ import { escapeRegExp, memoize } from 'lodash'; +import { distance } from 'fastest-levenshtein'; const makeRegEx = memoize(function makeRegEx(glob: string) { const trimmedGlob = glob.trim(); @@ -21,7 +22,7 @@ const makeRegEx = memoize(function makeRegEx(glob: string) { globRegex = '.*' + globRegex + '.*'; } - return new RegExp(globRegex.includes('*') ? `^${globRegex}$` : globRegex, 'i'); + return new RegExp(globRegex.includes('*') ? `^${globRegex}$` : globRegex); }); /** @@ -37,11 +38,61 @@ export const fieldNameWildcardMatcher = ( if (!fieldSearchHighlight?.trim()) { return false; } + const searchLower = fieldSearchHighlight.toLowerCase(); + const displayNameLower = field.displayName?.toLowerCase(); + const nameLower = field.name.toLowerCase(); - const regExp = makeRegEx(fieldSearchHighlight); - return (!!field.displayName && regExp.test(field.displayName)) || regExp.test(field.name); + const regExp = makeRegEx(searchLower); + const doesWildcardMatch = + (!!displayNameLower && regExp.test(displayNameLower)) || regExp.test(nameLower); + if (doesWildcardMatch) { + return true; + } + + if (searchLower.length < FUZZY_STRING_MIN_LENGTH) { + return false; + } + return testFuzzySearch({ name: nameLower, displayName: displayNameLower }, searchLower); }; +const FUZZY_STRING_MIN_LENGTH = 4; +const FUZZY_SEARCH_DISTANCE = 1; + +const testFuzzySearch = (field: { name: string; displayName?: string }, searchValue: string) => { + return ( + Boolean(testFuzzySearchForString(field.displayName, searchValue)) || + (field.name !== field.displayName && Boolean(testFuzzySearchForString(field.name, searchValue))) + ); +}; + +const testFuzzySearchForString = (label: string | undefined, searchValue: string) => { + if (!label || label.length < searchValue.length - 2) { + return false; + } + + const substrLength = Math.max( + Math.min(searchValue.length, label.length), + FUZZY_STRING_MIN_LENGTH + ); + + // performance optimization: instead of building the whole matrix, + // only iterate through the strings of the substring length +- 1 character, + // for example for searchValue = 'test' and label = 'test_value', + // we iterate through 'test', 'est_', 'st_v' (and +- character cases too). + const iterationsCount = label.length - substrLength + 1; + for (let i = 0; i <= iterationsCount; i++) { + for (let j = substrLength - 1; j <= substrLength + 1; j++) { + if (compareLevenshtein(searchValue, label.substring(i, j + i))) { + return label.substring(i, j + i); + } + } + } + return false; +}; + +const compareLevenshtein = (str1: string, str2: string) => + distance(str1, str2) <= FUZZY_SEARCH_DISTANCE; + /** * Adapts fieldNameWildcardMatcher to combobox props. * @param field @@ -64,13 +115,15 @@ export function getFieldSearchMatchingHighlight( displayName: string, fieldSearchHighlight?: string ): string { + if (!fieldSearchHighlight) { + return ''; + } const searchHighlight = (fieldSearchHighlight || '').trim(); - if ( - (searchHighlight.includes('*') || searchHighlight.includes(' ')) && - fieldNameWildcardMatcher({ name: displayName }, searchHighlight) - ) { - return displayName; + if (displayName.toLowerCase().indexOf(searchHighlight.toLowerCase()) > -1) { + return searchHighlight; } - - return searchHighlight; + return ( + testFuzzySearchForString(displayName.toLowerCase(), searchHighlight.toLowerCase()) || + displayName + ); } diff --git a/packages/kbn-ui-shared-deps-npm/BUILD.bazel b/packages/kbn-ui-shared-deps-npm/BUILD.bazel index f2ff64942a993..937cbe0c2a8ef 100644 --- a/packages/kbn-ui-shared-deps-npm/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-npm/BUILD.bazel @@ -47,6 +47,7 @@ RUNTIME_DEPS = [ "@npm//@tanstack/react-query-devtools", "@npm//classnames", "@npm//fflate", + "@npm//fastest-levenshtein", "@npm//history", "@npm//jquery", "@npm//lodash", diff --git a/packages/kbn-ui-shared-deps-npm/webpack.config.js b/packages/kbn-ui-shared-deps-npm/webpack.config.js index 24085109d0d56..294bffdaaa833 100644 --- a/packages/kbn-ui-shared-deps-npm/webpack.config.js +++ b/packages/kbn-ui-shared-deps-npm/webpack.config.js @@ -77,6 +77,7 @@ module.exports = (_, argv) => { '@tanstack/react-query-devtools', 'classnames', 'fflate', + 'fastest-levenshtein', 'history', 'io-ts', 'jquery', diff --git a/packages/kbn-ui-shared-deps-src/src/definitions.js b/packages/kbn-ui-shared-deps-src/src/definitions.js index 98c152403dcff..6f7bff397d320 100644 --- a/packages/kbn-ui-shared-deps-src/src/definitions.js +++ b/packages/kbn-ui-shared-deps-src/src/definitions.js @@ -61,6 +61,7 @@ const externals = { redux: '__kbnSharedDeps__.Redux', immer: '__kbnSharedDeps__.Immer', reselect: '__kbnSharedDeps__.Reselect', + 'fastest-levenshtein': '__kbnSharedDeps__.FastestLevenshtein', /** * big deps which are locked to a single version diff --git a/packages/kbn-ui-shared-deps-src/src/entry.js b/packages/kbn-ui-shared-deps-src/src/entry.js index a9d318721814b..5347952978780 100644 --- a/packages/kbn-ui-shared-deps-src/src/entry.js +++ b/packages/kbn-ui-shared-deps-src/src/entry.js @@ -31,6 +31,7 @@ export const ReactRouter = require('react-router'); export const ReactRouterDom = require('react-router-dom'); export const ReactRouterDomV5Compat = require('react-router-dom-v5-compat'); export const StyledComponents = require('styled-components'); +export const FastestLevenshtein = require('fastest-levenshtein'); Moment.tz.load(require('moment-timezone/data/packed/latest.json')); diff --git a/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx b/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx index 8e86535f0bb85..17d937b270d86 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx +++ b/packages/kbn-unified-field-list/src/hooks/use_field_filters.test.tsx @@ -63,7 +63,9 @@ describe('UnifiedFieldList useFieldFilters()', () => { expect(result.current.fieldSearchHighlight).toBe('time'); expect(result.current.onFilterField).toBeDefined(); - expect(result.current.onFilterField!({ displayName: 'time test' } as DataViewField)).toBe(true); + expect( + result.current.onFilterField!({ displayName: 'time test', name: '' } as DataViewField) + ).toBe(true); expect(result.current.onFilterField!(dataView.getFieldByName('@timestamp')!)).toBe(true); expect(result.current.onFilterField!(dataView.getFieldByName('bytes')!)).toBe(false); }); @@ -86,14 +88,46 @@ describe('UnifiedFieldList useFieldFilters()', () => { expect(result.current.fieldSearchHighlight).toBe('message*me1'); expect(result.current.onFilterField).toBeDefined(); - expect(result.current.onFilterField!({ displayName: 'test' } as DataViewField)).toBe(false); - expect(result.current.onFilterField!({ displayName: 'message' } as DataViewField)).toBe(false); - expect(result.current.onFilterField!({ displayName: 'message.name1' } as DataViewField)).toBe( - true + expect(result.current.onFilterField!({ displayName: 'test', name: '' } as DataViewField)).toBe( + false ); + expect( + result.current.onFilterField!({ displayName: 'message', name: '' } as DataViewField) + ).toBe(false); + expect( + result.current.onFilterField!({ displayName: 'message.name1', name: '' } as DataViewField) + ).toBe(true); expect(result.current.onFilterField!({ name: 'messagename10' } as DataViewField)).toBe(false); expect(result.current.onFilterField!({ name: 'message.test' } as DataViewField)).toBe(false); }); + it('should update correctly on search by name with a typo', async () => { + const props: FieldFiltersParams = { + allFields: dataView.fields, + services: mockedServices, + }; + const { result } = renderHook(useFieldFilters, { + initialProps: props, + }); + + expect(result.current.fieldSearchHighlight).toBe(''); + expect(result.current.onFilterField).toBeUndefined(); + + act(() => { + result.current.fieldListFiltersProps.onChangeNameFilter('messsge'); + }); + + expect(result.current.fieldSearchHighlight).toBe('messsge'); + expect(result.current.onFilterField).toBeDefined(); + expect(result.current.onFilterField!({ displayName: 'test', name: '' } as DataViewField)).toBe( + false + ); + expect( + result.current.onFilterField!({ displayName: 'message', name: '' } as DataViewField) + ).toBe(true); + expect( + result.current.onFilterField!({ displayName: 'message.name1', name: '' } as DataViewField) + ).toBe(true); + }); it('should update correctly on filter by type', async () => { const props: FieldFiltersParams = { diff --git a/test/functional/apps/discover/group3/_doc_viewer.ts b/test/functional/apps/discover/group3/_doc_viewer.ts index 140129c6a251f..ddcdf5c4e40b7 100644 --- a/test/functional/apps/discover/group3/_doc_viewer.ts +++ b/test/functional/apps/discover/group3/_doc_viewer.ts @@ -61,7 +61,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 4; }); - await PageObjects.discover.findFieldByNameInDocViewer('.s'); + await PageObjects.discover.findFieldByNameInDocViewer('.sr'); await retry.waitFor('second updates', async () => { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 2; @@ -70,7 +70,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should be able to search by wildcard', async function () { await PageObjects.discover.findFieldByNameInDocViewer('relatedContent*image'); - await retry.waitFor('updates', async () => { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 2; }); @@ -78,12 +77,19 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should be able to search with spaces as wildcard', async function () { await PageObjects.discover.findFieldByNameInDocViewer('relatedContent image'); - await retry.waitFor('updates', async () => { return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 4; }); }); + it('should be able to search with fuzzy search (1 typo)', async function () { + await PageObjects.discover.findFieldByNameInDocViewer('rel4tedContent.art'); + + await retry.waitFor('updates', async () => { + return (await find.allByCssSelector('.kbnDocViewer__fieldName')).length === 3; + }); + }); + it('should ignore empty search', async function () { await PageObjects.discover.findFieldByNameInDocViewer(' '); // only spaces diff --git a/test/functional/apps/discover/group6/_sidebar.ts b/test/functional/apps/discover/group6/_sidebar.ts index ab2dc70e9e782..a2841bddf8777 100644 --- a/test/functional/apps/discover/group6/_sidebar.ts +++ b/test/functional/apps/discover/group6/_sidebar.ts @@ -223,6 +223,23 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); + it('should be able to search with fuzzy search (1 typo)', async function () { + await PageObjects.unifiedFieldList.findFieldByName('rel4tedContent.art'); + + await retry.waitFor('updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '4 available fields. 0 meta fields.' + ); + }); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('available')).join(', ') + ).to.be( + 'relatedContent.article:modified_time, relatedContent.article:published_time, relatedContent.article:section, relatedContent.article:tag' + ); + }); + it('should ignore empty search', async function () { await PageObjects.unifiedFieldList.findFieldByName(' '); // only spaces diff --git a/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts b/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts index f83c6405369b7..fdbde1c58de81 100644 --- a/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts +++ b/x-pack/plugins/global_search_providers/public/providers/get_app_results.ts @@ -5,8 +5,8 @@ * 2.0. */ -import levenshtein from 'js-levenshtein'; import { PublicAppInfo, PublicAppDeepLinkInfo, AppCategory } from '@kbn/core/public'; +import { distance } from 'fastest-levenshtein'; import { GlobalSearchProviderResult } from '@kbn/global-search-plugin/public'; /** Type used internally to represent an application unrolled into its separate deepLinks */ @@ -80,10 +80,10 @@ const scoreAppByTerms = (term: string, title: string): number => { return 75; } const length = Math.max(term.length, title.length); - const distance = levenshtein(term, title); + const dist = distance(term, title); // maximum lev distance is length, we compute the match ratio (lower distance is better) - const ratio = Math.floor((1 - distance / length) * 100); + const ratio = Math.floor((1 - dist / length) * 100); if (ratio >= 60) { return ratio; } diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group6/_sidebar.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group6/_sidebar.ts index 8e9b33ffa1beb..5c8fd77347abd 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group6/_sidebar.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group6/_sidebar.ts @@ -176,6 +176,23 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); + it('should be able to search with fuzzy search (1 typo)', async function () { + await PageObjects.unifiedFieldList.findFieldByName('rel4tedContent.art'); + + await retry.waitFor('updates', async () => { + return ( + (await PageObjects.unifiedFieldList.getSidebarAriaDescription()) === + '4 available fields. 0 meta fields.' + ); + }); + + expect( + (await PageObjects.unifiedFieldList.getSidebarSectionFieldNames('available')).join(', ') + ).to.be( + 'relatedContent.article:modified_time, relatedContent.article:published_time, relatedContent.article:section, relatedContent.article:tag' + ); + }); + it('should ignore empty search', async function () { await PageObjects.unifiedFieldList.findFieldByName(' '); // only spaces diff --git a/yarn.lock b/yarn.lock index 6b704845c2b85..f74f5ec3fc6f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10387,11 +10387,6 @@ resolved "https://registry.yarnpkg.com/@types/js-cookie/-/js-cookie-2.2.6.tgz#f1a1cb35aff47bc5cfb05cb0c441ca91e914c26f" integrity sha512-+oY0FDTO2GYKEV0YPvSshGq9t7YozVkgvXLty7zogQNuCxBhT9/3INX9Q7H1aRZ4SUDRXAKlJuA4EA5nTt7SNw== -"@types/js-levenshtein@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.0.tgz#9541eec4ad6e3ec5633270a3a2b55d981edc44a9" - integrity sha512-14t0v1ICYRtRVcHASzes0v/O+TIeASb8aD55cWF1PidtInhFWSXcmhzhHqGjUWf9SUq1w70cvd1cWKUULubAfQ== - "@types/js-search@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@types/js-search/-/js-search-1.4.0.tgz#f2d4afa176a4fc7b17fb46a1593847887fa1fb7b" From 462ac5c2a44a36025b449b8fa2dc35c7fbf7cc13 Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Wed, 10 Jul 2024 17:30:08 +0100 Subject: [PATCH 52/82] [Index Templates] Fix edit form when there are missing component templates (#187766) Fixes https://github.com/elastic/kibana/issues/186600 ## Summary This PR fixes the following issues in the Index template edit form: For an index template that is composed of a nonexistent component template and has a `ignore_missing_component_templates` property: 1. when we edit the index template and pass through the "Component template" steps, the nonexistent component template is removed. 2. when we edit the index template and go directly to the "Review" step, the `ignore_missing_templates` field is removed from the request. Therefore, when we try to save the template, it fails with an error as it contains a missing component template and doesn't have a `ignore_missing_templates` property. **How to test:** 1. Start Es and Kibana 2. Create a test index template composed of a nonexistent component template: ``` PUT _index_template/test { "index_patterns": [ "test-*" ], "composed_of": [ "mytesttemplate" ], "ignore_missing_component_templates": [ "mytesttemplate" ] } ``` 3. Go to Index Management -> Index Templates and start editing the created template. 4. Go directly to the Review step and verify that the request includes both the `composed_of` and the `ignore_missing_component_templates` fields as they were initially. Verify that saving the form doesn't result in an error. 5. Start editing the template again and this time go to the Component Template step. Verify that the non-existent step is displayed in the list. Go to the "Review" step and verify that the request contains the correct `composed_of` and `ignore_missing_component_templates` fields. 6. You can also try the above steps with some of the auto-created index templates that are composed of non-existent component templates (e.g. `logs`, `logs-apm.app@template`, `logs-apm.error@template` - they all are composed of `*@custom` component templates which don't exist). --- .../template_edit.test.tsx | 103 +++++++++++++++++- .../component_templates_selector.tsx | 16 ++- .../template_form/template_form.tsx | 1 + .../test/fixtures/template.ts | 4 + 4 files changed, 121 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx index eb9e6c793aa5a..dac7dadfa2557 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.test.tsx @@ -12,7 +12,13 @@ import * as fixtures from '../../../test/fixtures'; import { API_BASE_PATH } from '../../../common/constants'; import { setupEnvironment, kibanaVersion } from '../helpers'; -import { TEMPLATE_NAME, SETTINGS, ALIASES, MAPPINGS as DEFAULT_MAPPING } from './constants'; +import { + TEMPLATE_NAME, + SETTINGS, + ALIASES, + MAPPINGS as DEFAULT_MAPPING, + INDEX_PATTERNS, +} from './constants'; import { setup } from './template_edit.helpers'; import { TemplateFormTestBed } from './template_form.helpers'; @@ -26,6 +32,22 @@ const MAPPING = { }, }, }; +const NONEXISTENT_COMPONENT_TEMPLATE = { + name: 'component_template@custom', + hasMappings: false, + hasAliases: false, + hasSettings: false, + usedBy: [], +}; + +const EXISTING_COMPONENT_TEMPLATE = { + name: 'test_component_template', + hasMappings: true, + hasAliases: false, + hasSettings: false, + usedBy: [], + isManaged: false, +}; jest.mock('@kbn/code-editor', () => { const original = jest.requireActual('@kbn/code-editor'); @@ -70,6 +92,7 @@ describe('', () => { beforeAll(() => { jest.useFakeTimers({ legacyFakeTimers: true }); httpRequestsMockHelpers.setLoadComponentTemplatesResponse([]); + httpRequestsMockHelpers.setLoadComponentTemplatesResponse([EXISTING_COMPONENT_TEMPLATE]); }); afterAll(() => { @@ -296,6 +319,84 @@ describe('', () => { }); }); + describe('when composed of a nonexistent component template', () => { + const templateToEdit = fixtures.getTemplate({ + name: TEMPLATE_NAME, + indexPatterns: INDEX_PATTERNS, + composedOf: [NONEXISTENT_COMPONENT_TEMPLATE.name], + ignoreMissingComponentTemplates: [NONEXISTENT_COMPONENT_TEMPLATE.name], + }); + + beforeAll(() => { + httpRequestsMockHelpers.setLoadTemplateResponse('my_template', templateToEdit); + }); + + beforeEach(async () => { + await act(async () => { + testBed = await setup(httpSetup); + }); + testBed.component.update(); + }); + + it('the nonexistent component template should be selected in the Component templates selector', async () => { + const { actions, exists } = testBed; + + // Complete step 1: Logistics + await actions.completeStepOne(); + jest.advanceTimersByTime(0); // advance timers to allow the form to validate + + // Should be at the Component templates step + expect(exists('stepComponents')).toBe(true); + + const { + actions: { + componentTemplates: { getComponentTemplatesSelected }, + }, + } = testBed; + + expect(exists('componentTemplatesSelection.emptyPrompt')).toBe(false); + expect(getComponentTemplatesSelected()).toEqual([NONEXISTENT_COMPONENT_TEMPLATE.name]); + }); + + it('the composedOf and ignoreMissingComponentTemplates fields should be included in the final payload', async () => { + const { component, actions, find } = testBed; + + // Complete step 1: Logistics + await actions.completeStepOne(); + // Complete step 2: Component templates + await actions.completeStepTwo(); + // Complete step 3: Index settings + await actions.completeStepThree(); + // Complete step 4: Mappings + await actions.completeStepFour(); + // Complete step 5: Aliases + await actions.completeStepFive(); + + expect(find('stepTitle').text()).toEqual(`Review details for '${TEMPLATE_NAME}'`); + + await act(async () => { + actions.clickNextButton(); + }); + component.update(); + + expect(httpSetup.put).toHaveBeenLastCalledWith( + `${API_BASE_PATH}/index_templates/${TEMPLATE_NAME}`, + expect.objectContaining({ + body: JSON.stringify({ + name: TEMPLATE_NAME, + indexPatterns: INDEX_PATTERNS, + version: templateToEdit.version, + allowAutoCreate: templateToEdit.allowAutoCreate, + _kbnMeta: templateToEdit._kbnMeta, + composedOf: [NONEXISTENT_COMPONENT_TEMPLATE.name], + template: {}, + ignoreMissingComponentTemplates: [NONEXISTENT_COMPONENT_TEMPLATE.name], + }), + }) + ); + }); + }); + if (kibanaVersion.major < 8) { describe('legacy index templates', () => { const legacyTemplateToEdit = fixtures.getTemplate({ diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx index 71c2f09072dac..1c727265fd1f1 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx @@ -87,8 +87,20 @@ export const ComponentTemplatesSelector = ({ .map((name) => components.find((comp) => comp.name === name)) .filter(Boolean) as ComponentTemplateListItem[]; - setComponentsSelected(nextComponentsSelected); - onChange(nextComponentsSelected.map(({ name }) => name)); + // Add the non-existing templates from the "defaultValue" prop + const missingDefaultComponents: ComponentTemplateListItem[] = defaultValue + .filter((name) => !components.find((comp) => comp.name === name)) + .map((name) => ({ + name, + usedBy: [], + hasMappings: false, + hasAliases: false, + hasSettings: false, + isManaged: false, + })); + + setComponentsSelected([...nextComponentsSelected, ...missingDefaultComponents]); + onChange([...nextComponentsSelected, ...missingDefaultComponents].map(({ name }) => name)); isInitialized.current = true; } else { onChange(componentsSelected.map(({ name }) => name)); diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx index be1fdbaa47315..ac247500e3248 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx @@ -218,6 +218,7 @@ export const TemplateForm = ({ ? serializeAsESLifecycle(wizardData.logistics.lifecycle) : undefined, }, + ignoreMissingComponentTemplates: initialTemplate.ignoreMissingComponentTemplates, }; return cleanupTemplateObject(outputTemplate as TemplateDeserialized); diff --git a/x-pack/plugins/index_management/test/fixtures/template.ts b/x-pack/plugins/index_management/test/fixtures/template.ts index ca7f625d61bb9..54df4410352b6 100644 --- a/x-pack/plugins/index_management/test/fixtures/template.ts +++ b/x-pack/plugins/index_management/test/fixtures/template.ts @@ -67,6 +67,8 @@ export const getTemplate = ({ indexPatterns = [], template: { settings, aliases, mappings } = {}, dataStream, + composedOf, + ignoreMissingComponentTemplates, hasDatastream = false, isLegacy = false, type = 'default', @@ -98,6 +100,8 @@ export const getTemplate = ({ hasDatastream: dataStream !== undefined ? true : hasDatastream, isLegacy, }, + composedOf, + ignoreMissingComponentTemplates, }; return indexTemplate; From c9b6bc948a03696e2cb0878933e9666cdfe814d4 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 10 Jul 2024 09:52:44 -0700 Subject: [PATCH 53/82] [DOCS] 8.14.3 release notes (#187928) --- docs/CHANGELOG.asciidoc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/CHANGELOG.asciidoc b/docs/CHANGELOG.asciidoc index 6d42b25d4bce4..c5a1dd2798fbb 100644 --- a/docs/CHANGELOG.asciidoc +++ b/docs/CHANGELOG.asciidoc @@ -10,6 +10,7 @@ Review important information about the {kib} 8.x releases. +* <> * <> * <> * <> @@ -69,6 +70,21 @@ Review important information about the {kib} 8.x releases. -- +[[release-notes-8.14.3]] +== {kib} 8.14.3 + +The 8.14.3 release includes the following bug fixes. + +[float] +[[fixes-v8.14.3]] +=== Bug Fixes +Dashboard:: +* Fixes controls getting overwritten on navigation ({kibana-pull}187509[#187509]). +Elastic Security:: +For the Elastic Security 8.14.3 release information, refer to {security-guide}/release-notes.html[_Elastic Security Solution Release Notes_]. +Logs:: +* Fixes log entry fly-out when response is slow ({kibana-pull}187303[#187303]). + [[release-notes-8.14.2]] == {kib} 8.14.2 From 9fc01928b8842df3e0eaa3e3c38c5b360be9c1cf Mon Sep 17 00:00:00 2001 From: Ash <1849116+ashokaditya@users.noreply.github.com> Date: Wed, 10 Jul 2024 19:09:40 +0200 Subject: [PATCH 54/82] [SecuritySolution][Endpoint] Update `scan` tests w/wo feature flag enabled (#187758) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary These tests should pass regardless of the state of `responseActionScanEnabled` feature flag. This needs to be merged to `8.15` before a new PR is created to enable the FF on it. ### todo - [x] see if tests pass - [x] revert 796d537afd2b197abed244c2325c178386e14536 and 64010a3bc96ab92f534d8c69b87cb5cf7e47fe46 before merge --------- Co-authored-by: Gergő Ábrahám Co-authored-by: Elastic Machine --- .../response_actions_log.test.tsx | 19 +++++- .../view/response_actions_list_page.test.tsx | 63 +++++++++++++++++-- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx index bf13fec9086b1..48cc21f4f5a55 100644 --- a/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/endpoint_response_actions_list/integration_tests/response_actions_log.test.tsx @@ -39,6 +39,7 @@ import { getEndpointAuthzInitialStateMock } from '../../../../../common/endpoint import { useGetEndpointActionList as _useGetEndpointActionList } from '../../../hooks/response_actions/use_get_endpoint_action_list'; import { OUTPUT_MESSAGES } from '../translations'; import { EndpointActionGenerator } from '../../../../../common/endpoint/data_generators/endpoint_action_generator'; +import type { ExperimentalFeatures } from '../../../../../common'; const useGetEndpointActionListMock = _useGetEndpointActionList as jest.Mock; @@ -1490,6 +1491,17 @@ describe('Response actions history', () => { }); describe('Actions filter', () => { + let featureFlags: Partial; + + beforeEach(() => { + featureFlags = { + responseActionUploadEnabled: true, + responseActionScanEnabled: false, + }; + + mockedContext.setExperimentalFlag(featureFlags); + }); + const filterPrefix = 'actions-filter'; it('should have a search bar', () => { @@ -1505,7 +1517,10 @@ describe('Response actions history', () => { }); it('should show a list of actions (without `scan`) when opened', () => { - mockedContext.setExperimentalFlag({ responseActionUploadEnabled: true }); + mockedContext.setExperimentalFlag({ + ...featureFlags, + responseActionScanEnabled: false, + }); render(); const { getByTestId, getAllByTestId } = renderResult; @@ -1529,7 +1544,7 @@ describe('Response actions history', () => { it('should show a list of actions (with `scan`) when opened', () => { mockedContext.setExperimentalFlag({ - responseActionUploadEnabled: true, + ...featureFlags, responseActionScanEnabled: true, }); render(); diff --git a/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx b/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx index 43afb4bd9054f..e49385ccc7eca 100644 --- a/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/response_actions/view/response_actions_list_page.test.tsx @@ -20,8 +20,6 @@ import { MANAGEMENT_PATH } from '../../../../../common/constants'; import { getActionListMock } from '../../../components/endpoint_response_actions_list/mocks'; import { useGetEndpointsList } from '../../../hooks/endpoint/use_get_endpoints_list'; -jest.mock('../../../../common/experimental_features_service'); - let mockUseGetEndpointActionList: { isFetched?: boolean; isFetching?: boolean; @@ -463,7 +461,12 @@ describe('Response actions history page', () => { expect(history.location.search).toEqual('?page=1&pageSize=20'); }); - it('should set selected command filter options to URL params ', () => { + // TODO: remove this test when responseActionScanEnabled is removed + it('should set selected command filter options to URL params (without `responseActionScanEnabled`)', () => { + mockedContext.setExperimentalFlag({ + responseActionScanEnabled: false, + }); + const filterPrefix = 'actions-filter'; render(); const { getAllByTestId, getByTestId } = renderResult; @@ -480,6 +483,27 @@ describe('Response actions history page', () => { ); }); + it('should set selected command filter options to URL params (with `responseActionScanEnabled`)', () => { + mockedContext.setExperimentalFlag({ + responseActionScanEnabled: true, + }); + + const filterPrefix = 'actions-filter'; + render(); + const { getAllByTestId, getByTestId } = renderResult; + userEvent.click(getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); + const allFilterOptions = getAllByTestId(`${filterPrefix}-option`); + + allFilterOptions.forEach((option) => { + option.style.pointerEvents = 'all'; + userEvent.click(option); + }); + + expect(history.location.search).toEqual( + '?commands=isolate%2Crelease%2Ckill-process%2Csuspend-process%2Cprocesses%2Cget-file%2Cexecute%2Cupload%2Cscan' + ); + }); + it('should set selected hosts filter options to URL params ', () => { const filterPrefix = 'hosts-filter'; render(); @@ -607,7 +631,12 @@ describe('Response actions history page', () => { }); describe('Clear all selected options on a filter', () => { - it('should clear all selected options on `actions` filter', () => { + // TODO: remove this test when responseActionScanEnabled is removed + it('should clear all selected options on `actions` filter (without `responseActionScanEnabled`)', () => { + mockedContext.setExperimentalFlag({ + responseActionScanEnabled: false, + }); + const filterPrefix = 'actions-filter'; render(); const { getAllByTestId, getByTestId } = renderResult; @@ -629,6 +658,32 @@ describe('Response actions history page', () => { expect(history.location.search).toEqual(''); }); + it('should clear all selected options on `actions` filter (with `responseActionScanEnabled`)', () => { + mockedContext.setExperimentalFlag({ + responseActionScanEnabled: true, + }); + + const filterPrefix = 'actions-filter'; + render(); + const { getAllByTestId, getByTestId } = renderResult; + userEvent.click(getByTestId(`${testPrefix}-${filterPrefix}-popoverButton`)); + const allFilterOptions = getAllByTestId(`${filterPrefix}-option`); + + allFilterOptions.forEach((option) => { + option.style.pointerEvents = 'all'; + userEvent.click(option); + }); + + expect(history.location.search).toEqual( + '?commands=isolate%2Crelease%2Ckill-process%2Csuspend-process%2Cprocesses%2Cget-file%2Cexecute%2Cupload%2Cscan' + ); + + const clearAllButton = getByTestId(`${testPrefix}-${filterPrefix}-clearAllButton`); + clearAllButton.style.pointerEvents = 'all'; + userEvent.click(clearAllButton); + expect(history.location.search).toEqual(''); + }); + it('should clear all selected options on `hosts` filter', () => { const filterPrefix = 'hosts-filter'; render(); From c8d7b382115c80b759beded0e982606a9e23d0a3 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 10 Jul 2024 20:35:40 +0300 Subject: [PATCH 55/82] fix: [Obs Synthetics > Test Run Detail][SCREEN READER] Icons and repeated controls need unique accessible labels: 0014 (#187998) Closes: https://github.com/elastic/observability-dev/issues/3652 ## Description: Observability has a lot of icons that are used for controls and table row actions. These icons often have the same aria-label repeated across rows. While this meets the letter of SC 1.3.1: Info and Relationships, the repeated generic labels do not usually answer question what users are editing, or what users are deleting. We want to provide clear labels for each row to make the implicit relationships sighted users depend on, explicit for screen reader users. ## Steps to recreate: 1. Open the Inventory view 2. Turn on a screen reader 3. Traverse through the first module. Verify you hear "Previous" and "Next" but not previous or next what? ## What was changed?: 1. `aria-label` attribute was added for mentioned buttons ## Screen image --- .../components/step_number_nav.tsx | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_run_details/components/step_number_nav.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_run_details/components/step_number_nav.tsx index 6a4b4ef710e79..8fb3a71f9c5f1 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_run_details/components/step_number_nav.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_run_details/components/step_number_nav.tsx @@ -36,6 +36,7 @@ export const StepNumberNav = ({ onClick={handlePreviousStep} disabled={!hasPreviousStep} iconType="arrowLeft" + aria-label={PREVIOUS_STEP_BUTTON_ARIA_LABEL} > {PREVIOUS_STEP_BUTTON_TEXT} @@ -59,6 +60,7 @@ export const StepNumberNav = ({ disabled={!hasNextStep} iconType="arrowRight" iconSide="right" + aria-label={NEXT_STEP_BUTTON_ARIA_LABEL} > {NEXT_STEP_BUTTON_TEXT} @@ -69,16 +71,30 @@ export const StepNumberNav = ({ ); }; -export const PREVIOUS_STEP_BUTTON_TEXT = i18n.translate( +const PREVIOUS_STEP_BUTTON_TEXT = i18n.translate( 'xpack.synthetics.synthetics.stepDetail.previousStepButtonText', { defaultMessage: 'Previous', } ); -export const NEXT_STEP_BUTTON_TEXT = i18n.translate( +const PREVIOUS_STEP_BUTTON_ARIA_LABEL = i18n.translate( + 'xpack.synthetics.synthetics.stepDetail.previousStepButtonAriaLabel', + { + defaultMessage: 'Previous step', + } +); + +const NEXT_STEP_BUTTON_TEXT = i18n.translate( 'xpack.synthetics.synthetics.stepDetail.nextStepButtonText', { defaultMessage: 'Next', } ); + +const NEXT_STEP_BUTTON_ARIA_LABEL = i18n.translate( + 'xpack.synthetics.synthetics.stepDetail.nextStepButtonAriaLabel', + { + defaultMessage: 'Next step', + } +); From d90d7feda273212023e905620324256ef8bda4bb Mon Sep 17 00:00:00 2001 From: Lukas Olson Date: Wed, 10 Jul 2024 20:42:59 +0200 Subject: [PATCH 56/82] Deprecate bfetch advanced settings (#186431) ## Summary Resolves https://github.com/elastic/kibana/issues/186331. Deprecates the advanced settings for bfetch, which is proposed to be removed in 9.0: `bfetch:disable` and `bfetch:disableCompression` ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Julia Rechkunova Co-authored-by: Matthias Wilhelm --- docs/management/advanced-options.asciidoc | 5 ++++- packages/kbn-doc-links/src/get_doc_links.ts | 1 + src/plugins/bfetch/server/ui_settings.ts | 12 ++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc index 98886aedd5535..73789c750e015 100644 --- a/docs/management/advanced-options.asciidoc +++ b/docs/management/advanced-options.asciidoc @@ -43,8 +43,11 @@ Change the settings that apply only to {kib} spaces. [[auto-complete-use-time-tange]]`autocomplete:useTimeRange`:: When disabled, autocompletes the suggestions from your data set instead of the time range. +[[bfetch-disable]]`bfetch:disable`:: +deprecated:[8.15.0] When disabled, search requests from Kibana will be made in individual HTTP requests rather than bundled together. + [[bfetch-disable-compression]]`bfetch:disableCompression`:: -When disabled, allows you to debug individual requests, but increases the response size. +deprecated:[8.15.0] When disabled, allows you to debug individual requests, but increases the response size. [[csv-quotevalues]]`csv:quoteValues`:: Set this property to `true` to quote exported values. diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index ba74061778b6d..3c59a98498842 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -522,6 +522,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D rollupSettings: `${KIBANA_DOCS}advanced-options.html#kibana-rollups-settings`, visualizationSettings: `${KIBANA_DOCS}advanced-options.html#kibana-visualization-settings`, timelionSettings: `${KIBANA_DOCS}advanced-options.html#kibana-timelion-settings`, + generalSettings: `${KIBANA_DOCS}advanced-options.html#kibana-general-settings`, savedObjectsApiList: `${KIBANA_DOCS}saved-objects-api.html#saved-objects-api`, }, ml: { diff --git a/src/plugins/bfetch/server/ui_settings.ts b/src/plugins/bfetch/server/ui_settings.ts index 697864bec1c59..0dede79980d93 100644 --- a/src/plugins/bfetch/server/ui_settings.ts +++ b/src/plugins/bfetch/server/ui_settings.ts @@ -23,6 +23,12 @@ export function getUiSettings(): Record> { 'Disables requests batching. This increases number of HTTP requests from Kibana, but allows to debug requests individually.', }), schema: schema.boolean(), + deprecation: { + message: i18n.translate('bfetch.advancedSettings.disableBfetchDeprecation', { + defaultMessage: 'This setting is deprecated and will be removed in Kibana 9.0.', + }), + docLinksKey: 'generalSettings', + }, category: [], requiresPageReload: true, }, @@ -36,6 +42,12 @@ export function getUiSettings(): Record> { 'Disable batch compression. This allows you to debug individual requests, but increases response size.', }), schema: schema.boolean(), + deprecation: { + message: i18n.translate('bfetch.advancedSettings.disableBfetchCompressionDeprecation', { + defaultMessage: 'This setting is deprecated and will be removed in Kibana 9.0.', + }), + docLinksKey: 'generalSettings', + }, category: [], requiresPageReload: true, }, From b682833b7a424e69a7793ca68abd2c41862ddf82 Mon Sep 17 00:00:00 2001 From: Katerina Date: Thu, 11 Jul 2024 00:13:50 +0300 Subject: [PATCH 57/82] [APM] Elastic Entity Enablement (#187593) ## Summary closes 1. https://github.com/elastic/observability-dev/issues/3724 (text update) 2. https://github.com/elastic/observability-dev/issues/3722 (link to survey) 3. https://github.com/elastic/kibana/issues/187568 Basic workflow for enabling EEM in service inventory view The empty states will be handled in different PR - When the user clicks on "try new" we set up the builtin service entities. There is an open PR https://github.com/elastic/kibana/pull/187021 to update the definition. [1] ### with the right permissions https://github.com/elastic/kibana/assets/3369346/2d76d9ca-dc1d-417b-8f06-f2d86b75a32f ### Without the right permissions https://github.com/elastic/kibana/assets/3369346/2f2af57c-a95a-4360-b667-1eceb7229d6c ## NOTE [1] if you test this PR locally the metrics will be N/A. you need to update https://github.com/elastic/kibana/blob/bf45ddd9f4c48acea5fac61d07012110bd4f0f4b/x-pack/plugins/observability_solution/entity_manager/server/lib/entities/built_in/services.ts . Unless the PR 187021 is merged --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Nathan L Smith --- .../service_inventory/service_inventory.cy.ts | 3 +- .../observability_solution/apm/kibana.jsonc | 12 +- .../apm/public/assets/services_inventory.png | Bin 0 -> 723673 bytes .../app/service_inventory/index.tsx | 29 ++- .../components/routing/apm_route_config.tsx | 1 + .../components/routing/app_root/index.tsx | 21 ++- .../routing/templates/apm_main_template.tsx | 16 +- .../templates/service_group_template.tsx | 1 + .../entity_enablement/feedback_modal.tsx | 106 +++++++++++ .../shared/entity_enablement/index.tsx | 169 ++++++++++++++++++ .../entity_enablement/unauthorized_modal.tsx | 106 +++++++++++ .../entity_manager_context.tsx | 40 +++++ .../use_entity_manager_enablement_context.ts | 13 ++ .../apm/public/hooks/use_entity_manager.ts | 55 ++++++ .../apm/public/plugin.ts | 3 + .../create_assets_es_clients.ts | 2 +- .../server/routes/historical_data/route.ts | 14 +- .../observability_solution/apm/tsconfig.json | 3 +- .../entity_manager/public/index.ts | 9 + 19 files changed, 558 insertions(+), 45 deletions(-) create mode 100644 x-pack/plugins/observability_solution/apm/public/assets/services_inventory.png create mode 100644 x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/feedback_modal.tsx create mode 100644 x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx create mode 100644 x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/unauthorized_modal.tsx create mode 100644 x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx create mode 100644 x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/use_entity_manager_enablement_context.ts create mode 100644 x-pack/plugins/observability_solution/apm/public/hooks/use_entity_manager.ts diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts index 7fdb8724243a3..3d7882176f64e 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts @@ -91,7 +91,7 @@ describe('Service inventory', () => { it('with the correct environment when changing the environment', () => { cy.wait(mainAliasNames); - cy.getByTestSubj('environmentFilter').type('production'); + cy.getByTestSubj('environmentFilter').type('{selectall}production'); cy.contains('button', 'production').click(); @@ -103,6 +103,7 @@ describe('Service inventory', () => { it('when selecting a different time range and clicking the update button', () => { cy.wait(mainAliasNames); + cy.getByTestSubj('apmServiceGroupsTourDismissButton').click(); cy.selectAbsoluteTimeRange( moment(timeRange.rangeFrom).subtract(5, 'm').toISOString(), diff --git a/x-pack/plugins/observability_solution/apm/kibana.jsonc b/x-pack/plugins/observability_solution/apm/kibana.jsonc index aa87258afbe36..c6a53232aaec0 100644 --- a/x-pack/plugins/observability_solution/apm/kibana.jsonc +++ b/x-pack/plugins/observability_solution/apm/kibana.jsonc @@ -30,7 +30,8 @@ "lens", "maps", "uiActions", - "logsDataAccess" + "logsDataAccess", + "entityManager" ], "optionalPlugins": [ "actions", @@ -52,13 +53,6 @@ "cases", "observabilityAIAssistant" ], - "requiredBundles": [ - "fleet", - "kibanaReact", - "kibanaUtils", - "ml", - "observability", - "maps" - ] + "requiredBundles": ["fleet", "kibanaReact", "kibanaUtils", "ml", "observability", "maps"] } } diff --git a/x-pack/plugins/observability_solution/apm/public/assets/services_inventory.png b/x-pack/plugins/observability_solution/apm/public/assets/services_inventory.png new file mode 100644 index 0000000000000000000000000000000000000000..fc9347c5b54300f1cb816597120342c55a020c5e GIT binary patch literal 723673 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 z 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

_B@(zsMPT-e2QjhUR1qExGD6}3a?SVct zu}&a~=^_}0$1SZcsIDTpr3L|vCkX%|$lT+Aw&2G2?6=e7$FEHqZL<|!yds@lPCG7U z`I0GfB8l}-UY0v~bA^}#;b0R+-Y6U8uHLgUM#f3B1^kk#kG?=~9a4PWQ(bOdyzVpZ z#Wq*q-emLlIT=}v2z0x^-d+w?CwqS_l0_ysm2}U>&mK^PT~RT13(u1{8F!zh?06zcDgTC zA4Q}4E&@q3DPgnpR>ffE>U@y7O4lST6Wg$K9JOWb6$zJA*^iFvEA7wFfcc!dDgP?- z&m3=JUW{6wqUU({d7QOm!$!4hRd_(AVG3uc6^|UIt2vQn7>x_=(rJ1Zv2?*qMpYbl zycRg*E)!S6NF~44b|KZDBG!mAcxNy)pNmE)yd<&(wRI#$8jx!2!B zx7%e2#-|mQF3v4WN+aZBlY3TxH(#n5~oq%vR7(3tt`ouP8j17*hmOEKrR-U>ewFp|WX5l7q?d9_n zz1#j{f;cbpqs8)b9c*(Pxz(n;GVK~rm8d#;8T;NcaG<1jhyA&`3Xbu_Lyp)So1-qM z2jygE++QSXf)b~9>^Emq;)M3>8uORCA~q<0BoRN$z+<9E%#VdJ*d35o^IQ{grv9K| zkZfz~Dw6+Al1Dm?HN2Po5jH4d!AvO11ag9C8R++@Rhc){Fo0vpoOc!ocKF~d- z#iudJI=~BA?9)E4eA`x;HG68XadYo$)a3J*@?X^(RhDGQ<%_n;+Po!cS-^|oYYGam z=j}!+r>`l!BFX&-EsA=_3I_|0qOnMDrn~X(+X1((W?>@U6R3bmQ)6aHvZlsy6~)C6 zVy3Q2Vpks!uI<;M^fq^Mc#}9$vNZ@=x)oU0JayRa#C_;y#Zp=S2_sKo5VgZektx5H z;X3#{zNG9Ss&N%nu;&vurP=kJZIhYx4F=~AI;-NP0yW&+^x|4xc_cezH&QF`&K9Pq zDZ0hD5j1eJ7SQh3z zT(mguF>}vQ$z{PFjV)oHVl(bnqju@YIe#2AoU&VnisdK;1bduJE3XSS5AyTvyBjU% zu~{}?wj1&WSKu3ovV?(4cdqW{I0lxq2XG#81YG;XXXY|l^;y39ZMg+gm+Dd#Zlb2S z5c85JNIHo@ekL>M@K|yax``CM!Dh;YSuckMwNr$zBt*&&l?v(@sr-^ya3X7LjJGhW zJ2HiGxb6oZ<$zbw+lz>)<+$yA39Z1+uIiKRMhj}2c>Me^%`J?BkTcNOWb7hec!FiwZ%2do?p$+g2#ECW z>?Y%HT#xqyBa&7RpDzbkY%b&EKo(OV{Nyc8vB)hYkeq-ui2q>(g@5d%gIDC>$Wa5A zYrv8$3rgm9%cZEGg@4x(_${tQ@%YIW7^wEp%V!H=kqqJ*0WLFM-@C`3*&a{PU7sBl zcMX)AKkPd_$TD<(FZcPa35jI;mu~?fN3m>iqWHylLtdXoo;YNetFared|XZ!v1}I< zJ&%4l?&w-R>oa8hXmt{r)k$mM=gv>M~MoZPjFk9e+NpgJ)QzL!9*F3TMCW@7!g0Sr&-@E>Wm|>cY(N<~eY! z4y*=runb1m<6s#eo!zvdt6eO!@T=U*FQ9HQP?@{)Fmj#KVEUZ|u3>Th6MkM23cf9n zUY|Bf>zKi5JU4K!LL5cU7S+tZ8;mT*KR5uO5|O+-%J3K!Y$TV0&=t*rvqs*sB7)+r48*(c3f%xwqAq&{5PqV6 z^xblrp_iLO^keps&C6Sb>;k2wlsN}4>w@L#PMMJf?0XPdlxbYRRwtrywjhr-1;U#= zhqZz}R9ZZk`<5gkiVri1xkLQ}Ozh??<)$=a)kJYj7}vCuT(bh-iF8oMob>tmi4=Zk z9$l-<@7AUHBp%&sxUxer-Wzx?yxHmn1UR(;6R)26@)fT>2LEw-L}Oc%tL)cabQJZf zMN`sRFxXcT&Nv>?$~wJB(Yn`o?cqZ=VvD_6tOZ#I`;HCAwX zUu{`MERWdJxnUR**x>VZm3yWwbow}8m}-8cUG`?)Qw%MK<9*rIa7+hH!vL|69C$i-#GglVjLdTt=#fA?qgsl&hI+cx2OsB< zTIo!F6T&@QCps|HC>Wl2!o7Q0zWId;JhK!WIC5?92{~)31@`1ya9DuVbitZH4$v&% zXK}IwJwV1R=}aDdpvp+i7PbMYF}6z_Gr)T6c%O+8j*ePex5u*JSK!K=5XfkIa5@KD z(mqm#QpNK{w2rzz&+s(QTJ)v+0I$~NpH>VTUB0d0sT4(-l|meLfR0%Ooi6JqqFz>^ zl8&#R`X|ng8*0igZ!Wcrd}rD%g0I&zXM9-h#qrgRVmalHhqISG`CfwHEAOYtf_>H8 z6kZ$~mo9udx{qsP!SjX(m00leP6l-kv)&)5WGY1o;AZ6urpyoZ&)U0aGB8$5L5aR( z9qv0nFO~{`c0I7$jr5BR#Fp(`&w~;psqU@_yX@#(rBLpgUvFn%k1B>xGo^kdrSF`^ zV@4?|0Fq=u{=`pi`A9!er`bPETngR+c~%2QpC;qBETVJ@fM4Zzg%skk(4Ct^n0gjH z1g>_SHxQ5gILe8~?L_Gi)Wa--q~BcO1Yu1&Qv3}n=VtdVW=Qm&)-?O=Ig)_Qn{c(} z-hDAh;QT*$w(>K`M!jr(qv8Ua4&uia_|BT>*FBtaxW!Ccgqtzr z%IQclG!^F#v+%H+w|Vy=Gtc(;u7jHPAEU%Z$`Z9Tl(W&q0Nv*V~sN>0!H;k@9hHUk)kyJSLK@ zw3BcQv&Zz#(IkPUNTTgstmjPSr-Jv_8ZR{HTytmOri~O@=#?8J)kdzQJrEN9^nfi0 zNGB_e=d9xouQ7CNG2Js^%{Za@aXR>;!uDZ!WCV?c?|=^Bu2%AA*a3_A$NLvYD03q% zJ69H^cN$BflL2AB$Tw27q0QI<;`w|ML%XMgTI2-n8~RS;*Dq!6&fz3)s~KD(YG!`* zbad_#tnX`SQ{I*94)j$CH0FWIR2^^4s9;hrZbzsIG!Kby-nmQVe_-93I8FHJHLb=$ z1M|q5V2|mV6jlA5&x-hqZ_~RKPtqao{u~P&2aUV3+o5BnK^W+_$GJZO<9mjNvfA`E z^a@3fcaJZ=tr~pO^zq%DR`HXKUo_OAY&BVop{+N!yqj%iKB(;WWek8a>YsOiSRJU* zuJ^pEFH#f%`tFNoW)J-_*i1|H{@2z(%=arD!}cW48Ji6UFe0ZYqhVb|H zyZeuXtzUe=4_>}L&QMB5o!9icr~EFk2<8(ZgnciHr?;V@#6NRIQDUL8Z!~;4DEc!n z;UAd@*R%;)IiE+|ygPHRl$2SDnk{i8fgy6GRxi^JEEoS+ug9Ntbicppjx*cLaaPRz z&}!;XA-zvaqhh3qrSo>OmjB1kYa(-+4}))G9OGFZ;i7jr#zYmYxBqY~EEDKeG#NbYQ!$)%Pn}2zq_ zo$_NMS?nKeRwZ%kw{{bxjIUTJ9e(j3w7j9%aWTc>6aCZt7(QRB0C~?cIU2U>8LHM0 zS_)K6$OTJx_(0*n^;-L33%osLTeb77D1=CGKaJoP(}6qwbqn*tHCR$yXF^(<49H)(m0(-oY@ZNSZP z>(z=+s)T$r@$D3@!`Iq=C0t_T#k#_pQh1UJOlX#f*mbP~H$3r?rx>eD?8%Bc{M9G< zjfuj%qG)&R2N(78lQ4>57cbnS7^mZUP)+y7xI9~@$nyf-3(kt(GIyP9t9>R4oiOy< z0k3}gagm`jcMHg``i9Y{BCYz7q@*^Tb!Be{ipC8{7* zC85GQua$`}hCF%eez`VEOK4A-FO>KIc%zfNDvNPrYB(pg?7|V*9_^Qgj_Bkf^a4xX z6&Y9;l@7dN2Q)^=mfcJJ5m~|w1O0e&`NgaCTrvr|y@&JlRZJX$uX{l~mSO)NU+)xM zS+K4Ruh>qBR*kB9 z@IJVhGl&tOsg_U-3mT$cC0gXGt>l`XIa@dYH#_X}Xc}WhCYMbq*>@w#kJQnZ$1HRb z{BS|qW3qZ=fA>=F(+TaMAU^t2GW3jgWNNDG&pf;Y7Sc-$RdX_`cpOq$07aLmuh)~JIeAnvka1d*XKMNGSR!yct{7ou0{3|h9$on>FL7Akkr8i+r5eWdDpvrMsXF& z!X!I#

JRy4nNJ|-X{^2eIYU952?%9voL0UWVEe?i1Sc-7mj=^ll- zwVqWDHn3&p^8HVO<*EGd)-*y|u6P!MyF0HF;H<-VUU`?}K2{mMsp&kgo|AGKm*6&e zFb%%scT-v@_=oKRS#v}ZalWM%~9BpVc3{m)w zZAB4!V&L03VNJLuRvs33wj44>2F^KrkI+NpGmsDjZ@b?!-S_5aRDvkP;xF70Dgr11 zJK%+6nYcCX>f}wZi=tu?tRzNu9-fpsZXldGvw_qK;i@2pK(Q{Dy4I#&=ODgqx-KWc z`g}b7jMRf_A@FWKGqK4QtRfF%QN1g_TV3S-lUxiCoZ%n(=BBvdirOR8e}eYw6LGN= zz?q`R@TfjGP&R**$BG@0$HnN$xrZ)l@&una(2R_W+u=57LK<{EsF;%TZ{x-F0yV=M zBQs?g7h*xN{?X9nbQltYnLC`$2P_G|G}{p(J3Cc$lq(s#{9#0WQD` z#-+yANVa4G)v%q1l*m!r?_7m$u5{fYgB9Y%0p~R4Ahvy|tjG2SqKK<7X48umzx2C) z1k0;ChxGH+V3qmIej7)vev+V~pi+vtVJ^r3OQq?%))ll!_IfsL3h>_tH{XbC0qGb7lRMzsMfKcD^rT?xwv#4zoIQQsz4!P1gE?ldS=Uw*;-*dE+$7#5Bt@ep(x+q~ubV_xe|I0yn99u>t7 zRn0AxnK z{K;^xuwdg0nlfpyK*7;be*W-g?{0m8Ne~kf#k2}M^bUBm?VUXXb4FsqA_r+?+6UZ; zGDgJ2Z%{(ylV22FdTS~uFDzWJ<~Q6~w>2zY0_R`8)H*4waAvu6=?lff065(4Evz0C z#*wNnX`Q|3oal4L?amD61s?f@JmwS>^}IcM`UyB~HZg(Xh&W5uV|`e+4_OHr-KtH5 zI0$Stss=vnxEZgtB%D_?Qnl0|{0%ZpT@+R9eGOgFu1-?_tfpwz?u66bKGIC1=CD?9 ziY%U*nuPn@EOR8H`q2VLE-Y+`oPbfx5p^oKKLnP!{YJ@mMS~f}>X|K&<$(+OP&%w= zIv;geNgGaC8Osfgn9lYQJt3RK2>a^%^7ZK!zk!h=ANob{$KnkTJ=3Q;ahUiCB}E@;u25p|>j8+P5$Q)WVl?n9CpX$N{-Dh@6@oL&W9@BC+^ zkCJ!dIurNu4y;zxn~Z9Beyln(^Wort00%;Z0MSH-Ez{4j0 zAcDKfn0=cVx6pg8r+I$Sf4Q_y%rhVc^l7oC7D&vCL7=nPs>+4>uX%cp6XT2Cm;U6d zO}1&{Zyp7XHdlY62b?-SpIfznThFb0+kC&E^;p;o_zL>KPN411VD=}mw4QF3F_PxD zD?`fkNJ559X4{F0(y3SVJp^En3jd)J=x%|<*xdJG zXQS!oH1M;`K9-e{HNCuUc?VB#4sd8Tv2VBy^P^&=j3-iz?+Ypl#+|N;6UOzvrmvmu zv7csGyhmA^LdY?H10t`?n|UvWJG<;y;sUB5P;;QKL)Icmr0=1l88W7mb8%dG`4*sIupylvH<61)wHr+rdf?9u#I0NiNaA>dQ{8ph87+7Y6#IH*#}h; zY)*+sqGs!t@O4WQciYWWRx$nxKlcl?c}e!G9Ios(I&`P7hdNKJGi)vc-F1idCkWLP z)t5HpSP@6`_IJzt+qL@%?UBXQ$lALWrt%ltBIv=MN3=U9Zl)ymtWPo1bjGMFH3`M^ z)MJu|>OM`FhS&9#fwQP&)U>+j$QzP2(zS+!cF>xQI!&^JW0MllLsN;QtTF3~Jq`C) zLo2VtcHqmltjmB!gjvooJh7Gct09b)kLIk@W7TPXS}&rF21*aruN>$qn1nd(#Lwv9 z`i8W|YUi#r_U7gio(i_hwJ!o+7S>rey{b=I?ZCe0qmP#1$fUNFf?N;sDH{GX$utgM zRs_8dS?{$EMJ@8(Q!i@FW2C}Ck}O8HyzcsMIBu>Ag-Nr-2r>~jmA&+z0)M)|>GB}( zjQG^Gv1ip#Py=ngo)!@nE;WuL0nw^J#tb8Ap_3+rSERw#LIeHgeC?_wk})j)IN|c97}>x6{G(p{XD;|wRuTsu&kpy3 zOlLhz6TSNbZI_`Han+XzxuWpd7+YnvAfJ{FwXX*qoz2H@4);8k@#ZJsA;~m42;fKc zf(nQObY70Q_&(!Td*-{;!SEI{FoSehSe1|l7Q;9^UzCeymCqU%^$DXY^gD62n9orn z=;Jdoj_d5>@Qk*TX;gxDsD}X7#bkT4KhNpeR%I@T@$eSw@c|vv-SY(c+Dr$0OVuAM zU~p(5$Rk#1(7kb5MQvAjRMzPMP&@F;*;rXk=YA>2dfH>Clq%e{SOJxM`!(CK8oYY2*E$Z_4Lk`$Vm8mvqB;l7v8SPxX7`slJmM&zdu(x?V)|zSM+ZY zLPy`>zwp>D%-es$vm0z0F^wAm5gM{8{MioezO{i}YhzdZ{Q5V_=V>|ZTS!Huf7g>& zIE7;B?cv1ziA#gS3=^;xJ;moXPM;9CRaLlXvb@Zk+fc~RnmsZ5UcGjq&&f=+TB=uE zOpbTZL8aO3C)&R1@|SP^Vu;_6LT6yP${;8Jv9aYcAA2a=?^;e52{xF(VVfox3Po^p zBwk56Dmq1qizGPTx9{ZX1fsNcHq4TZ^oV(sqY7P0Rnve>hgPN-I%rY@>rmF*C0i^& z5*w!e(&|bpPxbg0=GvdP*)Q0aw4Ceu@Gk5SZTIUw<9g=J_?T{o=bSQY3T^9dE@zlT zg0E*$vBt9~0zHVv&h$$m5qW<4^e*v+_+=Lm;IQZ{My5DTXno>r5bL6mroO8nVjCo)Za z0hUFhtOVhA!oQg4ZCipZqI-!e?^i8(SMsWW)U$>!orq$r@s9;bTB^KsRIe}fwTIUyd^LKm{LHRrjmdR;A4K@_XIvYvNr`Wm*1&t)FI zk1k%`L{nlBcb9sOl(_azF;s~Pd0(lA&!SPlTG^%_`h{ip+6D%kmnr{IV(*)dQm{oM zPx$x9vmJtD7CR9S3FIGH%ETZ4pdw}XiY8;?2R$PoM3AzC;+)2W!=f|?{NmFjr7*S( zh3?}IH?wkb$969?ZwTQiWN7FLm!>%L?Z71dC>|^v4i!c)hnJcYc__-&cOx(qW+CQ& z;qs+#$blu2B8S$Hs5anb?K-oeHA=i4we_2%rg$yd-Z+bLZbAMm8&@=LB>hqashLIM+ zwag5Jx<0UxxwOF}NtBY}w{(be$NHK$#+bNbpLBUd+UHp?iz&JwI(zYz7Vv2yJ59fJ0v~5*;}4S} zNVHiuq@k@D44*N6$mDgeTJwK@70{TPYWwxenbZ_K2GG2yhDnj*OTGVqU~;OmcY$^K z+12wHqO1Bt)`$H`WnN)8Tc&^s1}0T&1|#7wkk$tb&qK`8Qx<=Us_CIW>e3#MV> zb-JoHWV?Kqbv=wd>_76RxZTzEYDoQb5XI}h7Cfh@BJd9Zl?CP5J47O}9S8kW8e zoy>mLnkza|SQ!^0;$}*fAVM?sMC4G5p%^;3rwV;b=<5a< zb1eUX)GlpHxvSTz-)za`&1AD+`n*kj`%9f{2iE!AO<|$2=b0l8?{Y2>A!w8OZTLu&J^ST%L!P7#k!Qc26 zmzFOv3EDcr>oahT>>P6!E!=?*2Dr zM^;u6f`}r#mFWJPapVT{e@z-<0LJ#()1><+Q?e>s>%~e=WRYAkv94Uyys+3X%On5G z$)uF>1)&#hD!GwqEi|;|*2_1^8sEy7i;;f$oQigc#YT%ghkuTdMlvn`M!cNFq1S^#rzRNXB+i16PsNOU#}U>y%W~B!G(0$vh^`N& zSjNMx4edp9yuy8`8a`BNgdZ|rr*N8@3mK9uxl%TgO@yG0oLv~T-=s1~XectiMQYa^lZ91MWJ?JX zAFoT+))|wC#Z1YN6d4*UJwG2JA*R}0G&d(J9FK-5{8vTg$DS#(P(Bwe93+8`b|9K5 z4!{JArr!F^M9YaRB(b!2T#Gdxy#-HYDjPM-(fG|kogx5<3waF#cN;~3v)HOkM7*$7E=rc4+QrV|06`w&3xY!(IrA96yzffV!xbJ7`kmfG_-Z3NR zm8+GKO;mJY9=|dmNf9FGff%pRuiJUJJ~Xv0%+11mqy>TG!V@}Ugm1QAIXSoEzCaT1 z$_&g?_XzT&)_e7}Y_P;&nG>7}rwi76enbUdlAG^*Q=iA!Ni2Ka>ogO;*>C&y7Mh{K zlKo9zPuEhv_u;ybZsv`9<{&39^2~#pnHNlu2zx-wvwiW`C7Ztrh-rt;(PY2VG zC0(>`UaN;M&h~s*Sx}RdCw>*kdp^%M=qQyF4&Zr+j<7;@k_#JHj&kK{~0=3%)l z2#2}0eEQ*owa&%MUBgn$6jm>b$*uHve%aykwu_riYO@7Wv;FAQ^tyICn`@H**>dyA z88}6!b#W%+)mrO6Ac7N;ds%Cw*hXv&{2>~9ogF>PYZfGE**4GsQ+{eUbg6X+5aslt&7k4>IoMa zFcgCqwAuE_?1CR9-OIr9PCkyb5V$I60gS)1ETpekI!PDS&-0gG+83=@xe96`9A;l6 zeWvB=zN5vd<^kodh4l=luBOr~zxvb?1>ZNJYAoFK(=6N>MIkSfhjOZx&@6;Hhw%z4#w zbSytA8uh|*W%6LL1Z-yXjhhp!4|n9rLQEt*hb@N&9?K0sul=@aGQ!Tjty)QH3cT-F z^I_~~^a_N5(kUbK@zHpH5Bt9A*mqM!`Rf_O=;wKjT_0?OF7}6f@=uk0_eh}u9ad;^ z(JRw;n#oqJyz@%etm2x_zfLY z`X~OFdr+--uM%0W>fc#A5`o0rAg7=lYxM6#R}i7-J4GUh+<4w1+l{QL@548Lj*Ey$ z1#-Y?&5lmJE*{h5-^ovNc+Bc#zagf6>V0J_Y8jka`~r<{qc@XCOp7jE^l(-+!v;TR zyv31M{(`3LFgdUEugQu3uo>azC{_y1rq14onkm*)sOtv_@{cb>h$1Z}YY)leyL+$Kf*mH>#b$nq7 zGAZf0IOKYCN%WU_C@DWSv0fIvJ1|L;-Q1BLXF>mI2 z<%{bol#S6Vh*19~PIHHMQp5_%m#XX=!uDQJGk*Jv!E&9Ba;g zv;?r&n?)!c34w{}a&?wgq@{B!*cd0CIx4Txw9vB1{MKXQ!K7Z^irus3@&|X=s_a{&{kGkAMMY~=6ZT&1t{xvvWz@xt z(o$AZMsY7$=w`BRZ3Z*^bY(0zzHYXFZ_-siiU!K+zoJ6}flMv%a@9XGy|Li5yc$pg z!B0}4R&h?hb=?$GJ#J#cj}m?B>YaLeiu7`E=sztCYc!p6N_-dV5sSAl!9fG2pB|))J8-OqQb)=4czpZAKKGW*n8x3-fJ*6(OsNAxXa7OC3^{C=JzZBjbT{i@ z!I4h)P0H_OG@k{0{{sUaQa*%;6-gkcg+%#rWKase-{5hhEmP&}0;DbX3Bn%%%4Zc9 z)Ft_Avm>mnSWrR!ueN14E&Ck={?8X}&k!o|*x5@8y_bdFkdTMIbNRco2$Yo6PPoA- z)9|G;1){Jz^CN%E=zex}^^&B!R$MU)HaOPdE|iaQu_7%+1fb&~lNET(bdJ6y%H`s@^wn zMU8`>Mw-yX8XneDR;xgJdMej#0-NPtgG=y8Eli@!H6SC6N=IR0(3FooyErru_7Ac; z(}HxF%JrV=HoMDoJrF|9;wC`8q+wjtJtU*26LlI)6`17F&C9NybSe5-)6z-Jz>t!r z@3)Q#kAf0r_`S{3&&D3lU|~i&0%|Eec*k9m&^))jg&+=GW?}GE?aFVft^0L3+kiV& z@NJLnW@h+yKjNLwLTtgOYr#^M7`4i!pzPia3NL8^##k51;NJsL2iVE|uyw#pP$%}B zO8iL|e^fXmepX)}_Vx@&wFT%7Nit@iT=6D|?JN#;C^u>n*&Lahs?YNpJ?f=y>;(IbHy7b`z*8$Ska*lib-MX#zB(AAKP4cOnf@`miLgTjzLH>&sI@!?Sz)- z6Q-g-?kk0J?#QWJExoZ^`84E5tYyqWMHXM!j;feSNFnSXjSxJ|i`r3EDq??Pr( z)yHB##IFQ}E{rsu_`wjlZh2UF_K+Oan4~?hw~O8L1`E#Uj{>Zqdvscf$1jNCmAN0a zZx8e~4zhL1T%o(JD6&hKXZ;ozU6r6qe2CjcLo=Crx*@l!Lj7heoz-KpIRF@VDPaGg z#=!Qg@nw4}?w5;qkl3&ZcU1cRy=yiH5OGC;0!Rp%D+;r}vN7xfjttckxveqIlpct} z3?a?2w-rQ|4++mK5EdFdDS>L>a5>VFany%ABj!i4o zb=f!FO&)?5{Xd@8R2=Nj#`hwJ*bt?aX;b(Y9l!d&zcIAJ3T_UJ7>>H4L%z0@$%XbY zOr&iA?7>{?Arypokrfq~r*E~Xz<%l9Va_3C2DF%uJ5fv%P57$b&*#nkO&*8hWXH#q z8R|>a-E>G)G&EIEZnrl#K0L!Qc$_?AKTB3F-|;^^Es5!7pML27#MGgr02shA{$%#J zGSsR!k6ET7pnu455M(q!8PWUTdN;2z-tc|aXI*!k<{vcgh8N(=0=M?nu!tonsEcc< ztw_OKpNi9F$uu@%6`6qV*W~p%=l4Q-t-3XOiv5u|f4*me~pE>4vN>nHj16 zOT7un$%b_?^NWk)U_tui@30E4j605*3jCf7IY$vo0z513GquAA;46{3ZR@qA8K<>c z$&8}q4zqH;rz4e{L5T8-Pq1aY|3iV}fE`{qk7vADOe7DtdB-Cd#`u zbwR6C(>Y!G`#4)QO2HlmHurA-m#s~_am&#hSpjrTr0A7)9hpIsYVyd+9}&24ND7Fc zLY00KauRwOk(rr|wEocEEwY_iGefz$XoZpZ%iBd6EHN?mtrof*|FaaE9t$P?IJe9; zt4Et#8JxUqh}v)1YY{dN_)n~^{O%Of{BVFDZxXiV^~!x+^<(C)gut}Z` zQic1MC8{B*8_%a#yG8>4}%E2C!qrLgTJ!RoKeJ`LSse`exH!IKvIR z{Wib~BW-B6IhVAMwFOPt^dv4{>X(7nZ#1--c@Y1$sFh3|c_}%3-u49Bb)uPr_ELMl zo<<=`6f#ouTmz;N>CX$)j=V!`9?I`q{%^?o8i7|8C8Hl-wocF$*;Aqmb&OAg3u&S$!;bP%`~>WhU!RK($x) z7B2i6%!CkTbsJgiWgVbeInK_cxZla}DH4$rB%ZqfI}coS<-Es<|5$+;Tqn)XGc_1u$Y)*0E7fMZ+cbA{D6h7^XtI?e6*bxp)MA zH_`OFUkZJ{_5MArR%53`s(txD`N}qOe-d@&_xM`_EnCnnqRko?&?EqJ}4gYHIVb;=;X^=P9uv`jnXo1se!pQ_)7kdy|y) zoJ%wZp8RKYSl-)?jD*bY&htAK$C_n(?5n{pY95Mc-0i36dfvFj&I>F$^-;8XbK{y1 zxL;S{^}~Rm7CCsoFHcTicf6%Y66U+r;9(01P_b;QtC*p-68p)>=_rMPAYSsJ&ns!l zt=YT;L4~3=tdzBRb0+y_L9?6nvcg0bxCxk*CAIn-DPN@R#LHCskbW08$vDwPnHjpE zUqIM*%n0v?x5YR^PCLz2Vi0*L+G^=CR&m*y8bFuD{j;-bzYSlvKeW802CRZkUA6zcseI^rJ_w$l{(omI4qBrnop<0R z`;UjyCIALZ|Ci7)5?Q9|FQDGNPnU0(P=C=@hT|r9d_onWG9D3eJ~&bYAventUZmx$ z3cf$z;MIZkcX{UDMuWd3B%p!9+J{SIt;^*}L(kRr6XVhZgCYoRS_Bl2IW^JySDMJ4 zoei|p{tZp}?Pw1Vvr}f?!UanX@+SWH>xQeJD8*Mc5>3P5y;O*`UE`(>{AteKP2_TT zTKl18=$m~WWx6t?TxA=q8QlF#mF|IUFiTVzvGjJQv%M=#Vw@vRbn$=~Jo0y2@HYEb zJQMcxqcX@t6(lrC_lOS-tuR}fqUePrxK_zM;mo_=R1Ay(BGd;=%#RvGT=T&LMRDl2 zONH(DesTQBJYQ#Oe?e@*B6w$7IU0nTicO~9Q#@#~FM7Y>Lpodz4@l$|;_Oyuu}Dl> zDs9nYLV`&MWr>3&ao59s>@N1}P{lUyuODK%^(S0CDq3SwKvcE7;MwW?aosx; zGO&{*bL&&L^bxl3;WyFxicMt(PX7+AjfY0|aRXb?B)+?Tj>q*8=z^dKZ`Aee{@wi( zcc|jpeG(V=Y(@1i>f_8Uwe%~xBxNtg^XA!_%A#VS~F9V2~^b`$RZ71dF$>ATkVU=f88-&ue|wikhLx# zOJYxsBkxT9km-qu*)uRC!fufsFdp2v(97QZE`}>)pbK;;bdh#?AFW?FZU5iIe5MaM zOyHh9of9f78T@#AIG!L$xNIlN^O0}@lHXxV$T{xRCm5h9gorx@Vq#%s1T=<#IZbDX_hbJBG;Qfd94M*$eDX#G`)B>A6Yxm^J3c?RGUCQ`Q-P3^dQx01IQR%@wa0bGelp zRaaarHqLPr9$JDevh{p5bu<65*-3+lYhSVZTkeZ<8_wQ-FHU*_5IDC$ll>pnd}MBI@%-L(l<++e7`wGrx9~gP=tc62-<2ihX9pVfiA?p zx*Qo=tL6FF8^eC(P1NBTJo=@gtwA=34K1l&TVRy<8HeoJfeZoVqJ^QmTBul5h3jd; z$ygV5C?v$JjN2YvOs01rG*_^HB* z_jplcbOAOV*c>X4^X6^7b@3VezgWS&|C_*p((DWW)$qq56pBEkpWrj`G(5)8_%sQD z;AwJlYQ`QPU%eRlkt5-Njo_-e=UIeBG3GvY!HBBAPn1cEZ|9-^__XA}p{j(gO>}El zOWIn-y&|P^oiR+6g)r)(OW2mPD#U;&-gu;`e1xxITX!rSCKN8&6@8OCYi=XJ8)d4{ zjswmZe{jz;Kw?^}lgaKGmcDow&jG65p(cm3Q3o#Ff{z_#vrQ_34sU?5ok0*0`Q!zeSxL z_XSbkLVmas{FHQB&Dq!Jar^iK%9cIMJE<&bC{p~^ zuO@$uDxD);4Rp(LkmYi_DC%sA)2 z`hm$IEa#yF;^}&(otBN?2W1c=4l7>z&Y$pOL(H8*Lc$l{(qC|)BCJ*Z$$ail%n@Ol zN24F_!-R4-o(R|zHPjE4#Rl%kzLA-Vm?zUOSrQp)Dk(E{AE=MT7dt!}4#uW3(k=ZF z=5skq7qcsz34%wILrj~q%(4k;2@@t+S(T04%Z?yu-<>PET0A|ELH`{1TBpbGQF8kk z6CLw|W7aE5ZDEtL-?BEzb9+jCle^#hci9jdnmeBY7e-E3!;0W-Zv&_Vd=rMQ-Tfs+ zcT6<-(TD^oop{xz@arS`zuS>J$nU9A_S*+eH09s1u0IBydT^qpL*&2zccmu_rJ?4Z zPAN+gPyk-zRm+>eAWTe^?GPxJ!8*A6Ml-^7)dOV)Y=F=MdO@W*ZkcNUQCecD7ilRU zbPiZ|I%Gj)Zf(79f02KuHx17c5fL z4an$kfH|G#e)t^QhPq(n2rxfl%bC|r4WwrvXeF-IwMX_N{AcT)?S0WIG1q9b%<6em z5cV$y$aUL>CEt54@9i&@Ct%eyqxqR~cQ}p{lGtLHw!EVH5@2MD9ppmol~;GM=3#WB z0R1Q1_!_Sv7xCqk|69G1%|QMKT3+5&x!b&@CC%2GF}i)gmxy(|>-Ap86Yym3XrlwX zhepqq>q9n05em&G(v3h={QT?6r3(MOs~2%YNEp}dJJ54qukO3IeeML`Uqc)|%lzRJ zPP;XFAYZ)UQ4g{A&fcF3%8@z6yXN)0I4L&8`@$F1cvIW+ZBWCsx^u{DVq{cUE6@MB z(dXv)O9`%iX`Il#f+7LLwWFgGpsLPKf*6j94c0L5#vpiynpxgj8SRPm5ICD?<~iWL z@)`3>T0?1EovOz;=w|A)gIUq@e57zXp`r5NH#bkBW2`fXBAvNLCoDi(&^J0p0J=7O z=+HQ9D;`@KzT$om6Dq8H?$_Sh4d1{Zn@w+j!dw&e3^kY7EP+=curcdy{P&yNsqW0f z>^Q+3`?2ZoAf2n_qaYLk;lj}Kk`X|PP5jHQ%VgNK+l9*LhRl;q->JI z#y`@#jlH*#*&bG4E7O)Ka_~GV`Hu%oItlxX;bH_H&z$Q8D7fK4vb&wB=bz|)Z+p}u z1+9AsehUk*@4i@~e@yxL4N0=FVMKE@RywufNG$2Gjp=Gh<om#{I0kIJ~B}pkMVymAKnvR zP-aE@n1p@(7(WF?7K)NkqoncZMSbu%@qA)!pD}r4)qE-7J^BLzN1fevBco>9wxRdn z;2^`bXd8wIMS~Y?_l0dtLw!ZpK8r*1jWz7Ehv7up}F*MgBe8`oBKF~cL|4qiY(eEr0DB; zJ*Y9GzZPxL*6+CX+(2Uz(`tkRw)_!Al-GaMv~eEH1;M4g#)-X+vGyG@GmxB|5q&BF zJBtXNJivjrkSrne9ZnM@XoPC7+=7*uYp5HZxs83ykZIMq$@#UBOU`ShDI?Iu2b{h7 z5t0Tms6Ls20fLm}Z%WatP|-6gT!UZ7L(w+=#VzR6>;0={PsA^r>K{&gTXWtZK108e z4@HH=$|t8vxrhYV=NOui=nwn#sXCXskwl{2Tnsie<81)>U_rSDT9VYdJQXk?*TK@2 zO+C;UyNyE79T3h%<{~9miX}|is*BtSv6`FFe{uCHF<~DE8K_tV<8=4J4dks6sM9soqH7H+JSJqkZLBibd zRT-)VPoC|fs(ZHY`wx7%Kd@_hk6~O7raf>F9rHr}|Kqo)>x=~Bc*hAVl$Hs&z3KhS zjR^COaW%!n&2bu|kq{a%b8!bOL%y?ZrGuD33Y>rkaVHuW5Z5gHMj%-GX-@PG_J2Rr z910l6%;p*fLN@jRHkkVwp8r)ZEVi6)qT`&SA7z2mUbZuc1(|2ze$B2A`ZDOg!m0E1 zbuUTLjf=IGEw7L%vR=Ki4n@5I2_mf8YRGdK##?F`h_ z%?B(1r@GRz&EL0SM1IW1R0u&8=^VD1XYJM22j3RNHAr9vB{2E*0Axd?H{O|EyFrSv zWeXBf=4FlkfcT-I;VYLkIro>@??4$${xJn@*L|!1I4s|s^(BXREr^tqZk3gH^xbFv zt|Vy%_rWH`;O{Jx(_|wj5367tF26_#!Pj~1^@CR+v@+~8u+!J%xDLzd{O&!u(ZS3i z4n^Qa?B7aicn2`FfFQW2JSUCCV!#+CbjGY&lrHH!xn=4~03e51M>+N7lM~$S{11_Z z*qD^BcbVgp#Gd7Hik_up7;LU=xjrYJkK4oIgeW;ss27>u-I&dA+BDFz!Q+MheY<=z zNUe;Fx~UDfUMZRjPy1HestyPUlgcm<2eOyf@jmC?CJH|ZyHr&V*M9PDf^ci2?exlK zZ;J$Cz;sfr)x37=`MviRar2z^`ArwnGV^8F(ZTYe0qgQx#;@&Sj95pSdR~hSPcT&L z2@~hY{NjsVRmTYrnV-`p(MP3j!7%~Dj96&*9ZvAzdl#jvhq_}dfHjWEzjvsl(rcN2 z9v&Xv)s1BzrOF<6b;}G|pdX%hJzW_02~YPy(w`;jb-mu#*!a4me|S!f@cfi@xgXlS zX$3>*KtNE&HC+EDlfSFNgP1$vtoi1W@<3URssN?`#14;im(G@E80Y|Vx4 z?phdhN*Sqm#jc8($eo0+Pcv|<9q18X<4?!pg^88M{A9bFXida9^DTV2!&ztL?$0cb z0`jqbGw475eR9tQRZqakqMkQaBJuLDx^MTEWb561yB@wnPF$dEx_|qH`Qybi(c}&s z`4KlVvZ#-QYaI7sHpz^#vN_A@{#)$*qJ5X%mj1-VEPM9U3X}2H*Px)hI6mW&U7RU; zmnVyRtayH4HReiNI-I%82k z@t>#vw>|y>nM8F?_xk)ZtACq4$~GbQY18BN@j0e>Jdo(@RR;gvVQh5RQw~{*D6IJAoyNAYo*9U@wQ)8F54gvm83g zhHN5o4)JLB>gFlkc0ByfIac!~c0>-}%B}T|R74K5uJI6xV+U8BLysmrQM|FhrX7{d z>2}^_6`@}ZS~=GMedT;@ZN_Owr9H#)r_!Y~2#5qU6t%WU#j`@EMMmQ?OmcKbyed-|%pQi~dh`eSWvZG_0>Vf16LnlSJ&v;YTF>NlqqT#f zzdOWpyU8Vzi#7Nf?rD9d6SCmQ! zQ^Y4FR9IEP%F*W_Cgk{If^prfcD!`&Kkg><7n8}tc(a$#P50wA(fftQXI0*&?OJ{R zqYt|`dz!y6{$aAf0J;wiWDSuY=D6psd7T1qqT#Lt;zHo;C%r&`)MSBg&0(`d>_So( zh(w0zuIn-*ZdvT!NtMOp`rEOsU=>N6+K2yUgzSLbd;%M>u-ul+u;52{U||5%dC+df z>oigrWC8%v;9aA`+WJ0hhaIr{JUEaU?p*)r9YP>P0r&4VvsP%HKJD|S7u8X7R&6}|h7f`{FlsxiUy{{I9Mp2u1;LvhF!dY+?vqR$7{IL9fYVZzBCNEue zeBBtQi`C7)*+{?oQH=<9V<6M>01&zm6`ZP};T)d*ir#a}^7qo*CG%6bm$#QYrnFHY zb~6E)y{miMRYKp}JO&Lj0 zBR0{I{hl7v3??rpnruHhJrjW8*k~?eCX!Q$UDluE9gbhrslV0*YCXq2z9uYGjC&g! z2WI=7NIMuv- zP-l`;mg^l4`j5Ac0m{On@S(5M^wM|KHsIpstixxN!@|OHy6h%Q1PeZ3+x>i&7V}8A zS!)nK@cmmR`m5jj<@vImKpH|9Ly&v%^zPu9gVHUHJuc#v$LwZA`s_S#R?BDc<2otZiP$TL?@D8cS zu6|bsktzQKXw_1D0%<}nnOD!{|IW`Pc@3sr0MW$rKsJ7k15?+PZd}kLkMsSeNj^ay z#p7zP@R|?kFXr)a*-%*;nD$oSO)i~22+Vcopzd+CO*O%uG3>Gx@a(;!oA%$9Ia!F4 zm>HiDfePQhLHf7QaIT`@vk0J=p~!U~F6ee(sui|WRaZC4mDT7UOgYa(q@;M7C1Og< zKBJGb=sksimEUw5?mWmyTPz>1e!cGeX2M3Sf6c!S-G9^f zzn9FoFDxlh*Z-m8Be0Tl95~P=s%R%wVY1RdQ)1iH(IG8xO#_3wK~i_olMEFT{uYY~&2m@MJ$B+A75i}FGFORn`WyL&-7u(Wl=2-Cl#aGu z(pjfVX=+n}5j%$;-e;)OiG)f<7~gA9(p~P~zo)=866%?KFPbBVj$pvwpLx6ZjnxNv z3)}0z#AW|}y0sa}e~;(staWI!8Qvgqyb1Nw8fYS1mqbMpbHo6KeCmoFR0yO1j?(m4b}|@us41wFYi- zl4>r?PuXG`7HJd?a$Zio9Id7@ZAxF&pdeJS{l2pEVJrz!NgxyA)4l7c?@?ckxO*l- zmzLF27H3{&n|!47TT^B9_jK>vOKtL_+S%fAVe#;e1g@Ad)wA8(#`|6|`rFIuTVnH1 ziGp(HRMH8R{@$3sCv}v`H99&Kno`;kw)p048L}Xoi+o|lK6T%!PrO~qv|{<=NyaHO zeCFP;-s1VY1b%edOw%D4r=~rL>yBGrUv!5DJ(dwQjh3K$Ly4&ACB0n7G$tD8Q#n)q zl#Wd5Uu4pubBJ!enTV@e7_$&|Xt?~~t&TGce-!+`sl|mGfG7ZKA)4V8 zF&Eq!U>0QU%!g_8FIvUv{S|BypJE|=Zrk49tgOSc^7RmSia_h98qA}JN z@@Z1UZR-WdZXraAA>dWNXxT-URs{PP>^T;>eRe{<$57-Wd41Y`+b%1O4nmD`?%Ap{ z8(*;*eN_X{4v0JHT1eJkL&t%qN?a;Ey_KWu4* zq^2`ptzyg==av6m;19+2MY~-B??s2AUjT6!qvfW^R)3mzba2g4^@vqQ_T0VJR3|;} z7rU-w?cMmKFyZBw$!AoMC{f#&0Y1H$x4&VZ_$nOr24bV@L0lh4sUV|OV0hW6b3H!> z6|Dy?`kAZozBVM0!)0`P89NyE0u()Sn5bErz{Ot9ZPdOr@2eFS2g4>^09is^Tj7md z8$as!_c?kn0=E0Z#$Ev)h2qO0cM^9-20^pUvXy@Bm`aWRQS^5w7(W9QlC8g=*--d3 z(|g|ml{V9OS~aT(R@;uJ(~t?l1gYnoa@hEzGsuZ6(5rmaVEj=RC&t7j*6;W`s6O_4 z8^k&rSUtmg3hIdYeT*D8A1;jvoZoVo7&YZ^kSbklXJ0~O_5#XXP%$7O=PuZ ztM)@-csS`AIim3`CIASgpqg&@y+l|Lcjy@dPsS2O6Eb*x?U<_$&M-^C##jHCfG|ia zKA%!o`5RKJ)S7~g7P&A*YBW|M6*~)zd?*0*`;+2VXk;-X2fs*^nE1pMtFj;QcA{Ff zVlZK{+8*?Yz8^F6hZ*_E*HeI(q9^u4I!E8{j$wG?!Dkr4xgFib>y;CxNNx8qIf6}L zpvP$g#UoO)0VB_KXw-5_kD^?oI^`2%mo6*YQ=eIqcy5HwL-#G8>^ABSRIAkqp+w&k!@{O~7*!~4q#c6fp=H2+2xI(h)vKs( z??i&~O^x~PES|#vA2~o;CFD#s24j}hkwv4=^p;HrqjY-3v`oU2;Ce06=vq&OaHJ!H zriSl0Tp@skPnI6lE805Sw8ns364b^%oG=_h_QkQ!pW_bPIymNNec>5POJ~CIcE*`n zT|1d~yWT;0%PwI})?00?*GY??N@zEFaC~`BW*PCGw4i3pw+tsp@A3hzdA)Y@6Oss= z1i_&`3(|p%=kdkao8w!D{zJzNCGjK%Bk&v;x8O;6iF%IeI9tF4lu zq)4^tCSPN@Q=*d!!$OY0>EXpEj4*;O7>KV*j@#Qd*GC<>2xAoR(kOdWzK{`=!~v8a zPXg(RZ7n&C8;|cPHpNH?!*BW)Hg<#9Hkt}`;HQ{^<7TA+Oi8b<76J1#eN9-$go$si z#a6bYp~fa0&(~g=^@bo3MWy?RHZ87*d>qFvMERJPsTFcs=d|H=8G_C^)V^A6Zys+- z^&SycymLdN;Y|iq&XmNh7qR>Hp~=k6Z;wS}vQ40E2s>|fOE*W@0PKOpyfbQFz+D16 zdSb^I5-&&4fClM47eL1Wve1E*hYKzb2rlfXu+{bnwd{QJ_D~epa@g08l-ugIpJ^1* zY3z1cGhtvOB~kEEj|$L=y28lHvz(-YQBswdi)W$ZvV_4B5_c|&!O$C61p-s~hY2&tdf!=f2 z;U_>Y(Px_x#8b4o4=hX>i^CIYI@Z3Ob%P|eZqT42#1GruJH*i6z#2_$QqzOh_&Toe|-BW1sYzjh{Ko)q{ z;-fe~D9-BL$*?{3i>;$KVrHDaitVtld|dbIIw>`eg(v$?%)>3`FZ3c#G9Q(~3Yl(u zf?qGL13HROoUc~+E;-|(PCZNy>#)?7@>}heJS)j_S64~dvLl}sJbLWu4Gs^x@tB_o zoyTLdB(E~?GdEJFJHDI_HBTOFsjJZ8Oa#X=;`XVislJ6XGyO_AaK`XYVVk#h*G}%G`G|*=XzOpG{v1DOo5w?K>KN6q!I?bABK-xh~d%li3jMmaT z%N4$4*Q<1;N@iJKdGtjQ{jL`$6*0)ZLpfm}_oW>@E8)=tq(?znQ)3qzvanG?&m4RT zF1z5IbNT&pjEd0PE1pIvRy+Q1weZ4zSeCgn!1SH%Ef(-$&{YPl=AelAV`1NRp>{1= zLQpK>cL=uBBjjo4@a$q6r$u^LZ-^w3OLDp+1QMLa_Ne(Dy8_FV>pFAk0SK2GgUoFg zgGf3Qdldjce2A8zOfCwQwaxR{$m=Yf`>9H;;zp3Z=x?6|$Id!^?$0k(R2EW=GI39D z+;$>^f|)iuC{c}d4+0#9(zxG|MA~0#5&PV|1y<+T`r#05FpGQ9-CpwU`hlwRq#j`1 zoLjnT?|3Y-Ccbeb4pNYRGxh`cpc{M3XL=laCo8Re_PdjZjA!_&{SzEU6B;TiDryw$ zGFI0(W?kNH)aPd1nb0pN)}wW7&TY-XBd*TR(JD2-#Nr^Rei2NWA1VduOJSc#L^e6N z{vyD=3_f+Y);7 zAQ~WUL5@V8R!j4F;AubV#oJo>zIw+i6Is*ihK5^@gR?iU_k9bo<3J}` zIetYL<>YPgwv=sbG!#Adg}J%M(xz>e&8IY>g?$V&?&pzJutTyIXi0gmo6TQ#++>`y zUY^b>tf%y>nJowBWpJHy-*;*1ZYtVWIF+Tr9M4`R#kh^!daXhFoR3l(BTV4B5OrZzi(@CZ^f+DHiLxzvK48sx>9XV9~Qqr zHxn>P<50R#!-;xd4up$sjOSzqD`gZ9C)MCE3qX@iony2n%+B}Oci1GMzMJTwK}qcS zhV%LNroUxGn-RuOCo-+;ps;{qecmULXs?{zt9yCBef!4hxFIz-FtFp`pH|35M@RSR z$AD=WT>`yN69K{^SVS*)U!V@C)I+-dwCk-Bn$ZjK-a>#WKV@WqIY4F>mlGfe91l!J zx<;jeEgX9dc4)NHo!ky*b!*Tq002lTkWI?X89wMrPEDnQL|*o8Mjego#+);KAD)}6 z2Hs~TuY^Ma#ylv7(%}wl574lwWO#e6jgtAN_n~0l=wc$`kmrao)#7p66a^xF`UpZH~vcuh8SBHbr0{9-^G+cdbm#USaNf%}F zIHd$Fh%ulLoyby`VdcyWJ+iN*q(uul0i!Jq4u)?v(-D99nt{5k_&nRd_2Jp`q*b?J z>X9QM3~eS4{rNa$eN<)Wu_Pw(6>62WmEug{^!!WNfG&oVl#`;(`5oS@#2{ z2!o!cCUZ*4J*wpPI;0R@5FMElBjA{|56eXk2d_BQ9(ITSa!`6Hu#+d*?nKeREagt8 zNupz+M(3n-sDNNh9J8B~r|J=7FeH|ijGb`s)YXly%nmy51<`8?Uh27|XG0Ndwly}A znbV^D?BuWXsS8l!^Q#aL(GOZIfC2BM9fXjcA*HeZcwNT_L%Xnq@ak-~yqS9MeEwD5 zN4X*|o+%ElX&L$Dh>p{oos4uh%SUZd`S2iu?V9z+C09#waq7m1j zhx>U2{5ILb=66%(z=ra!u=uO=7ue4!#Nbf(1XhrDySoDx*?=QIhiE>4)E8+Kl5tCY*X)=XG>w z!DlJHj>LOo;I($w{CIZee0tLV@RA@`7x(v;Hl|O!s%EeB*Qe#IAROq-7J@O@|;Tvwd`EtF>LkEEm*hZ)_Nvu?+2)PB5x(j8b zezGy}EuB`xg&@BOo4+o!G9eEN-~n#U6rv|&N$0U}TwFmNDjj7FI!JWG z-$d1*b7b<~i!iVvfRvme*1e*4uHDLVu~yXJ~gQmKxr-f`DpWSM;4s* zU|#t1T6O~s)nJPz(MfFhfYKmzAon6)D4Gmzu&|D3iiENrjcWW70S^M@w=8yr6H96)GJlwGFmQ{q;g*NAm|Eg%dMb3%gK|T zdZkXqmU$Yy`n6M%b@I33-cK?3(Ut)bk24r(7Z;bBXZRfWgsY3X86G2uyFx!>)E`xC ztRrkFbBhXL=#HDuuMtJO-0B$BSYu&gpdlla!|lM|j;7G+2}lrO!Wdcb6qGPO;S<4= zDdW~y&JBI7A(uvqN(_r-DVw|SB6(x=>bEla&#ywZPz6GS`O+MBdGtnv3=4nlcAnZ0 zEz+)9j#Ai7DOxq6%UM6p@3MOxL9E>w83_^PlM-d}s&CN!j?~clwxDP?EygY4SKqt7 z2ybqML>I>vC_s}w<~O5WK>ElP(Q1d=R{B-5)!$BPWPt#~J|PJIO`c_gfngzq=q%B8 zmtc2eIKgn>_QOgNm9B3OYM$Hh=xXc}>A^b0gX4Vs1q|{nzIq*bZ#SJ;saNvD{D&gC zg=uCh`-6^W2K}Pqb&W9VaIJ;#!LML(&ui-IG={7Qf>-!oh+~Cg5N~wV(|&=k4(Eas zvM-NqKYRdI^Kvq1Z5i^uzSv!HiH4vaxEX&jR#CBi6f6)2QZn%mNC;1d@7~x<@ZJ$^ zu6ZS(V=74KV-x%Kaib}(CM*UNl~P#BU-cB+j%|I?q3~a~C+}koB8y$WoHG>ph9M#D zoiN9_2Bl0%&4AEv9~Y^m+jygZqsf6seCK7Zv>%TbfC9MU`%EhLTRJ@(#+#<9#D3>!_3AD%oD=AlS2?|93_95&xHFWKe7NFgnj&&11lP&NruOo z+O2j$gl_xFCrPEuJ#5JaaRSwoW)Cz~yp_|GamRk6Iwtm%u^EJnZx${lUkK?46beYK zrbDV!p9+RYG5IeBd{XOcv9tQN(=-PaVbe@84PH8s$ize@AQo$5Jtwe(6Lra@W8AfX z-ajosRwgr8*{FzfMCjn&vGX2!G8h)oZ&BxkJ*HjA#>vyetrmO+DckL(|A6%gSQg1{ z&e5msDmAeXxAUE|GIkg4R*S^%fR=|`2d0V6*vP&DNVf|5W^ zkP=G`DjhaEzF_n%7Jxb@PUlfOp&#Cu12;P?l!uNF-8Lz8?&BmViQ`y&66%%ZUw*z( z8HdIF;L52$&=ONzS_^vX@k1+wlQ4z()K%4^*k`z;e556kz#4ATtq3p@A+ip7budPH z`u=eul83y*6+&sN7rkP7g>Pt#dZIv)%ArG0J!tVBoj$aeqpfok1TB~x(_FF=(m}nH zI$ubTP}8*=#d)$d(HYY(t#OrydJayE!=(lKnLx$;gxRqiKX*)7eNiAcW_;AA}SAvk1T#f320mtr#oxphiOvO4H7$!GB-@l#Bj+O!9leNE0hN`Mos0G3mwObKJc-CzP*59vBDxCdypc$dU3x z{!RUl3VhDQxul=T>M+UEsrf_2SKm(fk&{RF=Ub!4`Ss0ziS$Cxh`Gc3Rx}4!t&Y_z zo)>pR_DvNVGK32-aIY2gG%&JNg*|iW3+WL-$~*ued2!f<9k9*#^RoN%zz~Q!Hl)S4 z*a0jI51mFfzFkJpd$`b{!%JSBi_sL?%KNJlOdRz&b+Mp_FsCAIP8gxd z+wcS0sql>7RakkLtb6F_38kC}vz{2-CuSf(?Ez0|5-2CXI7NykVu^wI0c?i&!97p2rX@r=;8mvRuR9TfA9ThF_NGIz~&&n}mYQYPT`qfpPY zXAJK!u)xK5SV=X7uI0Bs0mFVg3%a3&q9C_ozE$RQmLaKR&sedcoJnesV`6<}(eRwB(%S&|lR|>E zn$76ogF`6^+q^|?`#c+l3YUF4jA%&e)5dJ`AFeLN(`7Zb$Wu>gh7vGor*)q ziS|99$K)Tk&2(umjQdk%5!%`s~`u7$SN(ys*|t)%3+aK%#rkv4my3J+$3v^sz+%7Q<8QkO6$`t$`iibwbe2dpGF)MefJVnUkdu z)^Kt3fs!v)kml}s4AcDM1W%>z@zwKv-8U`t1sK7`vm?t&ANlIEa`a8Ac z=g=P+1U9IMJI>8#((3Zq`oym1$aB7Y>zZP0jw* zD;&g$LkUfjxqFB-uRaaf3ehPZ)cqzV%{ZBa2qTe;%1u_wOfl~C8%D%mbZb?3V$zXT zVwGRqA+jsGzn&s0q=T)3>Ok@U+wR~X~GFNEZ|pH8g8KZM6tDHVG4 z+qw063d>~MW6@R?ecWB}bUL|vfr>WS{m$n!E!*NZLLLbPDCwyZ)K`NZjlAAQ?S{g=6h`S` zw0Kq_3xGI>fvK7UHwc7K*nr~!{3A^k!@W2`+6ziSDlJjb@2^eI#2g1!DK^g90dWYr zYL~o6#18Dvq`X@~!}-}?1pNWLrmphx1Cfc1+mZ2Scxm-oD}S>T<6y)xke=nDynFVm zk8eJGd`1(%8(RnRv-9-#2^F^04=U?hd5gVhhJUYWLPZ=X^miNkKTqLF4CO+;>yZV_ zC%ZHCUo%TUG8n=5o33VXZZ4m+mkv&;Qy?7NS!2k63JX_l5k} za+pIJ##-p?w^t>cGEbY8wMa23cDz*ENL#2;rCfu4cu zqKVd#`cs1b#=74vg)gtD1ru%ez$647nUYN8jC}HM+Yts(D(NUw=$^<%hGkg@2Z*xtPSC0Cq+}Hm zy8vi}0XeVDzr3|^z0+4&#z!fXroR&+N9*Lx|q z;-oC|)KFw^1QTXN|IgoC2|pRs7~GFG(>5dSR<16l5cw=}I|Va?=X@c>eI8)cYTn`9GHZ^B-Lb z7%b%E)_k%oy>8n9A7&j((>s24g#NX_svq<@YLtqyIz4Vey^6Lz4QiCDtl{IKv^4}n zGFt!|2Q3(4PAPlECNMcqE5?k#m{Y%(7XF_%1-Sx3$;-=+BXfM<%7Hi#fo~gUcz;vN z|K|n&r!GRsgn{VnN~l8mClUTS>aVSTCI}snI29Wa?zs|LY5_r%{NGymw^K-Uabqe= znTCfmFwC|^d|)8I`3+6%Z$ka6pYx;+5ZJv?Gd@rtn{}adP|4PCC@}t??m=0lK z{D>io!4d+8XJ=vm>#RkfhL&Z(!P^!f`~Y=usC(@;N_MQ#eYvO2$iWt zAxA8L!zftJ3L~mQ{iU@q<{P1dQo?er+%S}#iemyG=Rvw%TnjKDCJQfca3 zHPi!&e?y#qA}q@}EL>1nZlu_Rt+OQzt_0R1`7bTU@ngA3SmXjPJ1b)9`q#g5&ebkl z2t&UI2H!R3XosWeQAZR0f(|?hD5hsg4yQfGn1sbG=os_)HJ&E(LX(9Ju%TTW;_!>Z zX-Ehh zssu3n^D>#T$uAudLkbsfM4X-7k`{?B!cJ9lP4E{jBvHV;gE|p`8vCLnf6PCL_`j3q zI9*axasno!Fb46s+tEDNU*bWe1jKrvHm*8!OY|@TPJd}FQkH8NQ4D3PuQ{|116i^@ zz9;G#1Z4m2Q2+4ZE-e`24kaA!jZ4+1p(2efT9KQ*{aL!BZ`bEgp|=MjT<6 z*Yo0r+cQ)5*F-Z}2O59Sw1&CFvBgGw!dmrwHYjH;d_%2V@cfquk_$~-8b>soic?SW zDr~@-o4v|XWja;nUwYbqVqh{XYkwOh@-LCmzbhUG4~0B}6-}a1^~AD>{nwOnpBmzm z_#KKWE1BEymJS*y6@T%J@i_C0*vig0rj!wsO%lK2NQ|tIQQ$C91yBG|;-nKwxWvEc zGGSQrgvrnePOtbR8;=kLh+PqA7|R3H9xv?zjK5)6O;A7WOpeqDWs%q3onwtX*4H3*t4VC`2jd44`{&3sbO7T9l z=gm)(LMeVJ=r`I$eosn{PI%He-IYU|Y`IH9F8M2r^zRB_#5nDV2@FLbM_FL^0I(-f(r&-tuO<<^~i9|>cMaR6p$4S9qwvqx-mD&2ypsEsqugq-V&6g zV9Wf~TuXhsUzD2@B#5@kFVm^8{gR$y%)baw4hjnyR;uITGt>XIwcK}MAonL$R@TV_ zm!|D0rjfW`B-!^L>xGyTlDk_@wri>({L%$V01I*-D~1xAxX%%h@Tzms_@$)8lK>wk zj8g*lu5pKMvEoYb>4M7NcX#0g^?1KDf!mnr{^ir4AW`|FGKR2`AI{O<(PDb?=C+xx z#+Fg;>iw}25B0w%dNRz9E6v_VCM{YdhE$mIe5Ah-c>fZ*9K6)vBl)3kU3yP_Klbr; zA*p}Y10!U-9wu~{xg2v%&8NF=M8S*0yse#of3-3)L@=e~X!mF_BJ*R?H=5`uqP!LV zE1)s*dnQHgRbG)Z>dM}@$947Kolp1z8UckSHs^T+@~MrhS-4q$O^9yf_WyM9ca zFssA0ML73k=E}MNu@SwX@@?``^|4SQFwMk*fd_zAq2=w5=+N{R1t<{RSAFI6KX9{@H&-Hss$N#I-z{CXGan zILN_P6Aq6?2mo76ZvWU}mmM^IdwV-U>Yq#LJ$Y z87}iY7iE2b>cI3b8N&|ff2z_dB!$c0XANl&~*jd!hTv0AlF}7HWrK>g%9-bD^fh%W|Q5vuF?p2 zc$OHiE8-e$UbA&$eK%D0pEpLsCO_Qr0q47m9;QAZkIM7&4z82a~J@xO)s_FNrD zYQqbkKq>xaAx`7Ny=jm2i_9uRfeYJGE1;?LC@IkiU$CjzeM)AH6D#9#Tpcbb5wy^v z?s}T~0<2%?JC2sxVJU>U%JLUCzfz1(08N$z!mDIl86Y0v`tTiu4utN|60jZ`D$};8 zqeO{nyr7WJu4a_v^uT~i>D4fZItCO|jK}TNS6o#DLDj@-vq{!k-q?fgi=B(*8!bpp zRvr2iN=?RQtG!&6eeP&(QjG?N$*6v$IQ6aEl}%!aG|-m?V?$;G)5xd1@F~=O7~v6 zi0MfW1An&56AKX21rd}tw+=735GuO993Guxy1O|WMA!1Hi3tY(9tCzyL+*gX(SgAs z=A_0L>pS-QU$@j<=VsIP6QkyI?Q57vC@UW?D!K8b^CJ~^`2b_1b(v!ZF1-EV<6X0h z@Xq#?Ot&i!*X57Q4Jm!KDc^0J?GpctQ!icw%tjw{o1|zPU_sx&XRV?^D5?ZaETp9q zPZAh**QLAAf=JGrEeJ)(0O2l6Jq#97QSrirU1>?GYq7huNc3omfe|uY#6_A>YExjr zti65psEch-e`=n8&ik4OPxFZ)LN#q0+`eWFon-4*B>4&~%Hlmg^6piNFr3!o3w~Uc zb?2k!vjyGO5`x1{BJY~?l{@91_VAwTFI&^QP8Ufs_iQ~^m~y*(z=dg5Tm`=TPuc&| zSonA4KMzBFPRY(rF_ACy$w#UC^8u0T-qzm!K}lL!b!|>3oZv+MO*GqCXSXo9U!Uar zmsosHy86x+pn%glC z0DzS-2|;2{0w!RQPHN$wN7Tfl3U(9yG!N7P{-Go8PbOw>Tw5(%%9q;8bjq_ohkqRL zbm42Kor_L2G~Xr`TKSB-r6rf*@!9HFTK-;ZZl-QNLveck9s+`1{k4YG=6D3l+UBq! zam-zdIw!m!I$3D+*~?hV!E}{UhQY>9fi|Z`dEXXR3QLfGOMg(e`YR?jRTnIC(z*{k z4b$;z!R3y(IQ{S$RF-Qzs+VDrmg=VEl}j_i(q2(KHspw0&e}QP$W|lvId{-Ea{8w= z3TVgO*;Cg5eq`mb^p*_)eA-*rqy59Q|4Hep6~tZ@HuP&0-HG)b*G|4QMDFYZ(P%t^V8X<4CZuMriW-VBCEyErHD)y(;QK+r{~@a z{LHPy8g#K8veW4<-&^n6)Yo8m#6~?vkB&xbYbt(e;BwJX(I!I6)Hm*DNVb!>R^SXMz77prF8+a{uNFcSf50%;8>(WciNOwo);z0vTN}G7II|Z+8Y>nazBxqN zuli+hh2u$v8zvW__tac-IbpHN-!9rEz)Ca}Ik)tk)ZmEcGu!=c%5O{k7YMzum!8>| zG`L&0N3-6iaJO29nBmIRYAL5AhJWqYucRe>{&(5mpMx$=63|=TpR?zH=Mse4?3dE#M*&ML@O(#;nujM?IMOi9znDAvRXtC`$I^;E;6;)BanyGdG&<_DfUOe zbnXMvaKy_O%3s=Nr1IYKvdsVwOnMvG?Hia^oT~+#CY<)m#KvmH%n5U%-FX?%;sMY5 z!~Yb9zuCSnQ{0_>h504=M$rAgI_C+Ad2U`S6T)(|W_hqn|`R*RXE}H_m_pzUQTuWjX8yL*j#aVMSKV zKwo|-7kk;t8xR36sJx+8-p3sz21kxg%3GAr0D~~9M5=6OE+-V53EZ^^q%9JQ>(iKqz#zqj5v{R&J~X=b|3S1!>T%GFiO)NE-f3X@AP!c` z!C)QAxpton(#@fTeEUP`M0Cm=CSHuNC9GnS3nUgM0DQgJHgj{fZM2?!m`E#*vj2-guc40VIu8#9VIsvsiO&Ww^05nm=FDyy%vpggfXD_UP`sOJI- zq#aaECGi86FCx+R0d<5RTIj}d+ZuYiass{GWS-!Qg41Vcf?H!9&#xZzXD$wD2;k{Y z()$W70;aa;(&ks6cdc5hUXMkjqP6aS9-W;mIJX>))Kt50Fp7W% z);vIGTt+)q&la6&oj~O=yMW(l2Mcnh z9k(29FdtT*%^aHKzu#00T!^Ve%2Y4TsRvobYZvPh$t{QMb*uQ6^)sXsL+9~xTTP54 ztMAOqB0KFj^fv}~(Vc2z!k8)-ZC!o+=mH;and9qVYK^p( zlp*TT4Y+#>lVQ)tk8nl#;)>uY_hf8Z7^JJT6W)A45U6E4LTQ zF)N@ePTOVU#zn`_C676Qi{7D`XLCl{%pM-iuKQEb4NjSEpEJBCk2SP;Os2urT>tr6At#_(ua18H}*&m0)k>!*Yf zh(1w%XE2gD!c>E2ck~=QJBiuY&v{vC zXz;1@N!eJ{LM>Wa!M=DkhN-&BYEbD6ft+h@nDfx0XWl+La^H(n1TDTVu|x?nZCIh zE?Z9E*n$s?*3f(kX}UW554XfMek)goUT4*tv-!fMMGQL5v11~VKy3^DxoDoPA_s*C zgLPLcv^-&zrb|%9VPM3D z1PPuwA9j*2`@l9l{WwjVo!F3=>u3Ynna*fuLNaNOtJe>_>_t-5azpf{(AVyAg?d}y z(Z*}GHq#Dy3-Cgf#a@2Ywe`k+4%BJiG}vGZB5vTw%l$Iu_l@Tw_cY7i>HLL7{^a<$ z<;rchqOJ7|C!b|E|LsobO6iI;On9Uz=j_~#CvJA>siwUO_H)xsEprW5gkF5xdw11( z7aQMc-crpSJurUQ34{Gsj)wOYexhne7gl-wENIFuLpSMd;sKKxLrKjT<1mA6rP*e} z`;-<*5M<~T4PR=Hpl2(HaapC%XIA_37_j<_ zNX1|Q#J3*+PcrMV)%nfSCA2~{?*}x)_jH#Ufy+8o+vBw$myFbh%MG`VTNB+1>qP;^ zN}u|#YXY|^UM;+Pztvmi$RJ>nZI>PJ`z?F+2=}IpR*jJnjm?6mDTZL9I=`+acnW9S3fK3)}C??Yf{ z@ocOG&teN)yJ5FM9^07(7gKGRT(zQmhQ&^KNrhS7ZS9-#l`r01-(UBc>K2~wTQ(f* z!pSzc>V({wigv{=psX+3*A>qiPenKrso7{tzz)gfzp7eRWSg+nTF^AC(VP-Xz+L_m}p_b z)04`ka-~C&tG=A$q7>fO(ygp>(7?TS7~Jats7tPtOHqN2QL6_w+E;39Ydu;Nlk!b< z+~i7dw)=-vzC3?TY?RQho>C>~a{s#3Pj-)KMHL?JY3LspCHPo>0GcyoW&wys@EB3I z*>Q7K_!jakeW3?kh(9NY4xLm34HuHI63s58vFmKxZM?YLdo-&@B8`CaiE&}svTa;3 zTY3Bjuvz~)8npL%=KJn$gBN?#es?Hwy%@T_an?<5C|C)Vx{x$hAzQYayMB})xqN@u zfWLL@7+zDWgO|IF&}G~i_Bfft#ThhIV!o$B3Lv7l67~8r7&@XfE~lY&FnFaXn!)n! zo}>Pp_QfajJJn~|Xftzc1NQc6p^-A-HL#;<8kFdkCnF*S#9dP>Fs-r){7zu3Xt6$jG1#j!aHYS~V`a7B2Y!?p?n+W!aKE&cl~AHCaxNa&mG4 z`?5Mm5*hs#d3kSwfGV0gkV#qBE1i!%ar*AxU@vwx+xblir1Z@d4{p1@J+_|hA=P=Z zm|7CFM4`Ume2HPL%HsJAd8``UXH{UAZ|Qzze*FBkSNgP@h_!WTvmpbYIaMmks_@|+ z!Kh8H;i0srIhk33^}HPs5~)nScVc_YXplGmDFEBEy}5Pj6G3l!u`m0hg2HJ%|JLp` zaIiD(o@=t2Z3~$GMTM`)IRw}8nG--bUZ-ZJUn562hsn&SXisgmFfhCXlxm|a9qiKU zWg}~?TI6=tO7Eh75Tl>Xulbaeo%GB3fG00Tm>WSgE_HH};4+X;=6(X+aA#=z`Cq3776&=gI*QG1K^_%k3 zCHl@(*QK4oy~lTA2*M}!{!UqLAvH4mEU$E z?FsQcS5)EB2KQ6f;n`;TQYk2ISTm#!W#Nz11*4FeYaT<*fS_nB#(J`+%G+C^jKGO( zVB-e{`>~Il;HxC9-JF#Ix)%<9Od{s z)9P0}#Ao790tP9^fk6B*Hn;mj1NrpoTbJDk8jal+&w~5=7C+FQp<7P-UEuQqaN4mG zNDN(|ra#m*1nz_CZz0}=A5<3Uw;E{(HDm+9K}whi@@{m}4JKw*mFF0Ph2b4+ouq+b*vJgZ6&u z`Ux7H1x8>+gXF!L*-k2_=KB4N>%QM0n*3tHS3307i_4@wyB?wV5IdeVF&oZ__FY?X%s3&L5>)Tt^(eo7#BX{n zGxxBxP2{Sx5W_`S_BhulR2AdA7uj@p+_rNV{J3HdkM?pu#=7O0R*-5q#GcA8FBe_h zD#+bg$P@gsc!F|Xx{{Z{_o9;o1O`1?6>Q!(h6(nSr1@puuV_3vwdAcmf;+b>FIG;s zZ--YqpOoj%eGwW7*gj)XjoJ=xGWR&9eeI{Oi}vU~le=8n$I2fe1&S=~F|)mwxqZ+# ztmn!)65+d#t%Yv@jH+Q4y^R7Hl9Vv3YS?`StyUdgqtESK_tY5^|Jeg^9 z4i?T0;K>mc@a}x&a_6p*-?q=dcazP^2Oa=w4!zP$9AijreOsE5v((b=4Expv!8DooGsI~kGipKw!4SB z9hYRPDfNBu;k!E$gTH+E+QP!Ze&>9iSz2D&i0*Tx+F%a8Icln^8s7q>nb2gqw|Q7xB#!FZ zmhbLB33co%`g$fL$ftcqdAg0(I$GT}J~8pe-ftV;_B65l&2iwJcN&|U>p=cS#^&hg z=x&`~ulMJ-LY!G|rudG8E&gZ>fKKx@B~LkL~^XyX@m(ZQj@>9Bt5Nzy4PpU&^+b$hL3#`nvQP=T440XW0SC3!hql|F zI%3kxk~jNmYz>rC61Jb~NZVy*F15Q?DZgRhYRk+>!L6b4;3P-)kJwvj-VQ(Q5FIi= z+PPQQ?o84(bAiFYBVTU>G{))=uo2yF?skTX zEQyt16W?SX7(Q;HBT+_!Y83_g_>JZ(Ezs*G3s2vuhzPZ3j6T!+nqlgdXQr5z2dvl* zwc$%ay1`fczT7eENx*5%3C5jWYMSwEU0`5qRC>C??&SJL8-X$+VXUFe<6cCBtTblK zX)yY=wf?(W7aMOWDA6IM0;2`3K{DQ#bG~-cJrl0 ziMSxTjBM_^+&YzW>Ep{{zIaf`% zHbvWPA(pWe4bC^vEwyF@h~~>JOI#);ySmu zB&bW~FC!u&;4+#zF8T^7m6ExZbk5O29(~WWSl~kXCGV`@Ir_yA_e6Fttgnrg?$P?N zS{9+1BjWqaL1#m`2R$5d_U4kijk(VTY}tB^cLaN*`_;KvKJIxBx`*xKLZ;{!()Ean zUTH}NvW7REPgD#~`ii_r`P52PSol z8{DitUl4&Gom(x>s6AeJ>=L^OBDr5oWYookOVoG#t_dzpGRzfOR1TU?cI_9vZ5EEI zxh_*Pih@V*NHHuHhJhV&AD6Q_-WNos|6pt25nx+vugRiVX$zbn4s=Az)Xo(qwnrzj zIhNCRk-NmUYTQxTj<9&KpadcajCZYb)|ItT9Pm~HP2&gp@gqwl9!fp}W(C{pUWWD8 z;$C;X1L$qw`#&3@tudP=mvkNs^!55Ff7~d1w+pgQ?1lQHLx%C)c z^fJ}$#^)rocbRUT@*sZCr0mp%g%%csE6vUaF+8brqM2LB2&6{sb-XZKSC%7^!?TBV zu(Hq}SO9|nUk*HBH9?=28tV2H1)tfMyW%TA>7Cp5>qHQkZ{=2cK+XA_V-6TjLug@< zb-p+~`pyptsm`*>ISx9Q-@ix+_$(scgIpDeaR=hA*iM|$3`P-Ox`|BO+6Xbq5*vzl z5$+ZjV}py@KDxgZFboipAb6txu@Gv;bI}h@sxx77(c4U9x7HiA!cwzKwf12l0W&9` zd1dG{Vyd#Yb{*@;UmKkO@4FA)9Go^D6wD-&o)=gM{%M%wS;obfTL+NIeejwfY)R;9 zpq~RWCPnbh?ntg)UViiOT%>z<@*28 z^p;^wzVH7yjUXuvQlfN8NHZFxyHmPVI!1>I0+Is4=;_UztupXV!Uf?-@IJuPe2Tn3emfQPLbcoJ21%c|>&uyB*lp`D>oay`o(G(j`u zh$WEz_3!4Sz^g(GQ^|q^9B1}irTtPhb?&S$*^>W?o2nh)hjaeiDbhW#KKlD+-Chl) zCHpiBP4=t=j9~KHIsL9m0DDQr!lgX}C5BD?n7yg{-&ceivrv{E9~u;-?!``W09Z8d z&@ld5F4WMB@s(V19^9!8```#(4yfGB>OWjG?lO~A9M#a1WU-aH>@8?cZK)t4%*$EE zXW}$_AmB3c3dhN!aB}^A9}J|#S+}>}H@(O!F_v3BU4chp1eVJg{ly7?&_ZQJ2kpSulHf@mcBI@zs?N13?f6z35Y-HNOi?$+#kofD4oT#PE4-9 zdO)?B8KW-Y)z@tDa`Lbl?Pguh9J?h&KU>{TphA;K>tv*@`+$rP7VWN zc`BqTY~fgrK7JnUw54Yk=CgL8DF_OB#d*BwHr@0ufoD|D>n{bQiG@hwHNkCs+Qlky z$hp*3Q0o2K`x~jy15Z%T+M@HP7R|NK!%1&gcqU!`M^NgT^{#65JZ3Wz;gFy(Q#^Q@ zNRI&-@5{C^;n9dpnXOUigACBNVxTY(bT|ISXMrz-gw<3oEg_8|4_AZJd-r1%!Bnh9=b;68e=#%i-V^Bb}gS)?c z5@4-yXlKgbO#oN}5Pxf`O!tka{Jc;-M{5j3 zPWY(|KNK9FpSfj9$^s38s}5l!*D|!Hg0ElBz#lpJ8)S@~7lIcH+K0SeW+(-@DBQ*F0gnkt6-u*Z)F|m|J=T!8#}E8tyJ2r#1QEJEt=AN ztSNG{oFpOl+pVPE2f;ii0eth-wgd+&oi5h$YtDgWD9c%&yoK)qxF(IPeUA`e zPZ1KKdB`nU<+Y|!p28MmJz$j)mb}useFIbRd%IHa{^*oodmWOBPkWgToTY!vVqA)b z95BX-kozybntESY)ET=%b?B&WBwwk0^B+mw`{%i&#hiQ1<06M3 zsGXN`;-sxXP`Z=ELSlo+gdbvYcO(+yN`mT4(xfJVHD|%gy7Y zv3-x%wAm?!UR;?bpqR>}JKVc7IPcMO_aHc82tURfuc8=K0LUytK(yC&MNt{UD)C5iR)^X#3_n8GyaAFq|{?)D$gG# z%F%aqDbH+LPfL6|e7ql~=)fQd{@&Cj#X&LJyAyKNn4p;YX0a46pTY253D2n7&d@*O z6v>9Uur>;yQHd56pkw&4%zNsb)+I6_9=l50MZ;#b#7J-5cVQVFmRD~%pYyi7{4|{xMOzX zviT+k?A`_=vLg)W<}vPcOt*Usn>st8i4CIsJ35MwxK?Cr8W28kb}Xy>o#*){OP;OG zq5Fy(Te|dE&?H#%y8~4_^eG0%upRv{QPoyW4B7901AB1^|Y$6iOR#63M;haVB&gR?q!-JlH=qbiM`x9vM%aESqE#=Knt zzQ?)_#ThT^?j*1i{;txDqeTy#-`dLj+<_7Pc%$^;Vp8_gQ^)qo@e^tN#=R{i6gaiI z&~3m_CGF&n@M1WsHm?aYlg?G!$F%Dj8P{m*)=t!_3AgIMQ$XjVVR%`1Oo&|HNT1FX zz&^j`WE#c|x#mP0RQ?hv^BQ~F_D>47X3I!34mPU9jh>F7w)(WPgqBX0+ok1kD_~#6FIsipnQ#^We!U0P^yQ#NJC#2ZsR zh}&ZOC6Rv(ewZ|a&@N&EOJPMZL(gjj-_10fnJF2ropXbpp`)>inG6&z)b7By>JOTH;E2zK*4Az$;vr* ztMun25Fh2SI9xS7XmD?0T`G6M@~X1FCiryK)pWvVHBXHwrw`7;7!2i2h4(FNb0kQ% zbK4TYy*p3m1eLV@4~?@#hq7E9Gw?|}%~Dt*ddyi3zsEmdVK)TtkJhYISUgfz7_Qn+ zz)jR811h>MDfqro(sY_%{872GV&G#yLpSNm+FV)2T{q!Zp#tj z(P`22KbWs797x6GPDjh^0*o^zriJx^kMaD6R&wY}bt#Z~H@8#fKph}3!k@B0wfmE{ zBS>R?@F^G~_~cisG8FB`Ofnqt@gx4jNQQQ~3)bGmTa2{6rLZRB+Lo zUOkZ`)jTF}OxqaTy*pLY$c=p$2l)CPD2;#bWLa_SjE!TvyXz!z*B-Bvb<+#ewU4jn zlhP_H)B;-{v6YuMn9;{LXk6wp*XZsSpW;&=HT#(tRR8$b&RVGtFCtUeyZ zBY34EQpgm#xWnjlast9g z6n1{lAJWF;+#jjMOWmKxN!vXWcw7McnjQ*GB<(fW9)&PWZ?`<5-@Hg8yy>dT>$ zKMSfPjB<;L8UXT?l;A`pUh}a;lHK_{SblRKcy|xI&$kY_;3dS-T2)pW2j%^zg(BnI zRIi!IWr5u1rQX56&F!ydX;e2751xS_q}=DXeYy5lh(iPC=j z!tu}keDCCh`SsOD#^J|yu!SSw{(`SxH=$g9dj$X0>NXSuNjFx{;>J~N z-11SnBE6+Uee2({XXk6!^7$s&)aYCx5mv}rL1kag!r)kA{!1>M=-iJJj%gL~BuKic zJOpA}R!sW>?GFag* zgYnXi?HJ$i$xo8q#L5jdd_wrOuP3i>_D@dO&qHwWfH;zYQwDbLOp4koVeO5aHj(k` zf<(KeHhGQwLn@ax&0dp@iRh(9VG22reEKSL1MsX< z*70ip+W?$=lt4v&BdttLvAgR<7V2Xg&+q%1j)zq2&#XI$5H_!y2X7tcX+?1!3-_L^ ze#!{nbg3}{Xz-p-ni@`V@2)X%^6vT>KE<f&Y%RLW$^Cz^P9fZC}Z z>2A;peY+ojbYPPxuEL>p1@V%vYytNO2(m1GTf9RTz4$Qvt3j2CO-|}$?9|zB_YB95 z;Fmdf2f{Uhfy4Ma%h=+=>`Q_~aV?SYaJSU~=ONDHnLOG?NwbS>u}86~W=jhgVw%*# zvSnZ;<%fp=HtAii>kZ9e7sJ_YbYOQwgK9GeW@?P7)|6(E=Pw7?p$eQ`hMm;@WPGtr z1fS{h>N@~Zx|y#**bVP)4kE1Oo!&f^Tvy8Yu9W-hJY6yrWj&T;(asa#Iyo4vr6g2v z*CEjh%pbaxDu@8R|KCvdn$qumva*m!;AYe^X=c?uk4M01Z4(SaTObecsV(s{?0u=JApQ+o z?wmKnf@^;E^gr}w(Tc-K)W~t{4n{i+`?$aPfD~lG)j2$DJ$emFF8_?H_Km+vcEs}~ z=UFXVWD5p$kvJB5X1*(A`b9Yr-X)9Km&TPmWx$hev;2mEsroo8UMW_@(A4mhme6dh zVYXm$hN*nn`q9gPp>|%kWk!-L5juCARiq{(MiE-#AVkQvC$`l z7p=7$!cMMkWR?s21GmByJ^<}u8-4@daJ`}=R+_b3exI1Q<`7V@Qd}TK2 zg`F-k)Vz>eVS^9W8$rB!w-0i;!$--)!4S(bZt6n^&kKUqIX2Nv!s)9TDWd~F~yMqFmYo`=#QWb(PP5BgTNP|Ejhcg z=7L-X>@B~;>gBv|wgN4PRx|7F*gPEA z#m^jmbl9iTRUVlCm#uXAH5IJAcrGA2%ccJbF^@~_;f@m5NG1-`CvEti^vN?M7ECFo zNmDV%>>B?Pf2Vh7(lA#~k+^Lf`ykdbYLKW^`A3kmY~x7eYLj(pZO8j?#l+z)Huqhf zohG;`=_s@8l*l(oep!bxa8qk|r*WcYE1*#mTWv&m4uT7`?~;C!zP~_V(FH>q_@Y`$ zir;dl8?)QMTmlA*&FjgF&b}hZcu4||AO9`&Sn1G(%}R-E1%m$25in{1WB$Mr>bk4P zI2{gEhgPZe96TKHKo%2fdkOc*V_!s19!p1d3>X>Ycj60dODW0UeJCU7qHHe3weGOa zaxR_iS%vRC4foX|9g8@=9Mda^R693zylY&+w-a~LOG`dHTH>4I&S4wptEZwDTi;75 z)IX)6-GRnx!|U*d)3 z2vd`)_M)ND=O3F}UqL3##3v@D^=7IAjdGSYtdT}DRtW}8#_}aN)5Ct<7|8g!z#w?u zoGrif)V#CT=oMeW;l)L;LY=J{Ry^=JlJ_QR=z`+t&Det(qq zX7%(50c}Bb#73#m2c7r%ELq1aqe|CrN|U;~0-;@of@QAHj?+tj?*1XuM0FgAJFZ1k zb!ywgjux6xZSXEmPBXdt7^aPmKk0$jGke)M1*yfw#r&H*CcNUTJ$uG=9~DL2krQV_ z4<`-)2@}_JQ;^+5nyGtTd3pJHClt}TJ>MoiEz>a8k4Y>pE{-E{3Pd#6!+e7Rwtq+j zDrGe{H-F+DVhF69)x4Ps{ngIHSbDQ$lMuBH)owqOClY%t8t;3a!&u?5|5KUaE#vjx zF{Agqw$J$6p~5rXQ=nycwFZ3$W>IHn&?o*d#({zaY1(+tt^O$5&f9;Eb?fd@qWfXE z47C$k2wW3}fP=iupO2rePJgucWuv|^Pi%Henso%EF(Es7jcTnrvuJ(%8FQaz)4S&- zxn`2ysKNt!?`tLgVWTi}D*}wC?CZ{ksb?9?dy@-R`O{j$(Ggnemj``L=vt} zqg;p3d)Ha*3z`Xd<854i4|2d#-hc&CL;URg3lfuf6@c_EaNDTYPsU_(+Z$I2d}?!8 z_5^tzxp%a~nk5G6H`<_tBZA~RUX#luF?K_=T6$eogVjAxINp=oEe67sfwkX2#6TIu z7_TTK2;MxRCrQFSD!B_&Il4(~`Fwk2A-SE1JL@N--mzj)PM$kgn)}Nh`|wuabCaOA z*G5uLzhSRB4{$yvW4m;x} zH*K^8swsFwZT+x)Dh0c$Cb#X(hjok67;(w=fF$c4{U4_W>(ewx@ZR=-D_5E4_T*8y zAW3f%KP~kfam|m;e&@Z}FV%BWpn?g6DethAPPKZcfiBMSdpViKMA&bfWP0KY-jAsp zcC5L2Kcg=c_aDr|9%bJd0#%Re@F(K(`zKCc|C6jRe3#FOec|^>yTcx8QPBJ9=5tBL zD1+De_=`Z)?3{PSOJm~f>#k3bht-ii0hFMk{xY@9a(^ctjFialQ1d=uEZmn>Ld|hn zh4D)wooD_0+ri6?P6j!9H$g|*e$(Hk)}SCm;_7o6?zz;(MT5YHi`1>6zqovj4pLW# zhm>?dlT&z8{&2z5;w*PONK?*_19gv}iOu7gY&L`HZ)eeyCqJw0f@G&uM06o7rp*RX zr_C*>G-wiSx$H#k=qcm-YDTx7oTA<-yx_CLlOr81+Yq)>tKFebLp4;vPq7dqU0u~y z11Fu{^mJ5l38;3r(nP9dfAvpF(NpAC66hO z2pjLO@K+Jb9*2i3s3oe5VZPX9jb~JDK0mC-pSIJq61{Iu$gyL(LFOa^^8&5JjPP|% z*$LUIr)gz-)rhl%iGDi4s`iStC%zC@@sXx1%7e*T5!xcgYuPLZ#{c%I8wjhgc;~F2 zAbs?e-zu;u{0F$w+#&0o8=mp^=;~jBa&(U5RzhC%NcF3XDd2~Q>vkbbpNuXT^fNYAnID>VeiLil;a84ZHmn!BWf1c|nVbdI zJ>!#)`5$Xljd1}5+Kw#uTkJY=UU3er9xnrc`)BN) z>q8V;MUVd{qYRG#U+9_p=1piCvEu%uG~tU2naubf#K!w+$^-W~f7yH&^Hw%SXb*%9 zF)M{48Ye40U@u(@88{(fl!ns@xRBQ=uu@I*Zi{`jZ0Hv*N{;6<)|uEH^8w@pTyG@Lm8Yo20q<4%HwtKMCZnGYFE!9RSKjMvAckxk(6FCwaFEHs_N@c4~_Rp65r6 zCLu_#JT>#~@#nC+gVL)0W`!fBEt+@|9c`xmKd=+YmP#EA#_Bi zn-Nq+*=tS*pFyAc>wIR|0F^G4evSy(2ao796Fb`JwBzSDaU~#IHfYR#^V4Rsg}VK8zA8F)FT2)I!;VZ`f z`doqQ&J#1_>00LVRbOJEIlN$bRs1?Z+0sk5s?q1o=?yV>h01-&cGYCo_vuk@|A-jL zGiTu|S7Z(kkLtiyyS=%iKQ=vSK&~D1<>%>fmj27Fe`1QAQIkYFa0@XLY&H6Zky!12 zMH-RtIGK%7BAV}!l}t5|QLOERse0TEICnVcBBN}NQ~*65fqnF#|GM@4%d?Cs+>-UKvcJ;E8g-uvjQMCT2CeJmhW%AKjZCqR zy(^!N6K?z&xf|Zg%7Xw7VHmK{0j8V__lVv9In!BdLXjJ09X?f$2g-nYXb2L~fwkgS z1++R9%()=w*hx~A+f>;|G}e!1$Ph8Qg?Hagc&rG6%?gZb5h094yuN!G4lDZrq`$<| z?Y1%@+NH4|5(QSQP<5Y2k;tU9)AvBpSv-KprUM{{SiEe1d8*m%n;zsNJPY!`+9}|% zA?Y3Mf!`<8U5&d?NJ%_OGDE3A@_42IeyK?whTdsmGtiGH-X!95Nh!`U}831 zFuVcOB<$kzdZ-p`=GHxwT5cAmiA?xH{DO{FVP|MdR_SbKXd81^ zNA>gPx@^x$G5CmPunrAx&buR-@G8@m70uwwWji;4SY~Kib+t6IQP+b zk=VXwbQYMq{Flno73x0~D0H=!^Vm%{7Houry4|QNLZ>3dLY~&Nd)Sm$HiiKAPyC51 z4jfs6(M(%J6E7%IxrNi9P8VUTAw5r)d-OsM*>`5x^4acy`w>2QtDnSQVn??}zidTR zf;?9mPUdI{HZdo7H3iG{tdh?p%XG0_;h9485lS@?VU3|#6Ys+7H#fa3f0?G*OT-c zjIev~=bJe4bJUV=pHc#sGi6VBGbj{B`v7<m)aK) zS_XyrviKyWrV>Ai@t4?d{bgq1gHNICQ@7iz*W3!yV$%=wQOq_v-A5GltYw(2masUL z2yrq=tD_BJ@B6AWYiU3u?)$rTiv<5&>~@~|jJXs=IeO9c6~mVB_!k?bd64qM?@$M8 zyE=-BDll$SpkO7Wd2FqLilQ`PH<#vbM4#c0awyuu=H3^5OFo9)T?B1atD@Q}{9m80 z`>w36ryjDjup4&^Y=G3PKG^+qOcR@b7CJ%o+jp`Rz6%MQF+GeZoK4*w z18FfTgwXAyN{xk5vN9bWfTIt_3yZ>La)`BG5u1%HD>Lby-o?OR)}bKB0p*+>{P%hg36 z##`aOZsPVtMG->0aUN}`NIXylicJGNDYPQL8+MA?+P6MbKpJrw*I+9%RIR7Y9sOb` z(TP7OyI6)7FjUNS13@PKPeYfUgM4V{hxd3bgN57vM4MBF$RJu#<`b0k{H`_oY0ZJ_ zc}n$j*ewF^kWmdrL=Y5Er14l5uAFbB`MFD@65lJ8WED)w z)w~=QXtQ(+`z8Z#p-kfV#CoH14go$}LR_;lhd}>I?QB#kS=gg;Z-k>%Y$X-)@zZ(! z%+w7-YrySROeQYr-QATz_G%jMx>zaCY=*Fl{cy37d6#;R$O`VNHxN`|Sk|CdBqIn& zPa#knEqm9;)r|_I$DUc0@A2FX6Gp+Q}xk`X|Z=9+|rc&fNjHwOn}fo`X#Z# z1zKjOSPbX6gVQrTl}49Ozc750M&HjD0Gp*h$Kt$q`dG6Z6ZvQ#;PX1wg3#>b)K$MW z0UDCbaD0>0yiXHw$(inmmQ~$!B;u@P@)O6N;iFC zXONjMVPb|@Sk}O6#Qg@DeBoj4>#KT}06qkwfXND?q_z)!l3~IoIs6rq#xK}*v}(!b zR;=6*#5NDlJM~{I9yeRyDIO8BOD{W7HNKPH)Q~k^Y3}iOL{|*lkQQi^mQ>o5q4K-^ zX}6c**VTEBy??M)-=J*W2IFW2xJ&fVR^RbWYKTIBs*WTQTZTSj+|rqa%%o5e!_uXxB^Jv11qEN5D* z>Ek_9A}z_W`dt36xBq5_SN^|!UvDNw;<=50cUcy8BV|2zvd1fCE>caSV0WZq5Ss_fA?eLOUewmEFNc% zv=oIrNr1ExnxIpV=SbYdEvcoaayTOtzK?5g8Y15LE(5t8Mh(3?HnAI7CKW$dE_X>6 zUkwTH_))b!;{*vl{FjKw?tRyg@?$sleh7+*-YMks`o!8U=R%E#B{dR5SW;Ep*|_{f zB*)3I@v?`I2i^>*T7HA6)9x*egsQ`Dn~4yI6=~&yjyuVw?Xa7jHd;HFKdi=Z1(@Ya z?5?t&gWKW9G;g`#^-CSx`?CbajOFvKY1sj~JM90ML%QnzS|GCY;Sq-1cp2Z6%#8Sg zp_9%iv7+0kqma(w3<4@^@I=$9gSyT*a)%w7>C0Nd$~ER5B9)6HZjrrR60keb{g|nx{U;va&gO2l_PusX)Xkgu#dP_~^(P(Tgjc8;1^t zQu@7cn-^U1lbKyGw4@KW)sVj1IVd9akfNJBwnW}1t~(rr=UfaZ6vMtqdM&LfTr z1?7$1*%0FgERR`GV$@n(Wr7JL=+qjkJytQJo=|hCq9)-+KyNBz4P!Dcjd}3huFr0& z;Th%9F4wJqN5EWGKVl0C`2=>)@gHtEM8w)ZF|6gC-3Fcwoul5FuO5J?d6S>Gp0>(w zJ3WNqtOMFTLy4OCA@_?dLdiGHjbrz5g&}uimi-R@{u?%*-Kuot=5%gF)5%#)MG#9< z<4_WrPbSPHz#guqT70{&vinvdQU*HT+pZkwn6H@1hdsc)jT+%s4+$Y)%8 zdu1>pK~lW+p|i~s2MRsS20ZS1+~;($5@=m5Zv-j1Fn(Rk_Y6;$fVK~H-#mg=vNq0X z5&ds0-xBj)%Irnq@=W_>tF6}iR|w!a!R;v+4^A_X(jgaYRr&dnlIi!101>l*JCT#K zz%x2Y-&-I1iE@G-r=VV$RQM^qvL$lRH&wlG%mTQDU6$oH3Pt)Fr`Ee)b9!p_i(l{m z%_22Tu`bo8C!@y9=rhN6>n46| zc{B^)QgApHH!=-<$3bOH@&7PLPOUE_z*;MP?CyEgg`IDL^cN-~XyWm|G^8k&@?)_r zxTH1SGf(KeC0x0LtMcU-v+0IO$4qA1QydkR8VrI=?4B+v0Sw#}@%lrD8Q;F>LxVsx z6I_CYUYv>Ly4laVr2q!Rk(`Tf{U~2giSLBzSR6H;p5DiP$2DyOzkj1S)Zl1PH<6iB zV`o=w#Vo?{^3$l+qsU^Db5iE|DngQaEVhNd2nR{f0)S2plU9S-EfJsCL#8AhIm|Ea z|15kXk784-jwOHC@h(&&L`P~|qA`Pl`Wi}keu17^e1&eo38T0d@o8;C=~;PDnW-;3 z#$ZX8$p~Vpk5iI%;Nt?tSjtS~k0w8y{8IUq2)9xAr_CB-YB=-&K0!~L+qshICH0o8 z=F1WaICWT%IoB)_VD>jyy`bz-%9K)WpgV%N$kEqytKZzA1g7&|$YH8oXW_BdyS2L+5f&^=xncGFZ^6z4)_zJs8_=MkVNv{zHo zjgDJ#*_f%YViU|b{h@buV~7(v|smO^O$6u{PV z%yp0FqXLdd(NNI2Wv#S?0H&sy_Oaj0QJfSS3wpoI(JoVt$SCMtop~p?b{y;U3ruyp%-c7>Qy8OKpPc)}?9RM*+k1WwyZN$5Q*zL8 z&@k1r_?Axa_jli)Z@d=y=?0gv$UvX(Kg@QSey3Pqy%Dzh%Z2q^OL5U2E$|CPZGSW; z3*nOUu+BEsxW^0rL5xWGS~a^TqB5)wEw>*wK$AX&&*tQx`k{zS0kkB1fg-EjDIzq2 zxP}L`TfDeajKy41{Bh=7R`xo!xZM6CKfygo)vLa}1~Uxslws&k0i3ODg)$DlwEAn9 zPNxqM8o;XR^;eGe2rRVe?bw?SJm{K^mUeXmxrrxIwu+YtDhjIwR;?7pp=|V#Om@Pv z4aE9bl;~>m(?2|Hg)SriQA3oQZ{E^`KOFU{1vintKm%g^EqSlFheI7GM(|c_tsH}- zobp7$)s%1pw8n*a0m;L$j@D7X^ho&i<0cJj#mHivSkmyjS~H>MOv#z_?UkYV9wcRKN2R| zr=hk@hNii;gb3^7K;za?io=P+F;T|!DUoGce4B3iX6~Duy+K+EhAla^yt43=Z z-ZPm~vdvjsko+nh7Dr9kh)p=HA@n?Viw8SQ;1ueggwLd{x*PS`!6vBdDxT8R1oXi} zsJ6s$6D)qtz8W}ufN7p-j-`zE8@F;$^400{7i3+?Jv!0cjbf{(2gNUUc2vUnTK`^d zR2nyAdv{DhOh~=B7s_nv1)4%&6E{|4bQt@!KyThlpy>G6=&1IP>S8}muXVDQB_CL7CFQtv>{&iLnXREXU7n93M1SA-(lDtB{ z&Z6ruk8uS=e@?SWc&kA=2tZ4VM7xz^u6-7vBLzPq9u#WKW2PhO<8HDNd$sh9iLu10 zuDJO(mvH0tP=FSC@4H_KU^wQ|HrKTQ|D&CIF%R@#Cr8vla;A?{iEW)dp)fegGKBBer5yX7>pM-(-0Eeug|tdMI*fh z7wJf7;x9NyC;1lJA6aUfQ_-er?+@}#et+UkJFS6X%HVFduBgf^6V(y%#&i7`;b~@XC4)j*aaJV=Fi#Kz zw8Xc7`MtEyqzt3_6P_Qa)_ns*$wU*g6_Z{hD)48g_BC#Q-xn5wG^X9z7`$<;PY8;G|ehj=D1z8X<<!5lGVvEo56~k+o0N~L=lm`SNC}S z#Z|%am*-qM-Oh1pb#H@G(wK8C?>hEi2|IPRAD69mCRXCC5L&0ns}OgdBs^$!S`FVJ zpZNvit|U^;d=2%#`M+}lq`f^KAl{7=ocwfXWMuT~`fT0wN8{5I!b45k)+xx|zIY9I zvpyOipBuxLA?8_(;k?%OUMk=^F)|X%xI3tA?h2nUyBK9=+)d6NG{4;RMxYp8x84^D zI63a??PYo7VKQlnhtX={1T4u~o^pHi7y+Wy%$OvI4>cKSiJ!kRvDBlHs>v}YlOSZx zr;V0hgj)@pd7+4GyyZk%GFtqkrWhtFl@6a%ucV=~AJMry7%@hBC=2W}`L{78hbgG6 z^}^lvvgnk2$B|AWUS4;*>8dXYM%L^Gq6xqBKja2XhB_ank8 zRRK@81%j1z5&I}f3K!Z8DhDQ?K>lp^`fyH}4MNFdvJeOH&KfooI@4=Wjo$6M5rQOh z;EN$xhWK}K;nKZxPXYz!aG(Mif5sGV6j?E(DNng1VE(!Kn+`d;%0hT`Ry<>(4Vf2h zbGsy*RHW)A20cMlFLw6Sn~&wZZh^FM#Ew)*j?yeiw& zyImkasEwW9<^`FiG#5)WaoEsV3Xa{QDLMezq>hh9d1)X@Oc^I881Bf9g^O*~ofP^C z!IS~r`5*d9gyAz@td{jCyyWmXJ}M7%JCSr~S<8CsHP zkAijfdh)9`?_S1IF1{=q6n!H3V@soGy8AZzP$E>=5w<9Kfyo{tlV8qBy=}eGR!fe? z$*pD-r`r7QcMNxOZw|aJ?*$d<>ly3wk3as>sNl&cxjsi&Q-#N`4V+voe#VlV^M5f3 z`BXqMzRP=O)S6psaQrljMjRqq5nFw1@U2?NjF1RcTqmc?5hsF#KF@_j` zM&f9rZ_tjHXqbP+xUF`+p*X3gxg4$V7(H#-IH+R}$jkBCK1K5umkG7qz8Iuy3bYOj z3%gtsOmIFQ{E@ZWPUjvq2c+!Q&jQyN>#v(Mz?JWM0B}G3AFt{y_Z+M;}}$%?FRV{ z4bXilOrP|=zdqYK3I98|Pf#k68wSH=3@(Oxid)@68b!{lpcR`|tjuFucIg_^^R`Nz zAxAbx?BSsYS5MG!R(f5h;`N7;=6b#F;0f>M@Hi1HlApV5Buv@4aNryE>V`qXJhMptm?~dMPz+j+^<74Ysn)*yITIb4cg}#z!9G$x z&X`M!JonKtPKml66LK4gj^fW<;bb0pw4&Zc>m+H_OKUb6ZAQA;rA}*LzTsz>6w6N% zq91y`@CK{5Hz!i2WbL#RK*-QWwgqdKBB*^yl>Th6jF(4?gaj4y>X;RxfN_6PI%XU; zh7L(0IXmYa7$#M6?GhS(Bwmhi?iDW`2fTa;{qPl{i9d=lNBsOkpGng^;|#m?H_H!J z`D|*?Jtn2w>xx>fq_eavErvi^YIYM)8uTOlJdmx{T@DOp=h0j7NO#cqyX$KKiA zBXL#<@jsjG6j3()RLGn1pu1gP9aqy>mf`&s7hbA(Qd9Zjp2zNPL9vb34K6m7^;O#G z90QK1-=a>go8zWOZGf)ml*8Mexr`|r%?Cqp)$lWSyrH)(RvVK$Wq zq8tU=ZzkumgIB(tja&!K74um2dsZ6%{0r;!oVxrK9}lbUanJt^uzvM&+&wjxw@YQ! zObbmJ8|{_$GZ|X%>1R^KEctxhw@UjSno=+<8X?Ef=#~Y5?FzFlu`JtP7u~nf-$MtY z_~YF2$t(X6+tUXZtQL7~`-~vnqEg(WS+LMd$z3BpQ)Sb$Pvb&JC^GKa@1k*R;;@wi z9y=neV{GX8;}=mF!XA!9U_dBq8nM#97 zzRyU(p6Mtu^mWg#PoYWt%^2)#ud!X_tgi9SQZ~`vi+O?>v6?-X&}t6%uy2#K2Jqf;Y&Ift=%(%TfEJmQCVS6m1Mk0zXc1k)o7EsBP13JAT4{TV+{>0 zW6!TP!zfREuAW~quJSeWw%GVywQ78st$;-**w!#dXqOVY?j)hJVHH=tuMxSo zeK3}Pv6d_>3L?^)_CXsO9{n;JDk|pFV{}MDgT-W9Rf%?fIH7oWxqf7ZO=6q@%Ic8U zpe5m3cSTDW2vi(98W|88G2;iDT`dQ2lpi}_g|dOn=QYKZ7BnZDp5M5(S}pWRjb*fy zQJ&(ZkRb}(rpZ=6&^Pn|Do20%QaPx+3l&Uz$T4{h!Jzi^vNX&#xj@c8E!K#*bZ8tg za+MIor3Zh=Gh(_6*L z_;NGYGQ|A&&G{Y*9ZR2*MvNB`8_+DGV)&}?hnbTnVPH$X^$uS!iuAhw@GQ}!-u7D# z+1h|-xZba`alt9QT71Iv44=!Lk$Rs~6ZNs?7hVhGU%&QJViX%qq7XzL7Ug(7sh<-u zb`zPxs$(DTY|rqBiK)Ur@wRSaVDpi-D&#Jr;;Q1l6^R{n{kF#9*S7T8YK^RvJK>5- zR^#6P&Q+a=j)~*gMc~kZM})W>aogm?rBpsp-7@E_r`Ypb<(_bBIzd;?=Ce29xITR_)NgJ`>6m z{hSYv$rVuDo6N2NyFNYK(JIu=9n2J@!bVkW;7XYPcP3myV_{Q0x8;IczvPwh2>VUs z-?=VD-Y99d-Bg=K#o?!+=Clz)uw@aBqoBj&%x2Vcq@F=kmPhBH9W#i4ME9)KxF0<@ z7#gAJ)dz~cJ7ank94LwG7plN-3moP7=x^76aTnkDslV;T3))vxXutj_W&xgz>P=-8 zuue&^2Bi9A$m4JEc$s+z8I!LmnPN^vu;%{Q`~z(=tB|7!pIK#CORaq1HS&JvK+ZX* z$si*^gN=sC;iA#xI_A?kK<}AlqLv)8gtM51LHRp4o7Q)7R*xA=l<<(D#*}s`=KH2u z>5J#eS<{1GM7^0Me*TTNO_i@DK&YMTh=ism+0>Qppm*99Aw_N|(4@6fDDc769C;hd zB9rF^ThhBJ{82K@;wqP~%_g02StMM7;~=Y8-;Hm+mPoR?qVi9Ahn?eG{IX-~NV3y% zm<1gsekMpi$ovPGIaJg$EK#!nob#0Oymkdmsw zm=S1EOykIi3+Uwc9uUav?Zt~_G=5^LIRN5;&Tdic-?@B|LxQ{bU_r~2u*>3Dj8%my zZUZr4YrNFndm3V!>THVr07}Mu?|%NL_}`xm6j%^{Rnt(SrI(Su!?xdgsjDo4A_-J) z)`V$#^WNW)a}%V9K!P=KFh4Dj|B4AUp*7ZQ-F#^(5p=!o3F&GX`ysN9r=`P-W_Wn? z_WEbc8G7$RUGZiqMEM?m$ivrtUReC*_N%G8hI=wh{PHO<1dp6^NH88vyIbVhc;2OI z1?QX9{#S+nFAJcdQDJerQR^5N} zE$f@YzebjC*FU4lq^ahbgtW00U;+numlj7w!09X`_Vf?u0S60;tqk}IK zyA83$6|8T)EeF)o-$f}2tGUYk2VME7UM)m!kGh zM6+9UAI{sggTXIA;8RW2UgCE4u)J?+piH6$uJQ1oSy7ox&a43cq5FTkxin$ohu_@t z+26mH|3SQ03jiwo)ZxfVEs$D1mls}XC|3f`yk(UMst{_e_LOAK0(6}(3Bg%t)4-p zS(Tlj?9dL8xTXK!T`HG=|BtA*3~ICM+J=+h9;~>#OM&7p#i2-Xf)y?9?(XhTv}l1+ ztVk#ncZz#)cegLSujid__RRS!naNDfz4uy&t%k{q6>U_XxK2OsK_&*W-G;KA4_5jD z-980JQsy(~NCW*5Dt|dMjCA`=H4yq0I$s<=M0k=ZLImR}@wsQfN>V7X3EK3;AT2`e zB;&8>{N@`}Bq|s>p$fnks!T>&I`tp{e|H9FgP3kPv8+VA)Z`d1!DWJ>NVvl2;9RJ? zv^LdGFhEPofO%VJeHo=6xN#TX?K#GQYU@gPcn3MIM!Y5FU*z&<`2bKwSTw@mqW~rA zAO-PuLUzy5(9|i>uh(PDZUm6UiMYA%O;?i9h2b$~AY`#hV(^qn9TnU~$oFtu>EFjc zF6l?{$^hc{OV0IyYPfv?i}rhAP{yv4@-0Nq{)O&0nd(K^M-^l<`p?S2z(C8SJ z4UBdWB4T`mz^M!Zh%1QRR5HhkFo3Y>eV(5M1Ackd(mVyytf8PR(x6{|$$LAUz~z@w`s*|KPZZpv zEg_NdRdB<0BTj*mQ>ZL>gf7fbrntc)jC(7&XX^2m{KR%L6uz4CeT40H2%WBWUCGAkovlwjS|p=juW^eyU*XCu9?>|;!xtmHA!aGW z@_DrYuaiII&caaTo2F}d^duS|Ik;+E`ggwd5(+G2e&s3wz~O0iKhqgN*!3&Phv>g~X>BH4|$4cfS6^2(!ri0&K zcO&?f20W^rfA1hgY{b%lPPG_uIlnAb{cf|o0Q6-&UDJD=wu|DxkuB08LCbQwmiIvD zhwy=O1O%rHkH9DMIhTm9;zUu8f8hgL#=LCP%n9b22aU?gHob1#RnY5fSniO@9458vd;tHVogZNja57 z%>7Jb|9cAyuk(KRa6@D;)xger2$nlY+Q{daS4n}C`s&DT@T0NcHfw^3dB4}*mx$EK z0R<@<&R}2UAu3xikP|-4_x1U9DAO!WZYSh+)kjr=dqfe8vk=J2VXp1P#KeT!M76h9 z)4Vzb;l@dlk6@Kl9{dtPUP)OwF!0_Irk3ktI@{soMAent6a{&y2-mM_pkL-X4>4s< zpd_cLit37V)M1#5pkJ@a&IM04&Vew&3CC6%MP}=9ackHPudRg+RY7dL6)%W zT|$cxYH*a2Wa_xsYdbJ9a-Ax;%1T)IA6ty?XtA#YcW${34f=H`Kg$4eWHc9V+bfEJ z%&!=YlRQdk(;aY87EC+ARk)#}Xiz^|S zK9b2L1tWb4M7DXU_97v)w{2L0dz4zjn!boi0 zji9i!0&!a`J72oRF|0;q9)8PXG;DLVNqkF)yOUD;6I8e$KrE+P7?D77cyUr^Ni5=B z;``zRj@ zV+%s(*sL7KIGK6WBxuaZqI-M!chQSBEMi#qbK&ZDn5<%t<%>AS#i6R>H|h;k9pdQ@ zg9uBiY1{zpcBu+z{+Ld73Nq&#hToy`<#&AqjM*$b$~(=j#SR z)?1GtX<%T_W2W~|L^n53$3XhE%Vj(jZA?r*Zcxui|8V;~Ao8$5k@!@spJ8ru5 zzw6~efA-rNJQ6O;R$>U2O(XW8&Ysxq(KG<$N*3_8C-CK&^F>rmG-6k6$p88A7k00| z_t8s);PK4Q2v8(4V60E4O=#8Pv&0=^75t{8491&g>ylU()-Sfx(N$-$931JAb-0N& zjHIiQDLqBBh<(Eb9M&wVyh!?Lfv$0}aDUhs<1VLE|P#f)D= z-0~busc8#KK%MARNS#sWql;l-jg<+5pjE>^ApJ-i0~}~056J(vin_2bB^g|bw;IRf zI=h8QZOTt%ar$%D-6C#ua8N^vHaLbq+>|I6w*+`MqU++e8h?7}@At@Qn?t~jh0uIj zevBS{3JPgtha7)7f755=wssP)vObKk2`AXlkoVRgBs-c_P#C<)l91G!2GID$G_JGJNa4|7GbYh!^caN@Rd?HaI-o<7>-H zs`w+Ns@U;8ma zE$+wnn$SlG*)T`$CVt?j#r~kU@bx@}ih%*R`7%;*(%7CoO-vUOULlCn;_g~VBoJ|aO!(j1)i10DUFE}=&d*_#n*_zrOF76pDdmr;iXpn(8e zM=B6YLhg6WoC5w;g*XLBr_O(;&2w{tyl1#OTO&V@L6l|P%EnWyt}|TGF=Grh`Y&N! z8~lhcpLjl-rwU4^`3nC}wZ0|Mrs92mmcagnrQcqM0 zv+(VY@0SSI7-VY+XC%n)tYcO$eT{@+V+**25U5up|8GOWHsw2FN@yse-P4KKMkp?x zv}usm(LIss4i)#sKemwghv&KJLeu9Q*W<;RtgGkSwU2Ob5fh1aV9s!lz6C6uRhVt_ zD*((rqsBi*iQErrNvw(7*5E&P>L>Hy0f4P(U%(SRZ39-RX=$Z){1pCoCf_NkZ~8GQ zO}*?$B)HDc&-LE)eE9GowKbyuL{he3EKjKCy&*owmuF9~OrK>lQk+DiA&U1zy0ushYa1vVS{wveTqZ?raMrw6$PNR;F>?{NY zpRcA@QUu3g_|*|TP=kkOUBo1g3guTr$oE`?jX=Nl z&r;wtp}{x5|Dr}BARm~L z+KHNlpK0vzao+Srm8Mi-NTSpVH&H%~9lP!%kiU*Yzg2>i6Lf7eM}HPv9j z@<%!K6mK+WnAPb1WEzImi4cc5K)+~u@9#dH2&3bDE7*&p8y_WX zK|9Zg(5Jq@ zuUoK$9(8Q?OSqFh0{Z+qSz8+pqRJUF8EGwqq5=ILF^m@;EWi?oP4>5^4GYQhD{{D9 z4&bgLkZVSk$><$cg)ihP4RN!E8G$c}m#O4ZoKUyhs*tg4g`#TKj|GZZ(i3PtZLalmm>*x-NmaWjnvf&5M^kFY_+`x+L`62k)Lb zjF}~mK3}{VFsh1O7TK*PR~AxmgBR$isYx%385qHQbtrGBS+I7?26B5x4O`0IneC8f zC3HIGpH;tAQ4bfnb^ZK6ni6DAb%8*_Ph{s?=P#2Ozu33wtOdOL5ElnXk9M6$DIR|@ ze~}0X5$t988Y)f{Y~Z^dI>tdwXx0eNWY8(U5QQvB6{5N^<%R<$qt_Y;LHmZAW)7u7 zE^8>%)OBQbz991gyuS!aVR@Z^AXMA|mvR39o9MshR12ApP@!Q0ZY-z3jd$tt~>@!6LbR-_{ zDHlmVP1KqP^$Li|CW92-G?7)*Yy{6m#pp4Si1FQk_{ty}4CB3MRt0}-M;v^3np65A z^H$W*Uv6do$lyvKI12FP>}BQp;h|rev95}gvKaNCu1?d&$*}U!E?g&k_RBTTs=u=3 zOQQ~)P1$%(1QsO?AI6;{HNx&h-0v3+G=M6R{rVIRfQ$Ml<-J=9N2tvin1lgR9YHcq zihV;fYq4D=^hZN(kvK4t|G3|_cwr^^vatr$N1O)XC+h+x92P(ax&4eb&n(z{NF9TL zVr80qQb^XwICaCkmg;gmd*s7@%7mkdog6$X0E zkg!YfwY_;DSq~bOid<%Ga)V9~QyT@VRA&sR5qu8zmdqeyWgso?6Qn!1EZKHB zkxGhKIVCyyFFZE3nsj0u!-lk)8I)9Yzv58T@4+*Aij$Z_UlOWlhUj82(Ok|J{E_dc zV^aQ+bh=sqJUK5Nyfhs>{ZKra5MJaD=WPYpCCf)IykC-%&8(6YdU1Kliy@MMdo`Up zp}`acNw23pMXIt7F8wr~e>~z31tPt-vzuP?HJ@nv8_fbq)F~nNW7Vd%q}utfyM{fB z5!2cA**%o94h-Il?f05(?-gTuh^B~qvN3^tz@aaBrQ0wafhjMCo)BUh`+lDItBr{s z^3;*U-Dl|4xy*p2i!sC9*?nT15zLI(p&U8`{?hw8Ql}fE1lZ_Uj+pDJm)6Rt#X)}R zaK}pwLobh56SV}thAr6Jm7KdhN3-3WpD~&%EfpJ%CR&=Ae;X5zCL1~ zGxiDdu3w&U$4R~VtN88UZC15_E1~$e9K-dEx9H>oG0}>6o-&)8>_=0pq7Z zsoP%xeLF&hDRfyC0JgCAgt1d7b=;=^qwvlgYyxA?e^Tet`0pi^r&1+cX3QD72#|g_ z5>W9&CZt|cQvCf6u=@RZQQm47j1sMyG-T?T$vzNDuni*YK?pJY3isB$J-0f*- zXt*}iK}@G__Q)FA6^ZDF(yCW^cEYBSO%sKh3;H{`%w8mb@@Y%5_O7N{z-VIFW>Ft;({ZGnk}rnwgH0orpK&c zXrYboQX>AodMth_SGMG%dE)zM=yc0O|Bh`m=t*@Q7v13?Z+qxk%a|3c4pVR@<}uLG{T9i(%tc#>i^|&w_iK7s(RoM@ z#eILJI@}jWvVqOeuZ!^wKdU?&7cH~bR(u^(B%W_}6_ZR5_T$I~WW+VU8FgeUjlTyq z2@fv*unm(%PA@4f9fai;n&x>gy8t6^2~M?$#d-R1w(G&TR{uM}>JqFe#k$1vJud_X zfo51;SS?`Zp6icIZEy5I(9dy042B-129A@`?TQLvluY&s!o+ku!h}NZjoucQVM(>iLO))@(Xb@vj}tK^zmj)ZF-l675TxOLiVkC#OwF3kykUALlM1bxr5|4_B{zV7yJjt%@a7j5;l z^R~YI>f*4i?ghr+Rk?(bFc=;u$6LR$?N4-mInOR{!^K&ua6w1F?#`@XvbM{e(aaZN zif?934@wLBifZ;Ypn>#kJKTqr08nIC$FlV?^&neKN4&5%B2!7hHA@-@c~j)MA62m~zbwFerJ~4xc(V z-t`61M0B_I%**C6{wO(VN}P>2UALCeL-j?Gjj_ zZaS1Yk$eL4ae($38Lv*r30kB|@`OqV?N>hs&wh79joV7hl!5<1_&A$Dv+!2~?;tq< zcFxF;wr8Z93?zz7YTR$_5$oaRYYabu3UD~UvJ-@HL z+K`x5N};9dfnY`@f;ra5Z{h+ zSzhmE*9foVM1JD~uymO$%NO~{@<_h>Wobw-bEZG~%0S-dmVh4uUBnCIqgqMnuEa%g zM9V!1&Wnf@=LICDTK-w;k|v)wmi({?x3y`5Hp=ZM1#&xd-LD@a)I8hOt80Jrej}Op zLzc$Z9IfUbw{Y(Vu&Tv3It0;(96`81QdBgY*U0c{jm|H~NN-ggGo&qOU_?(!`KE}hc+e* zadQ4TtAtixZeo+sw*kLpV-;<&^I5x@L%5DZjj49f4CFBDb4-e2B`7YI!W z{cZ_rl!QR(RB=FAOW5_%S0x#E>zUMaGo|ITwx8+tWA0jTHZy%u!^VjB{Yf;%7vNU+Ebm#`cvo#3TZirM zJNuD_l@=@f>kjez^Cb`7S0&0XL}+~lDv%fX8aU;;!-Vl=W{T%DrsAJ6L+e|PfkBdh zVC1A)z+ou7XEOwkVuu5%OqyRp`sj(n_HvuFZULNXf&wJ@4rFf#4Jy%&0$<~ymfeRorR3c7MytXkeK8*lpjVumIy2)8isoqJaf>o zPJHY(AKm``cTn6SD3Y*A^e6d9&m}1!uw~&l?$0!lRl&0S!IB@1nDd{)ex5dOXRr_s zp;`vOWMnL8%`FWmI_D>kXOzZF%pRVTlwYG`72K%`PsTsXTACG5FN`e>526 zbT%+AEv(ND#@GVa*!FDL#HYGuztXq9PvP8|p=3o$N_qHGcDWsDS23=1!8FppYUnZd|IFTTj<(aX9U`+#nsj$5)Y2;rKA$LxyaN~hhwwLiJ%fq&DmwS8fzeR6k_JgFIgnw|LSsn+G;eaA50kJ6XRiJLx zTz3_=kt80@6TH+ODLNg`B9Ig<6+BumPs2{poGA4lIXuD$D`XOaY%=vd zjbBVC61??O?bnb8bf~brIiTG$7=`9HhxU{Dw^vcn>>~b3R=X^mPXnSUV4^-0s_j6B z6dUC(56|C3C)xD-R_sZs|AQQvS7tm@R)P56@_aA#&c_o5rte&2evc~&{~QIwZ10R& z@&spvyzJ!jKJ(Tj7*p<4biiZqPNA$(5|;irr1$sqXCXw{uN*?9qYMt$A~OjMZ&`;8 zSmOOqjl%c8`owCQm{8RBYszGEMR@XLGa6wOpM$(s-x`d9X(#?!R&F^^^-a~|jUPQ! zPJ*zCWWk3=9BIZvtL8hojs#~NHVg|5>VT*tDYu*0B#lhJcTe9!6?672O>(*M+4tV^j56vSkh`j45wx9#1EZEvb} zCZ?ze%Pu6e*LOKN_*512s5HHK{)(`q#(TA{fuV+K=T`|u*VNyJv{8Y>19J}q5vjS6 z?~`RBNdmb?Q7;~W$asOyaGS;Wksr*=8YUY!Rd=w$sklNvX~9l~YwdIR zwt+A8WSz7ug`yKiU6E>>BHiT3w{mmaq07xoUki>hls0NCe0>Pm$Db5=iGOq8K zMo9YPEDps!Mjm?+b3w-zBojJRIe6VlHxGFhby#2fIWoIUEWZleA@K(O9HP33pqKJg zk>b8RYuoa<#e8SX7N8~STlY7#-<j)uyE!o>2nro1_;us4Fxi6+57;-?BTvMHg3 zFLG?tAYzH;*)K1FWWV`?b$G{g6F`}XP<7E^*H314IcZd6JzKRjLc??ve@O5e>T_I% zEiNgtE=~%v09OzRnt4^^U;Gy0xw-FH)o)zP#+^EIE)SXLXuZfSx<(^G-SuBTY~)zfc|@9p|-Q~tet|E-{vBA}2WI#LY$Wn+3B zD_J0)24xWQ6{1;CNLWVsg za&H3yy!kGbJi#I5cLr=+T-SY;KF(bN2?9Hblc;#v0=DtK_t&=#roWjjGcEv(*&>$t zBUwVmqOX5#4aJE9{%nkSy8NfwoyaDptQ!AKkjH>V@IrMDc;zr^Q2Iw+c6i@7R+PPc zll<4p6@LM*56tR~rm#mwioL@4h>+6)QkF|r`c;UJ=Ki*uO zmm3!yF&q97eg2ao42rCFcM)?RvC?gGZEe3?m4oPxrhV&rc4`iaJUZs?U$qXj{m7g7 zjXh#gOGYa#)Fde5axM*`K95?K*Y4c!+2LYd?TVg|lvy~T{d2C})?`T@A2B@&(?orW zfnC0dU|UgJH|mIyJrGOE^Zw6|-aH4EfG+>};AaqQx-#H%_cZw6*iZyTGxXX6r*n8NY+D4deJulro_W0UoT$@HG7Nr<8vZ`XW$ijQQKq<==CjS1<$dAj*I7GRG+ zGuiCe=D0(|U`w?6w9sOm(tf`4GduP2tGQ2kYL8P->QC~-Z8uv8j6O?u%)htf93MBX zd%ya+u0d9%{4_38V>4Zx)_jJwi&_<0Luj7OKK|0&4&2M;nt{4UG+e zJ7RDJJtLJY$gGD;#b)&-l=91&XkIDe=HI|j{tCnp6&dfQ;?g<+EIWcKXxjP~zs0n= zIQk;gyVX_&1Q11y#6)_l9ttvL=DsXRU(e*O8wdv&{9*slEdYN4E-Z$SIH20snzE2v zAka$#!J1TBVJ{z&($Qp#T*XNs39+x8NfR1Y0PznKbZ}=~ZJg>h8*0^7+n*Z08(i$N zBcOqG3ZT7PB=Bz-_F{j1dI*Y>cPpY|#By4G`gPb>{C?9w?5x4~M_pPi6EH{JAEnkO zUo%8E5=zxTcfQzwaZ)7C6j(X{3X}hIYvuBSWd(I2m`B|S+et`Y5@mx>R{r*p28y~> zo(*ETuV!ea{rHfnPv=BNdS!@dcy9go{Sn~#tnp;IV!VwZ{-iqC3Dip_qX>oZ6}lF8 zfObvAB_+0y0SV>BvRB9M&A&n!$d9AUtiW7a&D+<|5L`;ZJH+OK-gAt2a_au~sBl=WJX@=YY!S84U0<8bMg6EqL;Ig-R0gHLLSSeicL7ZWpPkg0a`$*HdMvrwIgH^daV zQWJQ6x;&N`CBHpdaLJ&LZ}T{1|Nd!o${U$`^Ljyd!#u~3UMZ6jCf=$?;`I@BT!(&| z&V>IDC4VeJyvwJfK@>@Ldikc`jOTT;FBd9%;*$bS91+cPKZt6x`1EP;1M3m1-c@nlcw7!oo{L0n61yg_y54(K(DG=#do%zJSNsYCAjr{qmEC|nY2`VT z_ihjY9Mav)lDZ8%rS)NNJBW?T3+lgNs+Tz1CG3t}>w=6-%Y%I7tR)BiIY<(6W;YvD>8 zB{?HXbNrJ#*$eMtU^G>NnY?30%Ih zN}rejx1MB2{cJ?sQ6^E&UMUXJ{tmVI5$v8ou2l2yZ^z&TlaR0ggX)UE<{VtkqExO# zvFFk19*JsWR8%bWnnsBIJ*!uST};A_egdbAH+!!2?lxJv}S}I zU2kldTmn$$FgAiC<(FqEh{k`7Y8N3uErz8uK$4LVMFK(M=SQB3-aUf8dp4yZPel752NE+`*fPw_> zoGK?dDL@8pHshx2!$Q6m%83pr3Yk?6k@~5n%Ftn?z1k+q2B|S`wJuTv9Q?zfq?uK6 z+T@gVtY?lfU|q?EZWjp3)pcxR7;t+0Jrv1~&Fx_pGy*fBe}A_%JaqMeKs>2~!r>{O zs)~DPYvs~gF`DG8C;wzIBxU>WEg7p^nmDU}GqYUZZPX-f`=_^at;Fm`Zf7U{*o*pW zP4OHeobqGD%iP%y{D6cPWfZ7G^~rPLjI&=;B|;#n5DPvUC0x28=zJ17%8nq8;=^(> zBAb5^2D^~D!{<#3U=$vkNl@+Q^VB(!*i#Eo_z@1l0mrLIDN?(Lch@{2={n07A@!~f zBNw~>VT&-D`-WFMFwzhagP3+V&m&*tt4u%49pqZJTk?Ar7N5M!CK4GHmDJM0ujI`y z9B6KC4!v}Zr={cV&}oC&oh-F-U9FiIhqAml`1fXOauhj=ii<6Ng`%*Vyk5z}%8NWL zSTtsS{)w=|zC;GQp+Uph%X9PN<`lr?KYFGv!zvI^)SvIE?f+tte#1xzaw_}N{ha$`Ldvz+X{A!jb_>>ZrHZ{cdd57i_l%pb2flEcJGzNac}CIq{fCZO z5bsThPG(UNAaD0Hb!THJa@&%PIqCM`vr6I+#63u8h%< zP*X!gcjA6@FuP(YYpQG1tQPDeWV_s%_sFvi0nyai0o-9Y>xT?n5Vc4&R5)0G?D*|O zZIijK-UI@n@ zz}!V!AX&Gm!+bqWPnFTs%dqpO0VkJ4q=f4egl9pYTDzqtsgQfjzrt4f8K~_Aif3fT zMusRpZH6QyEw^c#Jj9g@q0-Qb5H4J|xdefC|85r{UU9H>b1l<_T&)>dj;Ix z#Tp3JP~t_kZv~=;vYSNGA8jE!qi1SKI!aMJNgt2&$QMKWqrXSF1W53Y@N}{lzGbwjCtf6d_wX63oW@+#Y{bfBa?}Sni7atl7{rFqel?)A&32oJCqf?k|cGVC~nle!Ty`b zWS9&;cXtP>1 zZs>2Nu=JTskE9gK5R?S0dmZ)KPjPVl>1fFlWDsW(s65ea)S$~$`mc_GVJ}sP$PX}e zE)#rrVj}mW=bMnC(TW?Nd%4&0(4+KwIHqD1pnFP~W;lKC5Vo5EY z?#`7z?fPjL9NoztF1LQaI$bkfl1wBCQuA`_ON$}kn0=hha~kY8n>|YKS=d?r-x&l^ zodXmked{`p_r1QpT}&$}k%mEP40J#=G@oJ}m)!gZS&kK{2+U-5L&3qp@;oG|2X0>< zyA->?Og5~={EIBk|JrJs!0{Fwk&E_czW>BOcIw*tX5s0+ZDa8I{2ksO!C@t;zdR6G!;ABfA&FUQXR zdeoPE>gtKyuBiX3Uf)DLNxHQ@PVfB2Pk_+6=10X2K=a18#!smuALd~nJ#e|)VKc3N zbA32h{v)SeE=`Ujoeuwu92JZ`SL@6?WbR^8YsWmG?OsGac|OI!C+{uY4960G*#1O5 zGpTKF2lkJU@c+WydFfyCfjcWUdZWfo_l8e5FNb|8=F&pnsTLkKUOCa-kQO~w`oE@D z6vOeveI5FYC!HE{8oc(Z6D!cvsqD^!Azl!d!)Hr8hDE`50~u8v=X|6yx@7n7BC-uzldgtoaEiT1u7&etkN$;2UAI*hVa|3&?`sxw+ z3^oLT1}d@dT2-ilKwrW>)ACzlR5?WD!*5zFd}05GYJ9>Vbs51{IXg%Y8%?b@lYJ+Y zp%{oobj*l?k~!?`B5K)OQ%8#KH9b0-qmehrk9q0#UBgXw5p&??<($FTDknk6y`9u& zB&kU!$(4VvR66j>0G5g`>z5f7B|G$kvyeQQG)=gHN$t>BKKPB$t3Apfc`j7S%9^jq z7e}D^{<&xl9h;|L!BAQ}_LunqR`WS8{r&#@+4wVmCYVqP&F?{hmoTUjH5$KB3r?2N zA(U0JkozJt)k5>Jb@7uvN)*CZAit7?IfMfBctu9CjW$Xw&{TFY9uYZ>>u)VkRK8oX zBopDtPl2n|NcXkS!Wl$-_pPx-FZ%M(pYjK0k336lr%t%gUs4~rh1sIaMSbe8Z|>`> zRP~Gl;e@`NV}?`v{KMHKOwBU>oxs8e1vhwe=g|^ptLzK`VsvemQX}VvV@(L%8e?~ZT0^^eW=ws#Vml} z^FK_#CTy*MBH*dsZneF2P%q%+-m>*#h-Ev9AwTh3=L2e=x(xfiD*p!j?mg_&jBEan zHJ8iJfrU81O4Y|OA9E5aVWh6}jMhg1j7FGPVhiRTYA6yuS@Ss+;Y9l5GyKoR1FcpgUMe1x0C%44)iQ(z>&T;cv z`p8Hhfj~ODAv1i!dH#Awug?hkZmvuGr7O%IElH`aaRKv<5B5gkS{(eT@D6yV<)N{i z$^XCOB&b6j&Vaw*=0KnOISrlKkrtIf<=Q;G*PFP_L-wEmxn`XvMnj?|ZJU&~>kTo^OwUNa)sT%J8u^ zNWpQD$vHU;#sQa7Av`w#P!J5BBf0h_LdFV|BX`OaY3n|Z#;@86ipcMM=lv$O9JD0~ zh-7cwYe(GIqbc-zq>Vz@WGy9yCYLH^ywhjxmc88NaP>YvnlAtN-K$+0T5qY0MtJ-h z?zD*5u9}T=@S5Wgpt(!R6MZrlef+s{wTW2nh9vmoK&VEXZ5HO4f|EsS!{1OOsFg6M zCQ;-b{P2KSInetJ7Ca{ts-3D+w~3y*ms{FaMn-pvKrEc&=l=yd!NQyh&le`BLTFpY z4o@wOeQU(?%Dffa7i-+A1Bx+;skpdCNpL@Q>+EfRTuntl3;5`;kYUIzflT{M6#* zOvq>FnBvx$HlW~!szwiwTN*O?gSR<%iaJ%l$gHtx%6J;{zyC5o3T`ujv>g4U`tV(> zMRra(t>ZO*tdGJ0DaBQ2O1a~^2sQakil#o}F19ubh9UNOL+NFH0T8fj7!y>heO+_?}Kuj#cCoVq+pd` zjcB3 zShMTT0p1FU6Q||`-{ZjxKt-C&-Et*}KO`Emb(?fzW+oN|M&4Hl)#aOn&Zv7Dd3@b{ zKoaBr)4!XCKWb~5wsD6-t-)*R^*hswBMDMSl7LhgSSb5G5toKLB>X^0MG)plbK9Glb_%mpyDF^oSQe zrcMQwC<&G+Yc8^y@oM0?5q5F6nJ^4XBf~p$gINg%x{)Z*^$xZWZI~Dt!JuYjyy6Ml zr5uOO3OiX093P^>{1K--ho8rMyd^XwIH&cn^cu;cq9OwYDz&43foPyXeu>#~RSE(u z?i70EsmG{Tg{5YPj2QN|_e;Zv$Lz7YB6YC2198+WxIxaxivs99E7LhH|Gnvc%5eWA zaom(ydmSvb>aUK6&)X1-sCOE8~2GD z`(K&)*pB#cbx;xB1pn}a@u{F0H~|ZtP$Zr~>u2M5K6NYSI(-44dU+!v!9_avV#B;8 z-Y9lYXT{?ss;A_3M@}%Unm9mST0+zL>W)S@{ds-IUpjkTNS#E6$`13sAbaZoXC#uy5P2LHYG)ubOD% zHl~Kj04PmHm{7GD1ds}mI+6YXZ#=agO0Re-;|b0Z3wyFUMx zMp=hbp)7J7$klIA;>IiP&ajp!9z`ZJ@APe5Nb!_t_-s|mO$#BOt385|lPHa+Ww+Y( z2Rvqw-`BFSvX~8Xa#V$AH$VnJiTZ6)Qd2STM|?9mb?(;3v*_a;2x-p^Zw12FhchdQKw{MC(TKIjP8M8hD{0$FiwJ zzT5J`YCRx%K#07RPmo#iS*wN*&%#)5Bp?d?#s!G2rK!JomU~?SbaL)*&M9pl;+oJ+ zQ>XsMrbN*2M`ubzROiNa?G99$X76#dpY;ult{|H|2cVFcBVCs8M-YO=d!;&P?+j6M zYRB#UMMZANkR|Kt;ve45r=;9JGpdD>al^++%_rDich=3O9YwwJbP6l^m~Hn z!+`D$YzUzVvR9~q@A+@+VQLTHp76ogp1?BwTGE%e1P$2~LXG`&OTUVgx$bX8zS*_P^lBuVWZ;G(VqWFNl! zP36@~ooWS=w|XJOo;!v!JfL93@t3pTDWwu8(4blt8hjQ#G1N^>{Qb}gDFnv|v>`^F zrAJGfx75@GURAE#>$T{V^nBvC7Y?8JA>g|tS6s(sM0b#$&$pka+l1NhND}8Hsfp-I zn{I0aU+Q$}TWh%16F7t48F8VsIdgp^qN#-{l3*F0cR@EnG7Lzz{mR38cBC}$oaF(L z^EBzvsw~@t*|)YZK}J5OtUgi%Vv3cA4|w$n;*z82frvuB`|(1U25jocW~x^#1r^0R zI)!7QPaQTW!tI+^)6X)K9^iz3T`{q%J z1bb&Vk}aL^jTLb2Ck4os;kl`bqC{js)4Gt|95+T8ZNGJ2HnHj^olkRT;6FoP|RMU)h@k{L_@RMQ*ez~!GpbDQs_~mK-NA(AGUrET>AN56s zIxbHZ&qNyo%4ZoLN9%sr{mFdbFhL;Cf;-{F@)d^CY$^>2vpy5qaLT?_9(BjY}9X!n6;L zYok8~-Fj!H5xUMh6Pp|WJ{_T-J{?FId?>H|kJIa2!JtX2@MEfLaqGHmUilgX?$l)* zatwnGo0dCC!K(`tk2_l(n~Q^V`-?B-A?Bf=c%d79#iftZZ-LSdG!8E_anI@kG#pvO zl{FZItaZ@EVbD!Niu3(G3?ptoTzFlfi3>ZCV8w29Z*GI#@VGCtR@ZAqy}k*)VFcsc zMjOa-D*}m0NFZHp$EM(-*`#C00}C^uYi^i*Lhd(Txi`vQVvKN5JBLs@n=-5Fy2Q`l zwHomH^EpfsI5zgVv;$5Xr1#|HgFebiO0Up2>|3rj+~C?rReaY|-d#Uq)xTgl*H7N8 zT91EbP=jgOcfJHvOd=B}@XTXd^c=3$wTS>63@)a;k-S^N{tKwPR^0I9EOdg+?`=z} z1_Eb?3`&rtxx{Xtqb;W>agsjx)c7=&3LN=tC`}ImGu{jE_CGiUeD?Ed&>But8b`bb}7&{{8gEamE4M) z>)cdZ*p^Ju^nyCfr71It84s+FC_0`@9FgpSFyf4R5FF31ZuPdVR*s&B1QelsMIq%%zfYt5UOFEqO5?j5B>?dF*e@Q$H9>i5u`%b z%LhB6-ra!NUcm6uFpiX@TOU<_5f-PW38=zBgliMZx5o|le*WERNF>H;d1T}x0k5+e zlP4ldejQe^CP>t3pU=+bY|gi6J73i@@Ah23T%KSX;?G>jA4fUalg4zD(b%05&06cD??KFTIF=oOPk5WPfPS*J{55Tkv&Pj6(#P#OH-9)QcyeE z-qdZoxWorl^$4I15PKdFaRl11zQGU7LihqyLW5tFPMth&KdBXx+qeG2vUgU6EKP)BMx3)EpkKrg>dIn!X>fUE4oY0HGm;y4t<^*%~@k=a>Cp;>91+;<6- zPI)#+WB-PHXEZzNY(123KTfNPhmleH9RW5m^}`1u>Lg@L!a44_i-~_9C+-)?Z8V)voeB=vi?gh@fzrcX)6GW{Un zwgaDJcuMxg4K(E=SLTwUaDDH98tlzg-VYM)60ofzA0FcV2)xg+3zJv%-8n??-}Iv( zyHhr-kl}Q1t0DTCz%2(4 zyCOmJffMT;r?Igy&-1+72RupkM~BE*=0zxg@`95@Z573}=&IVKh61GkY`gvRv-UTh z+)A5Yd&}WFoN+g0Xsc{UAXgKr+LLPKc!SO)n{R0a+?=8u26<(|1a5E<(#GaKcV%Vf z`V+Y*gbMAMnqiQPX?VZg>{m}y-)bjC8l(j5f+{5#LuPa7>la$PU3gh-&i)*mL)_5* z?$;8-`o@&_TLoyac@wafh0x;5MFa`Buhsq2u# z@k~5=2+EC%89U&31=o8mf;O>x0h7W+d!XJ z{SVHeNWSM(L+42o`yP%%AeUXzo{D#x5m-}D9)NSSr(?e~rb~8pCrk?Ph4mQn0?X&unaIhl)11bZ1Y3YE^vku1%0#wdK=&yzs}Fom!6Yq$Gy> zfR2{)f@3eHh%gfMSY^e|65BYYK!S*vSZ|hO6c(1D%bxR;j)KCYMm?`IJq%WK^>w?9 zltfB)Kk~VODzmW<46G?1%$Vxd9!cv_^Z=b4-%G|7o7;+~1vGiE8R?;P+9o|WCWC&bIOEs>2f1+wAw-yj@qbAFHD#Ma?=X$K+t!aWY>v1>jk~> zn}v#l#?7v$YiWWQf7AGc$#!}(qj8{?Z)~KE6I-%7@UX?qChy@3^Bqo>6)Oj`r%R%S z-?-m`Nm(y9EC$X$1UdD80uJm5JK&KBuYZN)b|1WXx%M$mN7)47tuK%h;64efpEOo& z5jgKY#=&aa>Um}w)_oXF8!jv{ZL&*BtXml@Y251jG6=4 z?~MkEZMy+-OKzPDIf0wYtGRLmgd6xxwMY*N?>Q&O44w<&x??9*F><&1Sb|DzE%1=f`A%(4OK#`5VHIV*74G6kSRY53?eFCh zuBc6?v7oh@xqU^FXU!>^*LPWQ`wn;6QV8AP72V6HYJikZSq z)7geS6h65FFCgg68(p>@QpfczZX+)+zLk50QdLypFa7X2Z2MQN=oR5R>xWO|ZV|m; zH5X|#iQT4u6*()@pQ|wdp9(c-gh90VT!U+0 zcanQQfJQ_Wfa0S9YIn)(wVcb^?>chTqZ5E@vqBO?IqSbzFz*f@kPOU1n)Y>QFB2AO z8}y$SfhPU=a8jzLq-QKj1sW1Pre!LDe0tYil~O`9hEkfCz?{%?mPn{a;|~6`37_(w zeTAU+OjCh`fnLL|kIGhi+;>G*_V{eD`=+n5E*9<{ZJP+{&9acH;Nf8|tv zmQy0eti>sgp2A=DzTGK%6Upsqj|(KO+X`jQhJ;~8i<d7^udS`y>F4L(_FdsF%WaZN=Gy5ghy5lkYpGis!zhMHCPP8_-Ucgp*N6 z0T0QmsC!*1^u9vJ3wbqLq)jedG1{(AYTCp|G1ZCua9#kBe#==b!Pj#&48k3g4!yLw zUmm3IO&X0ckVn7~2tdG~b3^^P-P2(j^<6*C0x2VVi_tax`bq;vo4+~mDSyrch} z;TUfm3Ui}eC=jvZavjZ*v~ydoN@M}L<*HKz7y&hwL5*}gK&XwJ%M&aXWwiN8)iSY0 zRs}rMsQ+Z{9B6$pJ=31B=#tcg9UHNE*hL&yyX2{{?Yxi2|tD?0m|9)J?w1 znZU%v6kAx@%v-Uu2#cp)mS6?R&rNv*307ChsITX(EfJ|Do+)cCvs45Cq+W9gvfsiC zWEnU_H4U``vAkXA3^1ET$dgEI25z&#Bp&PP4Sg;=T0|1>))K6;&RN~YEiF|z&~{zJ z_kpPe{==LQ8m2(Q@c=H_#>2_a*AA%yK(B40!lt@YrAAi`g9-w)y-%uQp)|2WDGoW~ zW-o6dpOw44uH4_2waC1>OxRroI_t)ASWNX8?_SQ*$I=>(W__|R;}o8@nCvGSa%^0G zCkF5~FG|u`PnZSyJkM3zvBIU^jQwtLg~EHMZ}Hl@4aP;D;``+gB_6}CK1`6;o9nA+ zbBi08?hXy+R< z&}_T@8-pFb954wk#_I(fC4!soRGv1UA5*^$2keg5i|>vJo6fYDEGCPcXGAm;VDS3m zi+S%K41R{+HvK4>0J{ zvZHL@T3n=4o5gF7&$`;Zow8JC#z_hbUKx2IR2HX;b+V7YYBHvLHSwS{#cN}~j29kLSPv74;JiGu>T#}z zc4xa0aY=Y_f~er|qjBkd7goD(?~-d$!NooUldDd$9ifRn!a;mu>M9+T907T``saaO zjvzEw;(c`&uWi=dk%oRaCUpZl5T#r1T8}`n?>0a-51`vbNW}R}E)K(*L9E@)H-ilo z8ZdIZ3A4FP>h`aj%rFv}Vo!^xq7U7QWWk7~pTs)2Pdv|2yBcrP-0d|WWpFL0O44hb6ps?*;_(v4on3#k&Hc?JT z8pZMcMK?{3%X%#69QvgZg^iIYq@YWvi)9^c#tq`lf#{AahUgB+vZj-gHU zM%{T%?nW62(lPYMd2H-4b`d)V_YF?%B7Y75=AuI)>J}ALRZ&YkyF0=YZpzIWZEk56 zK6mHPz<;>6nlM2@z<{|w_T61+#MP9MU_H(^!n2%0q!zGmZ?uRxcYr88wWB?@@n}VvDN}Z{j<~^;na4%NZgb?B|J}*X)3}k&#CHMkM~x>j zb&GoQn?ZY;q+agD0`Jy*VLH2shf;`~ZwDp@SXJ5PqRltr)z;_4!{SoC++X=idU-e` zy6=?|i*@euF^Ml;iA{+WM&Qos@So_!C*^!))=^J`oa7~7S#Tyb(^&N4uV2h9MXhJ= z#v>5jeb-@vD9O%A)g84&s53-O^zQF7$5vCTm|2>|*a%kCza)__y3FWOcgigcOQl)j zHE+zaV3Bt=GEj~pxSKm)^B8y$EusFdL(9e0C0pxee6|~``&mfC(`)iXLM6TXLk;$6 zg5-9e*PXY}T{@vZ}=DJUb|v$kFF*1S!|wteVXH1ZM*7zHD)P zr3X5iGCOE;UVOtqo)Nl<8$ zzlxJFqy}U0cDf$yuv~1D=RvioSw7=55;HSakAZoxv5E_{4Hr%;^d{shTG0#=Y}6NM zpQ-B+=5;EX)}oB870o*f7IL%a@XG@f&gqq!;P5sfS8+nUrNhtlKDgT-Fo8`%XD#7Bb8%F6P^_*2L$wKsItsdN$AbhXs}nI>$UBKbeY+;P9A#N2RqXiYj(g zt}yMxGYhO|Zm5KOpK?Qdd>mL+87R$T)Vp{T;bd&Lf`DY z5^@!<1arPhHn!RUDMUw5t~#b}fT|NFRxtLP7(fA)uzu;y+YlU{2>7sTy5?;9K&_8VP@?#`MIVb8xE- zH0kmd?kT$=B{iEk`r?fq&#`x<;rX+MW@jGNe4^XK+?+4oA@P|NYm;%DJr*E#BUeq8 z47H%p2~=hWc9gyt@zA(18I1F8B8z6VRR+1Op;D_DR73Q!6p+JoiI${L`?6kVg zp6%Rd#(}9mG_G}aaJWa;>keytVZ{--?BpZxXmmST3^ZoVo}DE;E)@))Blmp+c!$Oo z%8XL3+SJDky>5bU*Nd%=Qj8S~##%GfI#_AcpJpj?lm%2wa$c0qZJC*vrJg;F7x-zXHPiMz z^*VdIH3)sz)r>L2#SGWG^T7Q1 zlbtq>v+Cb#uFP@MR~@dmzpplJ-*Nddk`0GJp9$!7?JN?NMk$NVHFIcGBEa1b?txDV z?7Ur@=iRoMSk4dIizFP@$F?DMjmYszKe=f}xwQDTP3#*T;M!JL*X!&qXl?KZk1w$v zRD0xOozhX~T+Pf}0+%Q=Doq1$=Wo#|j@*5H!j-I1BvwAZuCnrZxpMg}LS$nH4%wwo zJY{0R6>ipKwAp?VDm6lV)fnvp{4%0myy@ZtJP>n@KCd0`(Zn}jPnL14(5^gSulYd1 z+(sS6k=c9u_}Fk`iy@wuObUj=mDt0gFSJ(%gemei&)Pxc^>;3+utaqVSuK7(1&2Pr zD2dD2hX(7x9%5p~gu27WNS$939&Y(KoWG@#;+zUHIw&VHVQlS&*5QrI%z5IJrymdYs4gd?8}rO%n~8;r7l&#@xMa&U$LxWIHOA?Q1?CVOLTvXTTM);wd{bk6jaaNH z$?I(R$ZAvmk+tur@f=i|Fg-_xXVx$)1++d0|y0iD=>_}X4hi!?m83MsW;g2#q@CdwQ1AugA1t}f&GMkj8H(HyU| z3L%)$#sg~{WL>3R*fkh+6}fvsM#Qrdx*cb@H<|E4qAgvD9Ic;xf6(V&ys$LF79>`^ zFWs;`n?b!1C=_=4;Dj46I;vfhzmomT_H5EKzD%b+h(piR-ZR2-WI3G|?LtGjTKiQ6 z3j4Iw`$izKjobDtG~uUR^ust}Ie}&62r5i2G_}_c;PaO&(`0eJG!;P8m~^J$p!b#N+?ucB-3qd{kq-2j zL}xt9(}>(oMAeI*bC0M8FgUGZqNQ!q29Vb?t#Uwu1za_a_hU1k)A2NEO9xK0`xb&n z6w4W8&bF*@i+z--O>LFDVi*Q6qq}e03x+}`$9x^ZcH=}%eL7DH(UZGoZu=*|YG+&d z;AgB-;BxY8ktIzxcT2ImCRIKKSxqW8>cv&U1*$&MAItw2FR1)Joq9nQSjJ7suX~9} z0es4)pq4Fy(y~u%LTmIO-r_jg<_j+l83w#R4Su%kA=L^hy41wcHWA2Zw|L15$NNM* z(_IVpC{7Y+c$dGc{87cnz8q8&yh8RJs2c z4j&mN5?SCA7DFFV6@8hxh!C`oMuH8?4i$Q{&@SNQuC{e@W) z-yQ%MF-0)mNF|DX&}OvARE}Q7@1Yt5%a$qJ1j`Hqt7@v{r8oSp6FjD#d&%F(e6C4qQB_pr8gU${64 zd8hJ=x1UEVg_RA2J)3N!bi74a)@L76=f7FYTsVI98RiEr{ihd_H$Dtr^;jlr-Cw}a zxG^z>O)pHS8X4Hmn!Gud`-Z#r;K;Kj-9{D{)u@#RLhyvgN$|}Ju9~6iKSt&DPmol; zy?GLili>+vLjKPke6P?7EpgqvW=s-@AYY_zHA)Jjn@M#;Pz2@Jhd6-h`jZe^J-i{Da$6S5a`)%moiujc^XMeKpk8=B$iaZjtqH#aP( zw9`hv?;Ws#SE9?UFdIPQElO)m(T^W*DhARkA|mIZcS)E<0ZGvPVV;b(yW6RW8YAWg zpAPa&U2F&P9or&2htOB55M_HiwTZsB+djVFg0SAJapqq{!XH>6JkJ}2EHLgP%}5OD z`Q_^*hm8JIR$ZOTEu*^g7`Lpdobd?u$=X*Qj&c=8Rd%LgYnKj z1nie`JwpsQd%;M%ce;zyR6=e}O5rNpLi{@7+}MLFZb`U1v30mU~mVrR-b<1AFc?_rzw(nL}fDsDtP zi1pE_vk{|h&(LN@%ghYX@67oR@%VEshBJX>sHj7v*cqYQLv6-N4elW(Po3XqpRt&? zyxetYiCEVZjK0co%`ZlNR_)f&%w^lC=8Eeg?Cuh{$nMp@+iXvtLO(AcU2AJzLECY(X zqgCdd9VojlkHzhRw5$st^;Qy`5lWoHp*~ z+WzDq*DRK1kE7%C4fJ13Qg{hj4a4k8VkGpG1`!w4^yg2;immhaMP!qAe_nLLPWAX&&)GLqXAl)y1+LLbTN; zQ)&J?z5HQ5fIlN!m}Z)6z{tXXy}5Gi6H1oxdXSLK+wUkW)PLOcb}Yo|n)*Z9S;0Wx zR&*paZ||DybP83H$WPrW`1EQtlV8?Ue5(JTk+3wvC9sFO<(($5n*o8LxG?)VLs6yzNKG2mP96mb(U)X2MGPP5nt&6 z*gx|920&t06f|_`pL@tW2P|qzxzBNwnPO|N#PH%R z{HOSa7RmmNY5(KfVJ~PV0Qp+Ov6aTXl;24G6E6@+^uCI4REH=iPSG&>sIWdhj1bmC zM9I4Jh>VF~>i9VGo%-|$(=&GlDBS%MMgMiOfAJZ-pD@Ma2<2RdWx1l|3?F$bbD!Ul z<_~iAKaTa!UwlHoa7`$8(36)vW+VI)-T&QT{kRT3_J;~kCP#zy$W88l`str8);mBJ z@eP3AXOjEl&i(1K|8u=Cw_dlxJyd_1F^KEm*e|l^;7tDp?~la$zpomq78JI~IFEOC z0lvk2>jIj&->>b!A*>dreB&q16upeSx1WFMX05H*0k99Vv$9aHXBA%lZKC?iW!W<;tZiXVZXKR@wrj#keW%qf=+^nqj zg}J?)4($M>KMIvUGx7iRElV1#yG{=2ex1Ya_mF*l;@0!4Q70K9NLdf5uv-@%A*&==+$xxf| zZ?s!HUY;g2|MV+6`T#l^4q)`n2u^9S3^lsoKdKJ@^Q`p_kbY8IoLzuk#@F*41%qE; zDk#_txbMbfN5+BJT5B?!KSBuqVTJz&f56w=EBV+o02{O}QkwsChyH)B+{it+Vj+u$ z1vQ3p39`a4|BVs+mrL|o0XEIpGnXWhcjo;U_3eM(gJqNx9FgeANY;aMU%bDqF8n2H z3EyLiq0fs$R&>Dk?i?chw~6#G_sIu}a=CU^ElsW{_+@z~THdT8?k|xC=9YY`5n!?C z8xaI@lyq^h!u%qH(m=(10L1?x66wH) zc@Gs9#6@)DZ~UTM@dH%f0GdT0{!WvE`nxyxUncQi`2Jt7!y$kcM0rGpGP3-xGLQ0? zXqk^}8Rg>(z6yfA|6P;(<1boC9v-L*Fot(mJOsj;|2o|N?XBJxfDIXYPC?S53)?Jc zzd{#2KFrI$0rh<^#uuu5THMAlf8}OC1|86k?%^-3HX^DuASkhrKeiKL{SsMX;;=pX7BSTypR5?LmPzl#DC)>lKkGUaXCY6jJNa`FbSs_nsmXD8U4)#UD>7w zBLJh@AQ{x{(*}U&phQO8<`=5AF5iXx-?aN5NWM);I4aQ;YlLON#i?Nl7Ljb0cIO^c zFX=%Rn%r#gVXw@37 zlnNT7D>sTq0Z>gML%7f>M^#>#`80%abp8=05~baGk+}r&g*$CzR16c`rFvw6STsg@zsDV;xeZ6aJM~ay9XkZz$X$W-x`{Y z$NycDLczjE-uuE)J5Zhma(R;MK5+b*1M=?|`ZPZ=wM6fp+?@b?h~u^R`nxYxT2ptT z{}pdS%LV1^8K2jbgsV?2UUE$LU`}UZ7FnsYlbt&(b8`lgNp` zH(U!RdsTPND4p4;#WQ4RKCWwlRQ~B=?lmp zkUY*6>pX_`QG=c|UBcV9ST>P5YUI~{_uI`OO}YW5eXE(8EP3KJtnE06aW z4?u%rPzQWfil+2F!l_5@kZ0y@esi$&@iu-_RA>{+I9HfOIgA%?CT*8u>^BgCdJO%i zS@_ig&R_XPz4Ujh{#^KOf9YUq9e#>f<7e3R)XG~M+uGYIq*OetJE|zSD!pkHteuLe zG|ApwQ-K#Z(!0kK7u@dfIpJfA(uXI_m@Q~zY;pZ}riLN%$TIj2^sagzO~xS<~OB#c+_ znVu!3B8$ZaME+sSO@FAiLDgdf z=m6J_?tUxi{Cq)YbS16u-OlOiI5_n&x_~gmKS`U<-b2?jFtecCBwe2@7EU%tZYfQbkbFwZckfVmJkd^LyY1h^v9&pl65k^Xo*t7_7su zI*q5KAZ6lEY2r|+%%b+JW0XQdQudXj+HJnJst*O2dQpF_+FN=#`cX=$#iVRUO z05d(L=^u(MND#}>%+nwgr#7Hs%sITJ<4?o0)jB`ok4wi-=K zouPBVo^V}l@Rl!uV2ZyQmNxfYDR>A<9%sLLBUWPwscQy9xBniq+;Z^gUhoaEcYPZ_t`dAu^K;_j*sk}GR^E3_j1KA zRanNuz%cjNo|U}R#iw-;5z9<=+G$ZgJO7h3I-fyL1tJNiW?BhplIT!QC=IHKaF77C z!9xix66%H~`8dbx7xzLul2I@IBw>~{*(f_#G9mRfL8KKw!ITN1oVtnt5cM7U3|IJ@ zfwx8PQ;-8cqozpu=gbnx>BgrhJhl5Das)m@?A0$W!K2Dvj0Dxhc0S zouhMNN_vER4rT2l+FTW0#GuX8@@_*TzIx8`vR8g7Jo4JkRUZVZU=sVMO^QnFGh0uk zURy^tN*=}cempV#N(c~ja8*kP4U1*B#CVAsT0`AFdU9eR-H!!d2pm5{xLWi1WTW2n;v(M7Ln+fp`Un^rYzO~K6alKa=j*aH%h+38@?|5E;ay#Fg=*Y=f53V zh@+~*L&4T#mz8K2SCY_sqLEZAV*oHkuea+xI$MFPnIpE(R#OQwa``FW^^q*|^21d* zOCv=!Cn-2EyGqsFs5YL|r6pbhX1x*T3pE91- zhcAvRDnf<=7rslK=5D>Dz(MR89gtdUz|f`b>gU%9O>!!dW=OEC{DTqi7w^r%KhxO6 z`$*WZ30mW6d{WU{$tj`$8pIO{%;C;jK;ux5*JiGsEo^~%tgb>2Djs*e`ezc;Plo^J zzWn8XdeDR#lp4!&o53Q<{%=5Z2g^r7y%}hC5xru&0)jZ`coog9ZQ5OPw(pYEb4;$X z(rYF{^7H89yqb@J9?L6H_Gi})>s#AhQm*E%Q)n!}HvER5dfmusW#Wns+?1}?PW8cr z+Ie4J_UsFobwgJel$eZO&nxu|42B05@XjcxtU`aPQJs|3vCg?roZ}1fzE`aNgv0;o zGrbGsw}@n{@T{1WXKzdq$9o`iOX1X0*D{l;CF4~?R(qLCaR-r9tJ|y5U*Z#ti&FAF>spJ(1 ztMOv58tze@^|zO_6^3Jc6$O?b!A*05_JfTmhVCovi^`#O|C|JTjIfNhK~{4I+)QLl z{8QWwxO+XWK;0ktxIzmvf>BpTT^4gBRJa25Z;re*?LK}_35}!f%Hw zfYF7XyXScz=sOUD9W|KgBOtF=7W`P#%fw_zUo?*CTM76KO3e? zEJ!fwIJ50UovUjcf6q>WI~sL-@bq^ z5Z<)d4Gu9|}Cq7ig#5Hy9SF;&WX-5J7o1 z;LdugD5z_zAFGvDxNDA6!zX9q&8#eAV+%Bpb{qn0=41yXqD~gXwm?dU*&`#zgY=bt zUm2Ebd*|XpJV>3G7Lgn`58JH12+GkjTe)lLEMD8t7B9_{%C+i$_~tbGuK96#2gV2X zHn}eSHc~XQM@Z&wf?d|wOjoG`JCE?H1@5d47mhmpRM$S>riNcWeu^nQ{?L9Jb;9Do zh$@j5?cHS_UB!?Pk6om@_2O1H3$s&G>!;cl>coOM`~!ZM9?N(^^8+q;o8jej$P#S~ z!qNg$X=!1MRrSEi=N`_Zw*ut}oUDq1oK13rLTMr!!2>g=Ht-zxs|g<={PuylAAFhu zkh1`s{?)SUcv4|C$Jx`<6M=8jC=VQ(<7ANF<)+jaJ-Y zvbg0!y^NqnordpMl|zfRMK}cFVVBr1ZC~|<85=BT>~B0um3DUUDagsSUv&n@;6(K z?7bkH#$DsSfq~eYv*fukvX@S-d6dh(e$Y=i9u-ZYf2clQm=u;%C>m&f9c2~sy-yn3 z>vazN<4a1>C5$-c)|)7;r+t2gbCy=-v2qS1jUJ$OwN+S!Q;%08X9CS{(P*~bTTwg9 zs?Et^0U^{H1Cd2%54ZQ}X$*_aazvUQwb2}wQQl%VYDwV`&FW=RgsEn&?w|)d1Tuzg zE7PROGmPsgHwkr_*^+E{)iO1boD;>JDupl>y{f&$It|JxTDRd^E*HuQkyFQ_F^sQp zd7+=*5UAPq?i_V?zn)M zqJfkzQ{46*TFguRW|#wHX*(i{-2)tF-FGSg3L;s5S%JTKW)k+n`6%6=$lj+{$7T{Z z|C{Z8HI}+(=VF0*2(;hsbr=%Z+_;&YYMxwWT|}K!o2voETwlAFA7lTJRX~`3dSo?> z+7OL#kb4z%rqQJm-*GKMym!d+jLpWrcF4)YdTQ2*AyL4s28CkB$*1Pi5dU%T^?|=o zaDPHd3X}7qOD@pyn};_ z(sDIXnw2f8nP_(3c4c)CU*KzK%+mD+ml4nuHe!T2)xF|+89^xErvZw?09`wOrKw)+ zx{I!Qetj%RkG+-IP_fpOeYBdY#XR>)N}I3V*Vo+zyaK7$q+n%C3-P^k-_%{dZMhla zfIr`>ok8`q!bysWp`}iJo8-Oz|mq1dur;t4m(Z)_V~JO=(Ip3Z4nBx3C>L zkzHZHNVGTcnWVc$X|z0C&yv%L|NAM#_J=?WAi^;(b2z6UL6_5wq{H@5X8}nDhaEa~7jdDwbhHM^B}Go%(gsR?6ec%@J|p5Lo6Jdr?tQ0VZQ1 ziTSrE<$RQrwq0st;i@1w-=)gjA#7k;=~?UJbQCtQi?g!cAL-w%(y9S zd{c*b87@9U0)Qr@!vs_SbgsNS>HPjsoM2>(%(|Y#z4F2C;9U7}OB;p|f4U>f<9k{J zbcTY$LOv~vxl{d<>NB9A%6xerE8cXqlTC@Hn`+cq9Urk5L*=*mItQbxlkHtL$Kzhl z7T5izb3>p!m37JD+k`hz(u*9o7l*4xYu$VJg46I|4M?n}^(O*{rh=JjPIVG~w0l+5 zXANb#={whwyW;K5zE^`q8Bj{z;$;o*)J!B{DOhk9sH>fa20n`d%4_v;48QhdoSmA! zyf_AGX!SuM5Rl|1J83|q1sXLfjb+x}DQIaiaB$4p();L7r7b!pa){J|21R=L_8V7u z?ea=(hUVXNeFe$_3~P5$RiJO&i!%5?;i$8urRnL#LpvMLlQN>a)#wm>uD}w)8foKe0BfW`A$`c4SX^xBpproqFYn$n59ZN};2z$M%r@J8(_y`C_HkvYb(N z^{RS_Pou?}SF=aV^(&Z9NA?CL6dL9F+4DDXkPhBCfs^p}YgMwIjUMZ5>oG>xW@xYa z&hU`NCmZyVv8*FC- zP#o`qV)kr4w?)y3so3@Qi8<1%!o9?SgpA{C(;RVKr+PnH)7EIlIn|Dx{K;aOSzQ0U z+_{>B-1a;ZU1gtBDk>n(3Vs=Lf>_^PBSf-kZfX{8k#Zdo4X@Jk+3u>#?2z#3c;;Q5 zknlM+K}kJ6cIYkAo&0PguK>T)c<|XMQ4Q-k_Dqd?0s35AoJ>V4na4_#b?So73@YtW ze+6|`d5&@k_XcRi?wT(TcIQ;eCDGXV@Re1iXS^aNjyJTBi+OTmMg8i)F>u0i{rh_< z!`W_IPQTImr!L?d`%6f}Ty{ERT6goJXHnlQKlKnDk++*z%n#<}MQOY~>N|=`y%t$? z1u@c2EH?3CTj&{LKt?W{TOi36YHugiO?uYjbeSd%47{FLq#4G4xIM`ga;%e&0`ty$ z-Q7ee52gy~+S}WcwH@j(=rpR0y<*;Dy_{;ft=4jyF^Y_jPr^sj=4}1VLF8BFeS>MR zN$hl8n?`6+^;ElvbPA||Hs8j2tacF2K><06Yhg&eUZc)5*&Umj#01y2+!R|#07$uc zx?KZy-vt=|?OYkE#N+{A#F4+yb-L7p2u71lfu{`CK5{?8%06pIYVQsDlq{x3=W47# z75e)cb0r24Oq<<9ng@i_ER?YZu@z;bM&CFn=Dtfh z{#l3h$?|}~(9<$QvE;seuRFK$;76Z~(f1npe};9-;W({kDO9x`V;T>>q3Cx7Y)PZn zeBkJ;0X=lP2807P3bFvWtWB$v5G7!@R3B~izIam{)NLya26$}X_PpgTq-d$6CFgZA z9`4>=hsXIsF51I6m;g&1l))=Ng+?UXK@SDuj4UMokEwTzj=TN7hZ`r28#|5F*tTuk zYHZtf8atWTR%6?0)Y#U4();^c&+{s4}f^ zto!OZ;fzmBB{K2e!K9Xvb8%^DvMd`+tTqB&e?I27@>MNf(j1h9$J5td2jJm2^Fi=cyH*WuaE63kVa$ z{*3~#ifh|H>1P1b6!VQY<-t~>sKnMb2H}MtV>6Fas(Q3(&-fuhGhLSX=eVjnI>d=j zBsEpK8y4=XiOWR({OU5`MZNk(tq3bklSO<4G>qA zfD~|)la!Hjd`V3h_!-ajeT_V_O-|eCOMIt`KcjbDYj5qW4U3kE&VZ%`OryAgeVeiA z2@sPTH$2mtQw-=@*!S|IgQMa{fkPkV#yH=sCE10^uMIc(eaHF9wBn_!9iKU6LNOcP zWSe!Iz0S>9g1~HE@P@(X7EVaSk_SA&EokmHgW&Zy(-*|G6pE8sp~2CQY(|l~)jA}1 zEndeQh3hhof<4#=+Qj2QyW+6X5I?VvD;9^oaU!0Fx}O~XVOxIG8vOWAC-l^vp(+r- z)uaHFMJ&mx=PnRtQvo~n4C?4nmBKkNT4sMIlpw_{+kNov^#l09-@4j78kt!_ z@oucX5A4ly-2~!Cuewk3Fz+Ur6O}n^O80>}I#NZzgVY$@bSpr!arAEaDO}Dg|Ar*w ze{2b1jNe9PgV8mxk~q6x_Co1=xk_U&+WT7&o8mahF=Vn;3nzRJHu?$av0L8ms(qcY zJWjm^JjR+JXY`&%)e3WS2`5z(xK^>}G%geFe%o|9JgC${ngRXVT`O{ckX#*cl?To0 z(RE43b>P=ovYKxEL?&DNpf7`&KFPmtLNz!|g+D}!&xzKS!&0S7<(Y|O&B@tFB6&N( z)sL~wPw)9y?&~lv+m(lQmerT zJU88(4(G*M5vL)A#a30KfhrYX4#*X4{i=JwhFP1`oh4#zNYv_V!%=*^1`?Zn#_Oe^MNs-G%o%oDNmQUq;R&=^3Lx&>%dT}jszx%^` zWrEXCxc2q6jbMb=@!`DY?=OyelY?=K>wW^Al85p4vZjIS_Dek11q4AC zSME3G9F8H2Bun_chG7b2$3XQ(dE87NR!?wSKD^S| z4LZ~bPoW6BmPx~gedO9N-hGFaK71xOq&ogYNEu(O)Dx}YAkfi7%2z-Fm;v+KdCz1p zmVPpps%?cV-dvI^MB~(bFtyqYxN0W|JFtc$lx?Z{(MuFm>7>6 zPawK7DUR%B?^cUS0TC}qC^Ws2#Gpw^I9`$#&)A{h)AD+^gCx`|b~z~Ymw88i#xa$Q znD=fFnEiS~Vzx*E!(tg12Z3orivkPo;LqMRS$wviF;S`jy3k0gPK7$%)YeAV*0OiO zro=diD)s)(q4{S#=|`@#gryyGA1zj{`S2T!7maED?v@GNpEK zBzLB)HrLv9`+KL6G4ohd-HtL@UA--a#CSHoseeOpyKZiIxg@}Km*C@Z=zOsMGadpF zh!#5@|3p^h%|&4`0kP^4FepYxh{#IWc&?J%1jmfeMYDjw>UKV7zz0}3v%07jp+~4w zCJ5s<-_8c7P~^DtmJoNM5_boqZ&Y`(&qAGEzGwfRfF2H`t{(}pt@$M$f_05!tbU63 zWKs=iOMWU|J#h~fapz)_4h<-==Hh!=Kjb~cHq%0yN$t8Nt-Z;9r&`2mVlk`_arRaL z)V8YKuRBf!)v>Fi!;S6jp^drhpq&VKJzei_68`tEaedd%a`w8b&~xtPUz9(;$@%Eu zN?CEfaqYUntF^MJ#*iOd*B@fGdbGwuIBj8ZzczLUGD~~QMzPLAjaj9V)fk;X2jKl^ zw#~nH4&k)=(G#79AYJHAnc@tHR$(>+pkW1L8?IXujV{d4)t}=F9%{{n#@MCll0J~- zN)ANiU3TVeG@l`2doL}Bi7+l~-c~+L*Y|JqRX|)vdiO2Ly zzp9(Droi`7A9@|Yz3JEou>H-}(`*rczuG1~_v)&t;h*GtsCO75uub&7Kf?SnZ;*!x z_OSVYXfc1G3@ga_GCl`1F5CRM)#|VVkrNBpNp0SwMa#JJ|94>Yw-7Y2GZW3Pi)W=e zQ`+`N13I8#+`)hT5Vh__9=ZpvUQIdHSuSJ@U&eH}-7T;Ia~E|TBUkUIrlZ`mq_RxM zEoKNYySL~dJhY=|v9OL3vJ%fk7c7eB{2*e4lYvHRYVWs)-E9n?Mo++8j1dK;&>krp z_Mcbq=xIhPo;2#ix?06Ju=!VYZ|Z|tevp&kRyfRKvJsDr%s0`d8}n2+qGj0Tdvm!3aZN|HckOp>Cv(;!l``1#Mr(DVuN$bDwl|HetP=bu$ff0ps_>R| z+n8zu8zJV4BF*ShqWL#kJc1tQ^MGEqA7~4+9i569%_@I|!2DQkQj4RDW?Kw0nX9(Q z;H{d(`&TEPJ2XO@B?Duc?e8j_+=R-QZ59ZLC%lXyK`MN`3m}zOyj7z4?d)OOOg6+| z8!Q)ksGD=(CwAWESmkKN^D^H~Y!k*ni!LHfT)$e@BrNpacQ&5!ST1-pSlY!q&RFzf zS7!29d4n}cXCYYiBt5m~(t7$<$|mt*{QcG@LY7bA2v1U8Zkh5Y9$TfG z9jEvc%GPd=r{<8JC0)a2bZ%UJ4Dr2x|Fqxx<$jQUWx7^&1x!#V)!O8y@uP~@ z?b7pkGGS1w{^UWgCw}_OVJ)4+%A%(U%PnUke3q4-7?|b8CJ2ZXmLeVEO`x^+x%&KE zW0MI^U9LPV{qyn=?*Ze5rs&$IZJ>#VILYpM%tFhqqD!TXzx1NNxR1~E#gV8U)0z*N zL!}K%0|Hlv;m{&5i%aLU#dIH7O%_6MD@Zum7c*1M{t*VhAplH}W4UHavL(M9B7hZ- zCn2$b2jqlB%yl3}!R5?U$NxD;$XD$djfNlA_N z9COY*VgW^!1%5m(IaEtJp2?=_n5ok|Rp!-fEU+_c7ab>}CT3>gCQ=cuIpZ-Bi>1#% zG?j{&@*}lUt9is%Z&o%+mV?0~x#QDD5D7B?G?x25sA)m{;{J4A?iU3tI_~tD?j(@q z7+;`qiQMv@%IemFY@gJKY|{~#|1Ann)_OwsATp@!HG^^MT0IkQa3N9wDcvB79qVb- zKjos6Qa)6xK2R0qKD|5FQ+^vCOv_JJ zc!+vO&DxerG*)G#VM_z15CQzS?_?}8Irj=^_ExmDt_N+*3TkypYbbrZq(}A zJ-+2>^rM@QPEt*x_Ni=Mpd6?Z*}q%Ytq3h=Xa(B8AjL;o&hcS;#?bO?;6`M-igzx4 zA$r(Z$XabG5*UuWkK10km!j*UPU>BFrJNbxLIkM8C znEsYf>_HbXG6S2tu1PdoTa}ht630Z!xjt#3dDzzdNHHOYHdJOJ)uGE#l*3}mki$ds z)MJSaYQGqRb@bcBsG*61vRw##=1@v|<^b3Dp*dM9!I29&n#uAWeq`lG{KMFOIO6C4 zV>f_u$;tVd0V^|y>?L|CInfkttadKaspUnqm&cZ(7YpCLTl)Q3wEZTEVdXjzg{*bz zrf)&z`Z9sh-CiYmv3{iU!<5~~sp(gZS-h9!q3{rpnx*n(Fb3^3G=e>VYcdyk8&CrmLze zXWcVMnxN?D-6cQiNZ>L!S>?LAX#aY0kW)hstEtvIO+ATH>@4pk7lgA3aVFiz#V~P$ z*3uXDp6w+0*DbJ92~WXSp8mA#XcJD2R*{(r{NMNW3up@bkk7bIi(TGHOZHpfNGacZuK3g%?jL0IdUcoQuCQ+0oRGm0`~Y>*ULHM&&>|;&V;MJI`*`9 zw6)ZJ1TMhPf@WM?7MDh#3-#jkDmJ91esWfUdTmtFCkb_{Cgj|#@cyq##`$>4@e}wl7alZ(}2AU5>dQW*r8E%HDhClcDbG1O)@9R8&yZmtMgCQRVj;NVw4{nu#kSEhU=kBYG$*u&; zs|m}l4G>eSwZE%6ZM&XKmtc}1hVNA5)%RqG;3f!{p;PF}BWXJ=$o zpj8AxN$N0R{IIzM&_F2**^uIUSa-~-OdWZj@_ny|?UH0JWvyfUXYL!wzrFI&L6OP! z)A^z5(@%dSa^|~!h|9g>IR-DW-sAepYPdhE`G)`X9*UgUDtoqDU#+6D^75G`P0!zP zxg0XS_oF-8E|CnZKS8^(@!6a{e_e{Cg$ZFm7nPR+pg=un8;SA8%nC&_KFIP|0iZyQ zQNMes<7#ltw#4DCZJ%aBb4kh5Ez_s}jxRo9)NZgXAnUL7Vb*|D!`p~t^Ba&y7(FU+ zo)9!fVPaw;ky+ba23q)#M9@xnOej@9pjIw>3+pMXW&y(mh`zPF95L}yDwRk#tw5R{ zp{63WGx&He=%8c67h0_5uQ)Rs$t0R?z*uCe!ctvZ*h%DSt{JsETb9Qt=XgFc>kkC@ zc%bm3uH-jC$w^$bUKqeq)fEz;0}8ikDF%j3 z*uPgt7gDB;+E*@EMer{Dso9ILv45s6guu(gOb>qlPEJylVE-maCSrD|4q z+Q7d@L$sJ`1hD7o91y4leG{_JnX=o{?SzbRXN_B;)T9xMd&BWL%UWW6>q zb5w_!+RwI5dgc8N`P*Y454(rhmn&;<#~}ZXMhpm_<9`=`S{94 zH6{^Q_2LB29nMMXqE66*;zDXz9of=MCk zCe`G+9Fm_!(@9p@T@Ebb)P8HN$YDK-=xJ_ct{t4e@vr}h2s{$dE%lVSg}~+~s;65K z`x>1dm)9?GP!PI>Xo1$t_xC<9T?ORq48y?#|14rI)gpHDuE?3gcHcw@j5q3_D&2d|8KWKBhLE zzlbV0Z)9$A9g&dS>J}E{izD|27-Asf+*f(szpt!S8$Jmu)T*JPqRQ705_YD_&p{t` zl7I00WJ+9_XyV7-(M=m4&s;hb`>tD>w_(9|T}AXq96`?b2*$g}Cg@1M1Oq*EfM$%BTXg ztgwuUT_KOxV@)}N0%@M%_At`I2XOpesvj5_pzJ_u#d0nzDpIhwuXWh$1PTv#UUlC; zpTY0nqrf9SUXRhCDPS4>ZNKP}T7(uR9N6}Ol(iM71lAtu>*qay`$!kAvlj5iy7`%4OCSxox{No1#M)Cc7 zufar1>Ri~wFkCX6J|yTj+y(n?r~zSi@V;6ZX(S|Ya1epqE9h+qK4`kM7Xf&X$%RF@ zh{n(6`g|4~fN-!1jH6&4`!hL3bUbznx%wlAvl{G1mrJo5#AMDUBsiE%SuwM67Rtq~j-LT5f9#j}_T2D@yWmRUQZF${HG+3`N)^p3W zf|GBhv&v z7Di__9S=-$&b2-PzwnS0bqcn&_}z%(xqbPDUtw*0^r$)ufCs8h_+@GyP$$T#947;N zZ<805@azd431D@-z+ub|=s4XfSf-(Y0{3@`;Wt%fg;HYTNj#n_!ElC#bv}*~kaiZ9 zbuP{)z<8C0;AZ<0e|I{9lHM{34o!`Yhc_Y+^h%lIEw@;;#-B(oGwn!9USjtpSNe{Z zCT1a|LErsk>1Y1ZrkmKl(0gRD?95n0EBrmR$|$FE*KUM5Xb~Zos@C9d9J2X68XYmx zm$@>cIaGbb$sxkU7JB3XV&*vRbQ%;dOJ9*v`#ZxwUw@suzq>Sq6hw5tql86B|NgQKDqT}^Qz`K!L?z^Loj>Y23U2?oQ{92(v7Oe%5p#iZM11XN+FTO^0(ahk=#4W$3*(uev(;k$@#%I62X9tw_VpwODZ86)Z zRi3ysF#jlM5^XC_WMdw7hX-6C`*nuVfgkUq&ZP!6KehM3DVZ+jv404#3KweEOc-pqn8D*nZP&*#rX?~ zMHn?rpEwo%E{==9vxby~(95dYyiZfGOofi?2v8iMN2?`ZUvC?YSi%s0C zfm&>We0-tr5=?Ow+u$J-38E#`+kvHXhW{(jz#sZ}AnaIvnBe=uNDi_b`=}LIR{`J; zR2eFlfyP!L_OHMjHbsw*ZjzFcvsq(+eV#?;jxPb_pwO$!A^t63Q0>Kx?2>dEb;8x> zr}a~ddgw>ts;vB|0ZLqO5#dHdF)C|>hQx*~rq#f7Ukdz1fF#%*p;Xd3@o$Oza^ z@;n1klR6rDX*JTv)6s_Fn*q)54qR|83J8|eUXT}HMV`;fXTaYAayb!UYsxm~%e6v? z%QN+6a+!~qYil(Ifh+DtRnZK1nAy&Y8Xl??CnMTgp+c;{;t#BYsGz`{`4XZIa44vX z9ynkRDn**9YIH{!B-3)F2eVr0i5De8HTDc2;?>*mzGxLCzO9(of6L1X~l}xrLw|(k!`x? zkbDW?xBC9&S_a`IxrfvFxOB>jUsOhpPujOyTZCZhLUWTu#LKHok}f}Jv!r^uQHps> zVPRblt&1nBulb6YqUxYiI@#G(G22o!DQR@m6eeU(Wf6{F!dUnfl6=N-vOS7KHfZ z*-BZ5r0m0gPC>;6-&5iCF?sPY8=C4$UYcvpO1K#7QJ)VtOh%97c~JLl{7nA5)=2)C zK{FL$Q?{(ttA#8ug?ztat6mqmi^3}=etf7J>I66JzN|Di0rUpSq@zsbU8ZfxK&vE-=j}a`C;*TyfACGS=-9VtzmM_ynQX@$R6mS?@TJ}rvFrA`k^!3wRa2Wb4? z!*p+$98aw}9l&!#cBq& zGWMzAN36PS_kd(@yVos1Cs72Z4u#c3g~f(tx42&Dw%=(s%`JOVJXx>Q1!ub-V5y*% z3x8?`ikRlsI*ZrDhNN&0J9gTvoD^DPvBPhC?~es5c~;e(s%N|VP(-hR+(D_!c9ze; zaxczht19mD?_vHyZ9luMT8}%+;NL(M)ag$RDKj<)bh)pcY$k_eu?f02L6Ai$=4aya zaW=>?za5P^ZGY$D``b%$KG-=*uB5+b1n`z9u47`$R6qe1+yh0EGHn$6&O4&4SBCS& zrVdAo5rOQw_shKsa(it~c6QZyJrbVQ|4@F9JNS0XJ#gBn041zmRq6~J1v{vJl*wVY z&sVH&T>KU$N?1aK1bxui?s`!i76xslkx6paaWh%)0@V8{zZD3^`Apv@%JG&R3=OS@ z6}R~Tu{|*^#Oas3N1*mGi&r!A4$rop+vd+nzm(1P6Teph2iU3DEQVqms}*%Wo3}p- z1jt!4`qU4B-yr@ADFX24z(1F#=lhn->3S{=ZLU8ShatTDu<0p>Y{0O|;W21gK`VBo ztE+pAbw6LG1Ork+PsSgQZX_-!7*OyBAr>cDADRB^)Hoj2fr>o-JY0ltMix+kk(5Ck zm9=XS>sqsIuUxsDSxs*IH*5U}?pd_qGC!(AD{n=3MQ}K{Q)AJZv%9X+H#1bXjtWQJ zlQzOk>=P7HR*lOdA@pY|mB0snh>*Zz^uQz3?W+n4m3g)zOczwR9oJgynY^FwyjFWo ztjUtFE3Hz6v6)Pnbv&*hP%$y}x#vr5iZtH?M%bVr$mMtw|NP-xt=w(WGF8-EHPGxf zKmEbbod5wf5!Si?N@~gY=&HPp2-Zc|eOpDgbrVfcj$ou}nNizG=!l3>|d(#Fy zi8$29Zeq@a7w32*@6z zZhNDa5|Zg*V?rDw)SOW-3T4BB@*s80g{@Caraq@r6G6cl5t6}RZtyPt4$y9=zT zw{w2ptN1-+^x>dN!v(qqHKm=gH)FjU%@d#fK@a0KcW~5japL-Iv2SbYmxS*@tiO0m zot^o}dq|Q;ur}Jj6RkEd`h{P2y1!Dr?${{hyJuvpt7REN`%9HJgtEs^$Tx)eGV45Y zjmap=pndoS80R(m|K9E4Z}102PO@XhnIwt2s5+NX0HN76ZRxVbRgv0V#LLURA&K9A^A3yvHFwh#f&xj48G=-s zwfp>!`J0(jAvC$TWJqz01rtZ}uY|H+ZA{_E?N%O24|W7u^ufU7he}w!^{PY*yGEMj zY^fs%G|rXbW&byTx$~OqDYFqF($h`u$4CRd6FQ1&E+YhmKfIlK6IW_-Wda3h4%V18 z;WwU%B{*mSo^(u83$X~QrwmSGQ7^DstNVFcrz1kstMX@=EiDS<&MUJv#h~W|KG!$F z8o<0EUvRj})JIBw4iiG4`rSm7E;He3Y*wvIv+(0M)f4VJ&`|)wvH8T9Li>a5#?_?P z*_+1Fc4Gs>S1wPROv{or&y(KS+DMqZ^5=gIV_R6{3mqvkPc3jlV78bgX{RTo;`x5yEuuQ2>7)k=uz{tsj?>~SyP#1&}Q*}MUKRJuzr76_( zeRb?!j-Ku5An4hc17W*8opzVXO%hy3u~_`d3!!jm1Y-*e3#zlH!yNJsc9%W+A~iys z|C>2_V1jyHpKhK^WWyCPFzNOEHkb(5?Fc)s25~F_i>P?kXzXvdbIAqh;*w#v)>AtZ zs(6#dLPt=e;e=|3hlkY3gVfa>iW}rB5yxlN8+PnV$^{x-9>A5Ir{HBw75H;2q#wA;oNZ7J^HsPQpY3y7SWtg|G+8pM33&Ac;c%6(Supqu z-3Q)8BSSYXr&DRh3z1v!kKnH29&Dq&f>_@2gH`#?3S%>FB%?g;b<{n@Xkl=)@7zLm z%q~Lk62$1cua~%ByRD{}?c0ShwRn(*iz;e5q>eVhA+N}vuh+u?j%4>`iskARL!eMl z=wxd|tHNM3iPCA3-7L`h2Ds@k16*dC_bQ}>=2?6WVva&|UAKqg0m}VU zW0P52Dum$}x^BRAIgU@J$@vfBpfPx@oiVV>G-kjO5rFCe7b^tlKxa`vO}X#pm8jqg zX(-l*e*gaKZY=b#N$sM6fX`{P*fBsIvO;8c+8wvP`i#5K_Z#s{392Fi9T{pw8v;$jFz}UmB!Xu5 z&)D(VX~79{uOlt{d)=)3%srT7cxlK@FDRsoSu&2?briIT2sT+e?nrUn9-K%9C1iTA zig&K)-ry*w0PzcB-asg~My*)ACI#vh)5;muVze4Yg)bGLt@U5yTvN@Rd8Iq^EbkSn_c$Y42vjtrV|GL+(Q7>r zw0m{ZN%pbOrF9v0I)ZAiksOiue+AGnPUWGo`HiqW;tKRB9FFJw)SyaScbnAJQS5!{ z9In;^)LNOYDZfNYxOiV?FYw>>db;kP>WTSorqVzGU$W;1u zxhAKfB9#rL8We4%oGLZBTz#i3X$nL=z#Pqfl2W?rnv6iz4fHB%1gB%!wqJBE!5Rug zglN`B_%co$fB=FNHsAO16`c&>k~32R4zEvLC8SzN`=U`Ade&ZuS35_&g7FyfqNa=v z>H>#Bm4tN80C$N(Btlp@m;gKlin?OQ3D-bKV?K~|wZ)$zeu^(9!~GKD{d~@lGDO9Y z2L5+c*&EliAlcxnXQ@2p)o)1mo#s-10UOhMJqu0{;z%^JTvMimWGjG%gD!*(hjw*L z0QccNJc~E(;#bUBuk`OQpvYltDUd2zhm*2}XIP|dL`c_w8bX@yGRVcpyi8-U2wOaA zyuMk&L7=jj^zCQ!>K<3WenTDxwAu2ogecxn|1H|5^swR5pga&a5Q$6(v)e#0a?Z^$ zyU(NN!@qmw!5Ftb|Np^jF|*^LMKZ=W8iM-hqyl7uS9+|4GN4M zuA}{P!H1Y|l@kqE4bGX|(!#s`)n{_m!Bx{1GOk+AC9^q?+3lDEFqW=k_RzU>^AJby z5rp3q%iSZv4YWn20$5gOEUuay)B*lA_dL|G79ms5@l3moIvTM5G4c(_;O}n_dJBoV zogQUSB#Ujq&_iymR?NbwPN*ix$i4zSPrI>vQ6iZpIEZe!g+V@jD~&ZZaY!s!vb|SV zVtnrat>&2fv$c}vD2xufTxa7?vPrg2vn$iKE&O8Q_~Oyf$OuMu8ao{N1RjUAba+e? z>;GQ+Qxt&lFOo_vhi5Or8d8EM5QYp+R1xrZufb%mgMeD%`@MK=WyNkCxCbX@#6H48 z9u95O7Y=`noB>L5PN(a2CE@|xytFB&w(xFj9_+*wSEX;*8NM`xqkEry-`QzWJ*k$beiLCzu$7cRm%ij6}=FP15h*At=+ z0+Y=SR-tqA$_^}#CTa(@U*2CX4$T2L$wExO#u&%~za+)Q+0D!R=}1gSP5g&l`L^Aki!XCJ+3BDk7 zqoGa9d4iUi@LOw5SP(4rOUt}!T`n9dgvMpimdpa90#pRQtuzftD|AqHIcVvVGKC^M zw4gj4D9i{ki65E`yRS2vO5m5@qpb2&pid=?-C-~S$;#>dIiB!KL&A6yOI;x+p#Eiy z&2ic^Nr@7WGFL6=6^01f`yX1!TllKdgo#O!0 zc+fXR`N~_)M{#wpTL`=mByGY@0#{?X9@dCy!nlRN($i3cY4Oh^gbT6j9>KN_SAo>m zwlh2|o^oo^RmO;9(S9*+onAYmaVb+NOj&SpmSyYI!YO05-5zh=R8pt)?dTdT^J4l?|Py66IrcKvZ|I7ktDWj2dGY-lSW4fm(+ zJPL+)S92S#k!UccWlLOX&@UISsJL*l^}XY)i5e(5^hmnj-zwsNu6>X(ta&z>%|2O0$&8UO1AULgqi+#~*Muq&A{18xe74jenPC`5N)i`$FBBBP$ z%4|$<6?`ocqPPUcuP464ed+7^%3tdMTP<63tIZ(pzuma!mvrvjm#uK__L#}eaZS;( zD5#Aod6ZDBg&p6Tv#={^$*mUrjc+j%*-byPiYvHwZoXU<(p79UBngoI#V1=;{}vW? z7RZ0EYRFlsKY%yETD<7nrHQ@BNB=bBrjxb66jX(eUWOVF^%S+H^c*~c7D#MHtb6*sz@GxW*JFQ7}&u&E6n_SoiLQ@#Paewx7cbz_7lMRv1~D~mfo30)^JCMRZ2@_TH=a_`8}e6SV(xHu8uMJ2RHXRO&!TMWcM3j=yQ=sBzhUQ zosVvlHC8kxgP=^gO8$RH^K+&L2MO+}(rKU9Y_F~ffIxXl>O1wJ$8(Bf4kFUfT&ICq~0gz-KC!x+UnSeL;T$HnD)#!upJZ=Y? zhF-o{Dc7-ZsW%ryhXeOrnq68(=45&9l#327FZ&TI+89#wH+ekot*`HFFq6j85%?|S znUG5On;eYo-UnZ?(9zLFQ+CPoLy5zn=Hm+ioJthybz091zyWf}g_D&YS2k^J`IBT#62O40nx#>0edhgDh> z@!o>#Y3z9`?uWlbfIDvm7`o4V2z;+Tv3thka^*l_Oi>H#Wue zB}YIZ*f(Tx{*_?m_;@K&PbJh9sEr#q1m!)9En0?R2LOHHY(c;XIfG=pD+o(;edYL7ZZzgNq^{aUh|5S3sQbu(4E2PfV~DN04Y4uQ$am(qMmQK!ljnPBdhfV~sV;h(vgGyetrJN#z(>nj)bhBCUKKrY}M) z>$=bTmjtJ(G$UNFkp^-bk3a-%T`jJlT)@kaJEG~Fcxo8wE9SgReCuiB2^JRM5~vIG zlH?ec8{U0)(O303HYrZ zodH3lWghK>eAf@#5c=N1$n=5?6$XD3UKIX_G;QNCPDoFMSZIPGRpV&>AP2$%KX$_g zme2@_>LflC>ierzxObhZp;Kg4^y?-;**Zn#cpDlj=eU){jEA)-h>8fztnrhM3yepVN7FX=qiYtYB~^dV3j=4kAx{?!6m9G z=f%)s03d(ssrVLXN-G+hy%L`5U^0~pes{VD{#Bowx&Nt(!<=Z(+(K(Ea-xb@J8+57 ze|XLg&&oa8DsH3-2j4=vuCCkxBt&6`tB>K9pDx^f@p)0n_Y{jB$l+goE}9 zYN=w_uYut9SY(RxgeDaE5t&kv7%GpD$Xd{Sc$Q2iLs&t9Op#I7oZkfGSmOV$kH+{N z^q`}l82RMdA|mwLaSwJ%4#nI#8ds#lhlkOJicir?p%Du;k!=Kh8vrVlB@ZY@e7`P$ zEP^{im;5laQO0a-tNw;`Cj@DvX+gB6UG|7Z_4;V%g0j}yTLF$NR- zlf93@1FHB|`?-Qahf{>^h88e5jK*O^X_ix+d5WQgsH+^TO^86oTonXe{=6_zR&iAF z{Y+pPXoKqUO&<@U%X>n(m%3lC24F5l)4x<#5xn~?lGIgg@Q~3_64W;Fk58jp= zOi7EtL(k67pLdBdkma!lrm!iMP3ym+?*+i$v>&?lw?8NigC~J8R^BS%Q{Cm z(5UWyqD@|e$mdBui414p>2_%QhJ(dsyDrW5c3VL-Bb#Oi35?-Z-v8aAs;HPBCTC$0 z%26YLklZ}YJua$dLl!8l2$76Wc3^%iz-_^ZY@MbJ?tqBuQ=Y~QwojO*MTp`h7&sh_ z=7I_nI>5&-3q4kR*jZqeA;0r?1`#H7Z(; zKz8Wn0!@TiH5Qm`&n-_!XBo{rc{nLdY(zlaI{B5Xn|}j(RDux6e|Z=G?@vX%V|ld_ zs*{RmI0&LFa(&n`PFjCOM#DQ&5pKg@x#Qq<$}GwOX*J-WNfr!cXdrs7zFlH}eA<{= zM}nu2gYa$5bgX0sF;1NsSv+!fq?|}tZhbZ z6ZfKZr-c+6lY40jhAMuA(d8vcUv#R2>!?J<0h9>K-u@UAL+h7*F|41NShMk}sa16g zHa8I>O^?v`?otazs_Iv%#}1hY<_rGI^MgNVha)}2o)sArS@i#2ag*KdF&13@+B9%- zFeG$_ZN^WQL#w$lTa6RdpLedV zoOVkGHvj=0x4TW&Z5h=##Qx@XV!qGE<=Lovd(MZ-P^5|fX2$^j#P47Jz{4r1T5s%b z0as^&_J`w%nO#oR9aJ^MBazlI|0pQ^TF(60B>~)k{?0z~C-@T2bzK1HpOV+o(juyY zSoB4v34M7L`7IKuJ!l-r{v}0 zgRG1B(FDGHjlNa#O@c;P#y-OM3bCZ^7=2YUVYB|wlLuS8fw(fh9t4Fn@iNJEQ3!Nm zQCskMyfpB*oe?_%-Vt>D>u0(Wo#XQ?;TnYi5ARHs!FsOJ;K`iS+nL1z=FZK)5YL<( ziOBothwr`@k3KM}*-awzA4v%TVq;y)w$ydrb^;AMznKeYx0oX55x**=; z7o{t}J@;=t@UF)*&^tv%#Z4BDr3big-7ur_aWlnt%)$8;fq-}2;AwBqc%dl;*^vf3 ztIpI-^>u_i=Wl3kai~282>pNWF8d}D#V+)fo;Q!)#eHS7_7+h&G$Ex$S5#U(yOkX@ zU1g+YEQ6$vXO>9S*~CG*9H*Y0CuK2IoZBRhx19@m@s0#;I1cE^>*+kg#ZJm}VSBvFBcZ21f zW+UuYycDg&D~&X@)z8k49s!T*BaE^zZ$ro&=D3CUVrs@8gN<80AA#s^bxA53i7*lM zy#U$yPEWNqk3lrlrCI|dZO=322L>b!Mql-jWByaRF=4_S+S&-=KN}3v$btMdAUlOb zL#TvUZ&w7<$zI>`Wy;ym@xarA-NG|CGgQK;O7-9HMUE-gTeRXmBKS{h>DkDZTNq{r zyFEJ;sRIOK+X+w-j!|RA>*@!==3P1r`;unm2jaO$wK|0;5f|tcV1n|?Up-WWs{hJg ze?|PhwHY1(w~POq1QRJBX4Wqh2VGS;V3q&qJ6Wgcfs%$LnLzpobw>3*XM)VkrZO4B zLV~L{xVwX|x2H>fpNs@JO~gZ?{L>EZ^*Qd?;pAa|5M{-0-17=pU)sO5au5HHw6_kc z>TB191r{Na(p^fYba&UHLpr2Gx?4&RknZm8?nb(l?iP@4_$K=E-RJDR-*fhLzJI(} z%Q@GabBsBj@x*=K4>mb%tkPQ={KnZOXIIfr1!IzH%fV+w23abPP1;iWa3E^rK8dKR z1km>OaqjrZi;!R}q9bp_=+vQzP3p-gcOTEp@azE9P#lzsy(Mp2tn$pq4ToqO&P<*F zXb{QUD}^g#dgp9h@(trRYG5sAhN*b1W`CCED3+rPTC}gzx&mGAiK(c}5s3s{Js?z) z(gtIYXQrb9m0ceVOA;gMB>nA%qS3e~7@GGb(J=1GE|#_}Z@r}1$X10=9|;}iGHjEk zxdZwf>j~Ee<_9lAPIF0Q2sM%|Zy{jJOhgs=G`@QA-Ci-qDo;nt1v7Rx0mqD5IlNJy-9#)(yUZnqO|{(R{5m=ZCc|TSEkf__Z2@ zgUQ^_BUmk(sV!ISMlxN{E(4PP7NU!pi_1QFg`iil9`hQIP;Z38azIqyyly zxVgil_Ons$+m9Sd7Sxe$S-mjm@qCZhhP)V8p7J~=0V@3hM(?QEiC?oxNQWP0FDF?3 z4r*=vNHS2h1W>xPDyd%bm$H68n#hJ-0${=pfJQ{&l^QXWpaQboX!u8%pimu!s6Ade z1A{F1HvQw%7hV8|^J%!s@<)a5htU+XxV%H3jAESmPL~@1FJdP7_o*uUUu@H~wY5o= zvhwmS740Xdt~(*?%lWQ203bXwDu27l6i$0M!IaD6mGV(UL%5h=TE@^~ z-GPYq>Ig=~Rtt4|H((_5idmVPKy0LYpk8QBzxbm=J&@W+>9;{w6<+P|6|UJ{aV&Z$ z)8?MKt~AulVOZu{=7ON)Z|6&>$nGnio2xHbJm*6(7n9}mwx6!Ux6uSqUsn&)TkYa| zv6NoBhx(sRtdbjpd^aE+i;dZKU#Oilmm%FgPFU+%vtD(}Q_($CB?NFp4;q3A!;jp^cKv$$bPJC79U>ue3E1`*@5ED}g4wOxmNzkQhW8~NW#mrPJlPs9 zxQYOkt+HX>AMt~VvC2wa>Xn*Gj*^_tgVUj}K!E}rkUEa=qG>Xikc9=L{x3O8w3J&m zd`Q_FPh9;ojFeIBF4jH$nc03h7++9aI~F_e<)H_soWED2=t*x@6f(HTkx~tWON z8(E6}NF1$!4fmlerJtF_$Gpgc?#qz1J#j{v*G78Mm)APCR8a4yeZ^Fz0axwJI@AKbeb5@6cY$$e8WI;j%{t zMLOXBU?e|m@zhsyv(|V=Fw9EzI&*+38uwL#_X3EGi%Pb zfn|4g$TS^^6%St0m?QWa{HubMA0B7js01IiGnLdI;6#usH_#w9SOb{hR(+*CnNm0i z)E@ahF`JE;N^0c6LTPI1BvMgV)*X*xAr6R-Y8v?j3BOkO2rYKt*6o~0HK=~U%Dyt& zH%-cQ&{_&wPyE13=CQZ*xp`8LA~v(e?(eEG)c}cwVP^(2xMaSZNn2gjOD6D9LeX*H zvUo1aYQQ4l?^;HYe{-IaWuK@r{!skho_hdL(q~5qa8L2TK=OHzB`_|@36)ZmVtViGLEu!Yq~xEaCc?%Q6e)Xz?D8Ymk}k2 zu}z@$2afQYX}b4y1#kre{ML&cLA@EF`KaEt!$1*zhK-=C{dS)wHxJgJD&da<>*EO$ zINDoo!^Jzu3%YA-gz&dRk@@c#m+ZdL6(M6MqY|$H#1-4R zyZuInm;-%mB|wa8yW%G>f@X2BSI}aLQFDTy2|$wqIwYtXFUXn!Oo6Qy@vjkQ{)%<; zG}3b!Z2rKR-hRsZ1vWA8z;ZKBvfz?&d>k6vza)xO6)*lL5Kd(hz zcm>IB*{CS(xVw0elC(Y}>)hc$Ffa-C6?5ri$EYArFU#un*~`^_vyk zbqLI#e1RuJR)w^)j}z$$<)u9C3P{^;F;HC@RCMe#S^0cm_v)8%7HTme=f^QUYV{{9 zsv%mtKX$Sf)+7U;Bx0h{>woRfpicWL> z$&<(*2|l2jW&{R25;I`(W=ok*d6y9o<|_Ly>$oPg%_T@em&6#107)~5$uR>}`u%V4 z%;|Cml1tr*t!CYQ4u~I&act%tdwMXn>nI|ejAFp$64BKMv)#Ql49#h8*7uI2fFg3Y zO=JQF$l6d*)!d7B;+qs^bq=wOGrWy)FOGb7hVd+CF}DYq!AUEXF=oZY5Zxv3lIyCK z2wq1|)K**)S}gvS&CioZCa?1!0oP&}+=+vZqx0J}21$=|)?8X(dE))o+p>0rM79)s`QUeHT~ZT4r)l-v}XRaqvv?Pl=aTmKOmCnREAieNQh z#WbdB*-88^1_0OMs6^oaK%VF!y9+k$Dxsds%gbyK0&h4>4p%$vh`OzXsf03fX)0#jo{FHC}x4UFrH*1RkonW{9 z>48DN#i?(V2dUp-gwe#=s93d>bT~c&klEYVN%wZ*Dj1lkBis5jR>*K55U5}k=DPF| z2)Xtqr5S3A*>-4OV%o=J(5My=tNOzrnxAk&!!^fiJ0;>GGu8*J-J>`RagMv@l8_CK$VjUd6GKk-1>*g-TW=dBXxM^-A54Mt zO}3$Yv-Ed|$U{4qk|YuNxAmnGpfn0~E9YQ2H5SqYaj!*CCX_Hhe2V&hC1e6)fF1WYnyJ0#5T4 z>m>58Blqb8gCiFFgL0|!HLzy+TlB?ae|%zMLZ zdTsquB0aH;p+4B~8QY{+^`9A9Ua>=c`6|i|c28!FWDM+q9>0qRjWb8T-i_DhtZ`5y zv@-0Hmy^WUI#mRZR#|rhAi@h-M1M9tPfj*_Sn{VNA81mN02L1*gkF4?6p5AD*Q_BE zr$Dvh))I1s>FV<_<=^lBoZtv5V=v&)7@N2))Nk8{YM>KJs!dzJrCvW6Ha!v4>C=Y4 zWO9z7r!LR@3jgTkz8cg~NibYWQ93uYMAg$W@{C;k>bvG)Z&Dm^crKu7;Meta0>=5A zf_6lo%5{rn<7}zsZL4}YUs#Ayx!fKph?D?z?hmigiYyYy=Ix}|Bhjf>_@ue*Q(dg1 zGpG>Y=ooZ`z`Cv>7{9^NAFZ%m6M~F_lgsmmMRrowuEviD4hHv-h)BUuQL?heK1-W; zNhqyW@QP$FHaQj#VWFXI#0Yf)>TH5wMnB&k7OQ!dTB~DuIXNT}>Z%U_OA%2UfN+0s zG4KD&awLXJ35F9Ggovuh#0AZ?;V^$lAT;290fqFwLCv??FL%;FMFrzoLYf+qHMr|b zN;^J_qjJzk*eN+5ZB}(m_AysIuRVI9Va`HDMNCHVE?kYvuYVu574vH|t1aAKve|zZ8!KgJ2NM#Rw z1qB7U!e4Z{ZHty=;T?Ei(%!!y%f5w*Az$UO_HbG&D7Vx49nzqoLQw966L7}?N?gph zK*;lQUoatp(-3zJ?TkU%4mAz!>Gq)9yv+Yb+ECdj)odY=hp&Vdf|PcfBMI^WfYXZ+ z%W=LNo?s-JK@h~J9aG@WD-|T}YC!64U^Snn++V0Kclxo9Yp;UnY}9dm0sL0ISAcDC zYplp`w-A@~g=qSm%~)nAywZz#ntW{;g{Y)#>+XBmR7mk(z7Kbbij#aQ7guNAd3Pp` z_Sdv0E42r%e1>k$aHOx7PimoQifHpoCP{~A7;+a+zmgw*<>tm~I=h}`rwxSUv4XWS zpA^e|_xn=waFF`?nds>F1rj1bUzG}yj;}^|MM|9=#8b0SzQEYKiq{$T(`ycy3o;gL zh4UKLbTbVqq~_)tvm8A3Q%0nB`<~w}HzzP8fH1+AtC>bBq9P(3pPUQSw)(K=n$_el zENK}S($n`aIL(W0BC0>rNKg~Q0XY_G6;eu=nRk1=wKaZ4KVVg<;7;blV}p2vpq}v` zi<#g}qhE#(ZyM+#E!DpT2QOHdPX!ARBi05|Wku4U#U-F`4QM6S`1kU12v9+)prccz z6sspnv^v))8&@b~($H`Vk_;pXjtq=^oBDd1Q8oL^L`y|ej#b7FO0Xk*P~uvKl{BXI z_D$&)Dmc9)iZZ7)MocYik8Y(_)iTOkVp;{!0HrQdNcqEqwC%MXbnk_plYXkfOWgy< zKwZ9Ng}Z{FtC{#R`c!+IN-+{6mAOiPr&vLsXhacGgF@CaaekvA+r|5EgkKqZ!lW~b z1EC^jHy94Y`C)aH=Hn?dI8u@l+=*d8D6~<|;^wAEp(<(N(nstRc1$RvTh$a5coVT; zxBEeL`eYqq=lB6yStmDJ(m55gScUFj1Ksx;d^Y$~u+3@Od0^;5-!(Mym-L_^Cy#$G zOfuT^Yg#xy&bP73U{z6lui5syz#_`*imz3nBa%{m8}m-$uhtc{DzHYdF(q|MVrJqH zb6WP&kFpR8FW6(FWH#>%+!(l0L%@GiG5yGZOwnnu9nvR%#1x-r<@uo0AT;CwapL_J zz>5H&QyKBTSrb6`QhxbddyDh=G7(XG4wGV-84ytLwF0Q$71w6-55Q9BV5hXNE*gzh zRcr7@s|2uc-~Ft{pr3CmWyMd9qt`B~hlX8&f<*# zzih0&GeE|o_zqc|c+u^k6hy&9dB+2&#(kJuYk`4fa&8$TjlB_lv`_LcwX1?Jg z8MnIf?wb$po_?X-byf@KCc)9PXMON4YTI63Cb4<5$rR@ z?_#dl%F&F=mp|u}%B9)<$v{j{zUGn1^L` zUDlv+Iqh=dj2sbPPXIbnJS-<6QBC1p%y#q>q08&_2%TMb3Ui(zp90~r0-o&i} z%+@|4HSNU7NT*fo4AqkFPaW(jbe)ky&yZ1HD@2ph#J+syPWlMQSh6^Vg|89U>^c0> zduKIY6B~%gJ81p=W5m-$fBK%QSU7%}&HIHHm6uy;CI>-zDeNKXTaMFL5l$OBz0#)r zquK#4P}oOX0=XDThD_nEq0W3D!#_Qh1m%nSvlz|+9aJFtM^=(OG>ixG?OA4G)D-E8 zXJSk+D+XYSQJB_x!$bIih{^nYlrQaQY3;2SPd(mvJF|*o=o>6m#G((1@}hDiXzoP? zc|Xt*x+fZED!!6c8pN;~ib1K&*?OvaJ>0{JFtV#=ogS}zx^HrNb0vTZRT*e(ky{xF z9j(NI8JLMxH;Je*e?bn%4PqtTE^k0*boHGHF40giro-5@MYltn>KAyd92mharY#Wr zW-;vNRAGyYsYGa5z&qs?PGcXUtdGx8M%VEz+)dRn&7W+i)s z-A@!|G3S@>$gmFwX>$){oC-dacz;kK9m&vi7|gJ>Qk(6kf;2g)HK@_PcNHEP!YMXT zJqWCEgG3lgSz5U7qwe&}0Zl51MO}1`RgKI9!P7>U93h9WM;KJ4hk(VZl4pcUQxa6P zB)@ytCePx*iL}YAyFaFgkf79_nvjkBfhMxRA>eaFq6}hvDXw2~N)BZ-D<VRk*0`z zq*Ni$2zNzIMMd=i&adPS&|xb0h==q82p`^YFHdqe^mlM}CXQ(M3!ei`K9rqWDD5_5 zzPR%g$l+q3gq@U@g zw&z_YB2HczDF8L8K^+b>clTu2A5|*O_Bn=S4?rlx`36Fx?g1b=?@BH; zIoe}aK<#KL8@UBWoDlRFh=WL3USNa)7+Xo310Y(HgT@d49I*lY>TniG_Se7f^2?A+%EaF$P4Fk7gz(d-{m?;mZUIPG1iS!;R|3UArT!Px zQeXURAAoSG1^}P6zKpEGM-7g|8H*K6V5LSKO=J#Q^`ZP7+zGrF&j?NR#CocdQPYR= zg?lp;S68OZr4(_rq+AUR{i#N8jr1Wg!C043&et|3%}br2OUv-OqBCwz)2h9t=<7Ra z_+79d(&6x+>7=o@7kMuFmV#@z{i8}Lj2{c_Gj2eDnRvDL5fJT`1+#9n4tf*1gjLz^ z?=a0KX;s)V0iqB^!U?dcZu^uLbLT857S4xqig#eXrnTGR3q$edsOaSWPRHe)8$oD9 zBEA6f@2UQ-o{nBy+aYcp->o)SvL@aHP7 zF~XkGm!+w7Tl+gB<|1C?9*7)J_U}J)d(+=`0A0w zI-82yohgLf$Ta>Cyu@^+k&+^hfVPj1)+C%%(17Eaha1VY^OJcpYH2n!sk*8n05;K_q}?sWV9?JGc|x*09nOEot3eK9X=aSr zdhHJ1+F^t#emRmyo9mIg_3F$qANA$7Vs!Rvzkz6sUTWg^J#k~yBI)I0IjE__XJ(G3 z7Fs(`cm3xXg3{Hsgj1{uT-UA@=BU!=m4a&~x=vJxVXPEb8Z;5_3SGC*2Ul_neBwTi zFT3Uh09BokM@~J1vTR+iVF|A&rgno0Pgo0!9b&V8I6|cnKHDkH2EFj2@J&Dsco*oy z^M->5hmM%o=NSlIO?hdnb@*cfoe3JL6sT^~J_i>=iDpNOjR0Gn(Ga7wD%?xB@rAand=}7b+UY;0^y4Cq>_$+X zVZIH|h@&ZM@B`A{`l|ZRG6)YqpcrM{{@|o?^i`Uk=~Z5iiTN5L&ns9|%z%7=1HfTP zu=C|626I?QNvlc)rH$Y@$3q9naS8!tVl`c$uuu5HyoC{z>bFib`G;#{`VH>Q;gY!b zL#vb{Q>GG6xZck8Y?VcMqL@72Ll(RQqxYkHfR9(amIL2de#<$%@8a#0eEVdJe4Daa zg8!2J_fq^wVu`V-M|ShVro6bJgpwGogm0aVoa%09$q~&I&~CS2joLw?qLAYF{omdc zhdHP(f;Y7-y*-l6da-Lml!^ED2eZSsk?#t}I=sXCv~+ZaUwHc zLPl1i_`UErJ4B`yKuJR;eX7({Rb}HnADD_6<9l0KlH+h7`<+SSd$V9ISlw@HdrOH5 z777Ug0eqK`?*sZ|VuXFLx-+FZ((9jkJ{aDTHPQ<`Z|)uO-K+8DT~tu~c;$sJh#*zk zSSMtJR>f76>wD)rB{~{>rs8CC>iuKb453W|G%@=7R6pEU^#!4hGWz_jZlDk2#r9#i z;(ei$@$0C348_P0>YR&=s**tXs$!})uldb~PZU68mSzs5XjGjEepbJNr%?gQ=cBGT zUYEj14VTQt>tfVIJM;d9Wn7V2HPxK)6qTUDf|eu-l3JEbaYj$B()^`Sx2EJL0iW@; zBY0)Y1w#|3NlB3{71kP4@iKEI8i?NPXzu!@5F$8v6&?k9hqU>dl-&dS+kn$rV*@v+ z&vV}S6E_cCra90g1Hnp~g3wEk4}6BNQ@aCdQHajc+Zp+tllpoRkY|l{UHR2h1-~Oj zWIZy~WrLo8?5*n0k?-GrEWmBEW%``2wdb*AbIV*FDT^PaO95 zC@|R`pls3ydKeH?svVg|92!^6hK)H*?F(OkNGVZT?Q}@B*-1my`;GuytKDC#6DDxH z+`0!OF%{ssfM!4W0KP;m$`>V8;q&Qdtdcl}Pqo$?xs*DT-ZxwE)Qaogk7q<%5;+7m zhpZ{OYcBTyG@9clybioSc1~jUz*nG27&94#uLm?wDr>kyKyVzR$WDNNS$n&oP-V51 z#6RU7AbxQXUj>x&DL53KQHv}94jPgP#@rt_5oZThg-FDzj->^^ljGF|L4iO(VBn;h zuBYh3?M3zQJoTL|ocDI33A%y_pd5~L_hP+1PY&XB)Z4_NDnCFlI9%Xs;94(Ag~RMG zzgMH?4afmms0deK^^11W#YM7Q3*Lhizqeisvhi$j_zsd1X&ndFaw1Fg-FH=q0ixdlTZ-^1ASh`V)D(UWWTFdq+7cpwhI`V5 zt!AtODoCGm^^bl5?3*cJWZoRFyAwR5x6UXg3w|UhP{9?%HF>$YbBC|{)>FBi_g#N2 zE~c$5Vln8H6zk|cKKFT=r!jCsz}7GM-Zz_)f`5Cp;{8d)DDdku{YT)v$ZDdA&TP6` zIDtDZ?5_|&7wHQ=QW!)P0g*7O;lXPzAhu9l*cMKvr^vubF5 z^8i#pzfu4p(c{eKW6$8PN{VKOO&1Q|d6D0}bSfYPJT&`X;CFNyr`!Y_E)s=L8ClVC zxDr^prcVUl`effX@=Z0Tm1(~=`NWZirLBPH|GsP=jw zN_a2ZHC@Tc=?k^}0v)qT+xq%z&6EBWY7WR?F>K^skZ&L9>i(gAb+CAF`)HVHWQeG6 zOalDfsf8sRmOMFfV{_DJD0%_^rZ<_QD2!KG^`@_hwqHuVfz0fW9cv9}hl?dQh=gWw z6d@6XQ0z&+FQGm~c2Y4H5qlRYhb{!Y@3ZY-o zwyZz*?Nk$@Z=vd6Er1wO$K5-+IncYP4<9>qSjLecM817jv?v(Iwn9W>aU!6~ZBuC5 z?Bo9$eD6~WWMt_HvE_8Fho@unq^Qkz^K8DFj=o(ol}HJZwW4igXbw9{YF8_SH`^md z9;wKbbG+MCzfCHi5h8Ez3{^MY^=n+%D=v1MAXa_#?({=OKn(z7CcNLv!1*X^(Lal8 z^;E%{Y$u)Q_^pnuF*47yDq1IT@)OqytBslQ;%L7G^KSnkr?N)=SJ0#ej_yw1qk0^7 z+=BzTj`mp2TQXm`izPQHgy=dhuwbISf}{Y;>DlIrXk%W))<$I2Z$rew3E9vdWR9Y2 zD*!WJXN3p!wv>$usW_S`jt`xNHh3i=8k`21C2MX@{Q&4)0N{KEWmFvOiP#e%9Jzd} z-d`xYzOaN~IpJrz$3iIpK+)j;0ypvT}u^-9O2IMU-Eo9HLdEdJsOqe0yF>;&kLCbHuF#QPjE?6*OE`N71* zw66mlfG-jZGf2+N9F0WCQ-F>qfZK)rYJL10L%R&1MPirSg%HYrwmqUGXDJqBW|0aq zd(X_Fba#Di+Kf00{&)=la4ybwcTJ1syxd@D@N7$<6eR7-q~+vPQJbweTizE6ef_gb z>jMcEcc4%$1r19LN{A5hM52ayE~h71bT_IeTXdgb8xjDCmw`|74BN{I7P_7nGebDd zOlKq8Fod3+ix^U9;M-~w7pDvyNSmJiehc98Gx&+G?Tv;TS^cM+3`YsZAQ<_d0Fd}} zE5s30hN%m{e78^;()?3H>p+5p^9XQ7@1wboGmz=}5n$4uEgqp7TF}|qxnGadz5o{r zngIZES4G4x6Ux`>vB!9sf}k3!>2M(5=~)I2m40lg{7ELkGk<0j89|EyO?PIvY=nRW zQGzR-CgejO`2`gL^6Y)&*9_|d=({RQrOQ7uepaA3hNsU?Kj%xEARPU_(YIEpJiupi zoTuL%feohsA?CsW6$N&iGWXaL6lEhRlH0U}#PWZrD*+()|Zo%gB!9>X;8tSSbFz4IKo-W zo(^7qpwQNq=YS!d{6ut^G1w|ps9VF}3m4Z9A}&CFsG^B~2TxO|mQyY@RpxA%8n@8B z4z+7e{u&1(*6T-{Fzih;W1>nZknPDbeLTuo7Ixi|(zXDQ$*BSXx3^+9OjHcRRr};~ zW3)xeE}BYenywiF1om~A>W@df+?78;|pmRuiCsF`~?385{pMyR9ff0?>v5 zmfXyl0p+@$q>PMmQAL8kD^La3Tf_V)JnInZGUQojL)yPSUmnhhwJ)oRq2LJ?yDh@!n5=w`@DO#9B!RPF_8 z(!JlKUxN!N>QVl*(Ix73$G+l12Mx`Ja9M0(ni=l%!rSe3Fvx6ha%DI97<2q+NfJ@> zOL%ymG<};7xh%f3P+Nq*E~%f7+UzWt5G};++sMNi?hAk~v8H9?DvO~q1C7TYN}Ut@ zJApM4+A&Vzzq^H%mIcidNB3}u>{X{y9$Lz}nC~pFTAVC^HiqASoN-@kRD7VT0Z@Sn z)U~w4xpsbrsGe~qtE;PvJo7z_@dw`wSC%z9alukm5U3+vEIaPVZW67Eubf`jTP+~f z5)&BZ;hE@+>@ZP6%qZ>q#TtXLYdA4Dx?bX)O58YG&l9A@vUbUwE z72Efey6L(Wv6KT8!Gs(;g1ED;E}jN>OG(xHj7#@cUvX|a6U&5*w;n4$o=^MXq(eZ%qTxBQCwvx8`>Zu~hFzihiqlZCgPWh4^Sz-g zNp$VG{Hc8+DDT~nQ zk#DA6Zf}bf(##cMd1|p#mn$Mv$BIw>-UT@(P&pFfgg^C?4_@n}lFdaGIHFUqTg~T? z!jqZ5$s*}?eHn$UpMbn7N;4qj;_5cWdqugGwee8BP-_t%3Wpd(C*su8#M_#()YO08 zg_o|hVm;A+*Z=n6H!12j5@&wM1v1DuGI&)6Iv;rXOs}Z1`%!U_uBgG2uFr%9fc<3t zwkN4#)a#kd-Va6wowKc8e_hyb;B2G~{AAyK-S`fYPqxh=5ne5GMf zk_8kLC1E|51f)P}CDCpc@)q^UyZeVl;IuSi1vIcgZNz zgj!+G7_MbjH7eO){keVu-PiKrMBq+sTkr<*;j|!Fr+g3Cou&=7jF4i7um?`}0 zjAmf-tV18687ElBr-I6UvTBv;YBlF*NQm$Xk($YPAP-T|i9Ui+ZH|2ogJe|@K*=tb^XX`vlGosNPnc7;SJzF~GZw$`A{^D>tNT!Su%x3?NC%%M=Dm!V2x@edg z3uMad8S|ya6|{KoF~G~=jV2 z?1ld((?yl7>J4ft`oS@}uS9vlC${Cr1{&YRYLeOp!OzAjtnf5sAq9fuk{S8rPNb2} zI@(cP@B*`Bm$>?;7q+>0Vxm+28|z_%s`Y{{w};!04pZOVP1i2*$zK=Ql+Cp09F?7~ zH-^V^&|%yYoM%J&OqDE6f1GDgDG-0-Cha{k+$ z-%91r+kA~QD8m3ywZ$3-$}OfqoFMh^V${-hS7`G?*j7V2u;E!^?H~(XF|^-jrN0_& zZAA$_kN%4I`(>4T0lK|Blm<|@dBQg!ZIK}LYXR^in&?LSxOB`>Ich!h^60>>IISIin1!}XbKbR;HKe1 zWR`*8L?nu&XZICavTl2B5n5(ATbP$VZl_N37QwnU66wk%Pr-`_6HYyw~+hki4r=~^ge7`#q&gmb5Cs)w#&Wj*j-sayeEqNdGUJCx!5UOe9I z#DaJJ)HfMFD#~Jt&KT9%aY9vA-0!WPJhoQ!Mh~rvyAZ0yO>XLMcvEgT?GM=-^*T7{vva3mr@FH`&ODb2ZBskjiUpM|u99R$z)U3Q>HZ z(BjZK1>%58okBjB>3D{d@E0yrK5kC&KL`1up+TS|1|i^N#a({sh$0h@@$+{|dkzTe zs4V_DWCO()fHQX4k^U%BDK2REfi6(0+wKLbiunhh+;I{jpr=O+z<5;Y`gd?RRt|vn z)kPhenjs3=VrI#I0pEXcMt`A{zdvPYlV(H*(~ikSXV=N_Ph5JcPuh#bM@^>#)bZD) z+!b-}UcHMAjeLt4iqd15@v}P?ePW{f4Q)?ijl)}dP*vPIR^n!x#`XKH@c~J$=3r(= zgz(&u2l6Rb|2)Q~wnYGRhYiD1!&*IERMqsH|mz@i1L z`?Z>0e$w6>luR{crr|y`tdh4j!w}q~AesIw<^Z1q)=lQOcS?Sxx0sI{oR=JYgW>lag?^^z)(uX)%JszJ!ZU3Aoc# zQy3!C&7Y%<=<=@|6@C(Fh}O+WmUIX{4zX}4G%m16;8c2l&~?|cZIxr#94M+>b4YxQ zlJvvmb?SsYK3d2+9DA2R9cqEW{iwS)H^6`uA9I-SK{}t<;&mZ?^J6b#;7=*~PuRc- znq+=O$vuXi$qwL4h5S4gw1^fgf>u-BtEl7#Ye7KVucpi(&VP=LQ<+@eq;=%dNjsV@ zRdR9XWc}^q02AYjDW-Rj=Fr;Pwv=^YH3!JtQd3hG06J9Z7_-2v<9!MYWV7+7({cxP zy~BBLky_l{W7(4l61qhwGdW<9&T~TsP1+Y`4CK(SkTLo3EWR}om-gK5YpiSMhmAPn zykbSwAjRrKLa--k!eiu!h*pR^CZLA=hCi zUl5`75jqiy)KQsr4fhqJN{3`+2wlgNG-@n$QE_3|O8a&k22)4@-|ku^ThNOm;#-$r zoFYsUMGaLcUtifr)M~0MN4%8hO=wX9>xfZ_x+?dM85Nr+6Ow%!UDpB{%3^l)&_tFY zp&JolbXwRN@whe-YWrAy;~Q-I6J7beh=65%YpkrKAsXwN=PFrULl#?S@z=-ETGSf+ z)GOQbnBIE#B5bqd_~~h;%*}>EyPWR|$vVNHLr=*Pk_`efFJ3^x3uPc3MQB$~0`6^Q zG)fU73<9=c7*pSB;Kv=UGA!+hz3E()xxA;HyAmh){Ajr*?$nY~!pQoOQJyo+)DI@x zH#{qar~^ctQnd_rn}(1guw>;{S{4@RPxS7cI1E(`i}#%F24iS(gk+pV2U71pYV?p6 z5oR@j^E$>MR>Chjq$dLsqO2Y2!68p?9lsqejXhAjpQ^ZAjXfJqfYf>WLEAp>taNO( z1dBjT*2h$aE=}aQhaS*mH1Q2sRWSoaAy4#h$x~HZ!%o04D{*?ZaW*a~sc}K0wmP5T z3TQYMzjjgtU(P{P{kJ$xt#dX>Lz31KD=-74es^G zB{mY!MM@yfsqm}YNG>70nRHqi)v*YFOB=hayS+yiPhX!q6SGQa)o=LE4JNokKJt1< z8pc|!EFI}0TBS=}wa$0sL&#dDe6GlcH5_W6MEO8*3B5TA0deOnk-!dt9QoaZS|G4 zD@pFJ4M$zpilpu)WBbEzaOFw=4m7h$N4qootV#gb+g**;Xmlearncs4c$$2w42K@9 zqiOURuc#!FT7>yNI?MHWnGItFi;=}i8B;I1{@`3EYhWa?je&gW`F%tV_4SzsyfvzT z9z1kbl!Uce8xhUG4wnp40Jk`8p&5v=Z4Z9+Ddk_4z>GwBWct1aD=qpU`Q{x^w%DXnFwr<{& zz2`Wt8YvP`*1@jrGS#8{nS=LUS;MrP+c~rKD(fvA$=~6rR_x&3rPl>$;C6C{E)Hz6<6@CLpy(KSwkeG?VC6^~&q5b~fa|Tb zq7u4&)K_IZMUHYnG+bI-!07D8b%pQzd}KBTHfM&A+L%w#JtqDksVhGu8)JjF54TtT z^`~d!M6wFe>yb(!_eO~gTRsqi;PmVY)-a-%OJjQx>z5b5e>W88wPP@)zyI(9aw^?F z_V(FC=#jtNRcDv~?&r{BF_DEj!|_28&+OYU)~_!LTzSSxn!YW{)VY=7@1mV~@Hmad zn{XcP2V5JxO?`P&-G8QyIBR@#?HSedC}UNnoh9mqN=0r3=@3vwP8QVDwZ2?fK&$r^ znU}(#)NIb^k%GV8V4MuO`)Bv+Jnp5l{fV+ zB9r~Im|h$FHPb~NL8<;(EBwUJ+gdTxk8O`^G9ylRjY-<>+@;0N#I)nZPqV7AawAIZ{e*(t4kazQi~lj||H(M} z8oojKZrV$DEs-|~^beZ+#Hy+x$C_o>!@GlZ(3z>dk3Lr_7saO%hqYkmsAnhyn1wH& zIzAk>-@?9&HKbO#aNg@O_p9iKbW5Y1>K1OEhFB;TbI&bSkv?Ea5O+wkh_nj3D-hL)ApB+0YkTyqED}=OWT?(k1UDb|Lte~AC?wao5dmy z1sUU+I^655XJY@`5d6zZB~(K0Q&^M|wAR&^Qq(YIp{99EdlDfw6Z7k4V<}m=_j$Q6 z7w8Wf&BLHcE_`3MsB9BF^WARQsCDkR{PIKQ*>F^%{F1AF?_8%rn)q(zeQYeIhNo;I z1{S7z8+GG562>SWHBgAf)6CqG&7n3Ebnv@l(~{zf+xgR9?yM8rVGFF zwhNyfI{O`p{_BbU?4x?L5JDn`g}?Cs`@Kh^mOZ(UHeANuvaYIWXJl5$XsqQ9>q*B)@*D19o6JjOSd9(BoK@2_c0C!kp#@BeFDJ?P z61QF(GVnAy`VlXE$xwfdgJo4De*_T>-nk+JziZn7sq=EgzrqtLL`_!hiKud`mh=ghd(?JzVhq_f_|=2}+2E(4WagRAvGo>54}LteA4TJ>mkJ0X>qkz zR>5k$%{p!$l7jC>_NO0Bjz~uo)f0nrdD{w@0XM@$Lq^C-=5@owlki`jD!yMjr9xko zw$zLl4M_{J_TjA9;s*cSiT>rGOi|l{g9qfPUGjZ?_PjhP0oDJGJ4^n%!{Cg+^TDQ3GE_J6edGEeQEm?g`b-477vxI=G)+YX0UxQ}& z#Ja#gxM$|=^t1)5*LXKoZ9e;77jU%%aX@e%7epE&TKL60?L1#n=zqD{|MiCcZf*bO zyN(vD;0B)v!hL=+DB(F&(VbS57ysta|Jh}R?R-6KyxDkIxHw`wz2a=hM#TR$$Nytz z_CLwUhl^R@l z{>ncQ=YQ7u$WJ*s`-sTuj@-T3ADBP-)^#!2vy8>6;?+I&)KQOM{ULuK)87ir_1lzG zm+%QON4Ef8a_{i{XV?Geu5Mraon??oWVjGrrnrn#SICr4Q`7u2!Cn`l93SG8KK4l) z*H&XZ)cZGb`2*AL7^z5m5oD-t!pT7j@N;J@|636Ff2YBJ?IUc63QvAR^LEvBCFhx- zM-{AN2>I*Zd7Xc@&6pC!o0qCSROi|^#q@~Cy?H06C@%9@eB3+1a$W0-D7UVeq4%1W z>m`rhqw4?ZQGBMM>W;wET@?O&(VSz?IN+7@0cC}}wS{|sVErj~?q_hA-uoYE8%dF? zi$;3Pb!zm2Ym0?d+JB<<4@|FfFdTv%Rp~JXC8L9;r*D8o%%h#lCY)5aT+aU4ezgRc z7qt+TgX@j*a;mSKYw2SDNL@c$Qbm@%7q|NA?B{W#{EsZ8O(^~Egx1(wTIOG9>kIYV z|6JILHaiq2e=#hl5ffH@>rX^M`;qNR!=<71tDuj6Vqi~E)fiqkdGB22stN*uYP?IG z{|x-mE>qn451weo3;3m~*J_RaFaMnv|A+U(F+x#9HPOREQcLxffKaFKA1PUl`Fu9> z(Dp2+*&lhOQ&f4>FL`s_S8}#d|Gx;}&Aa{meMhIQKSbWNS^|`$h-#d(vXJ9Hvv~g{ zBpYK&4t{8GFb*H9o7bg^SaVt#A9DW3Cho7jR0d03xypG%{F@i`AIZ>LlcKKz*KYRC zI!bvTENx?^{|M~8YTst2_)0HVnG8nZ!b?NjNAu2qg1b*qC9wX8cvtOp#S-+6!jrr; z|D$7bEc&hf3{26C3=UaY8ENW&7ELK$XTQM_Yv)t!+=37I6FWw6c#egNRthp*1 zyBvQc(i)ZdxTJS2bQhD}Il^h4{22hfqD#?_A6?4!KyHq$#yz(0{~YLvotz!+y_s*Y zfp1uF->aotUQ-wLGMkWYFlJL$JsYt)9@#toPvF^agDsXp72hJ)7xk#nJE_c#n~wRq zOcRs*UxBlaPt@wnKlTk`)@KEt-?vt9srRm@Teb`3zG?SIVJU?a;E$uf7_D{efOhg) zn{}*F`^S6x4QhY#P;w3Xm4iPtR6_y8=^txrO!Ve|min2dpxxZ6*UE^s;z#2C3hwo1 z|HMOwQfyzmSD@rwae`lHb>-Nf{adcE;5im1Mi9kUc=%ze!*aLnDO}Tk znnjVF{s;DLlH-&k(k)aJzf|QcE-F`O|IvjmZzi7HMX#@8DqU=Y;2HEiBo5+>M#87 zPchTtH!YK-$sEl{A02wUESXgIw+KeepIWAgP}W$7G=M1nUK69+9^1AB(ePM!-HUJ7 zbN|19x>`{bgXmM-PRaYHB^y^?`kQrKEq=vL?ScOI)Z0APp)`zbS-reiY>sZ9Z_2gz z)6b#U%wNjwpGp!Lz8kXX-t^{>NV-*D2^-GUKfw+BpS0co>rPYH!^aE-5;l%gmo^d^ zHo%4t)%I^JKtL}-7w$C%?s&u&eM&aYi}X1$)dfv`cz5o~-FK_zu=?op|31Obo?*uu zR=is(|1J1aVI->Xy?oTxI>YH3vGhP=7IPJk2r5EV-&~G@m)naKx>*^rf7@%< zwhe`;@m(}GGq#7@DISLzb(+xxcAa{4o`EW$tjPH$#N&gR<%`CoHFmD8v8v#IAMX71 z-*;BjSYZ?YL)6q>-hZ$eMD_Q@V@%sinNcn%I$kR4$8~~ncg^(F0@mNDf%vFuG~2^p zM>IViG&QkRqt>U8X5~?WD&tcZYbYE7neAsqY{K~8J$UqE{+uKpk<2`?jJK4JK!5O8v}z)i4RZ!D-V&^5*v>7l(PoczuleE;596u=p@LLFgj zZD6}5Y~iv3eDjWxYVrJk9f9;J)xxzTns<+M?d7Ecxw-$Q-LKl?=?|E`36HZg(Nj3) z@$BoT$0B2<6Z~(8rBMs^YL?xQbhd0gll-`_jKZ!{ZdeT{!CCgV!))hd-*pW-2RqG)ie z`~IpQe9ChxZys~DoXz~#Ioi0N1~4M0>jt=|C!U4(EKfe*>Zl2w^#G|w16}75Ir6f$ zF5cbGZt!6|Kw6vmKb@FYq`kx?-o*mYH#D;A6Ldx8PemBEJY)M$W?M_grqdL=PN$Y& ze%Jf&xx#i;DtWpK&x*cJ(Fy7GyrlfW&skLZz*`Ul=N~Gn3X~#+i#NVxwb8l%4n@S= z&IS@Lk53PQ6@xTC%9tn8*wc;`0Y`wNtD zsfspD)P91B2XM=4sP{3gIcH46AnoJH$z~;wf@UXY?G$=zW5rslysc^3gbm^Za${V6 zlYPJ4lS7!#%RvKq4>lyh>6$a5_(Htkq1vd&4_w%0qI_bnk(Gd_T*n6vWAnY-guAiX zC<}6u4f1~kH>)MTQJYjh?fWHp0Hs~5`@b&|<#rZo*@#tv&lV1UY8)GS*&AodOoe%z zT~;g5P#3;O0`t7o{jZQI?CSM64W_4>PHi(aIo+P1fFiR*r%+b}O`e(FQ@bK)ab47a zh209>XuxAXNnKdEEYi*oY3+w>y=LB74|!EATq0bv6AEPIdTeHfL{X>qTRe4hV>6!G zR7)~0y$*c(0w#E$@;>V?(?>xgn`Czs=^k=$Q}77ic+HOE zHFqS0WHm|$VK3d+Yb*fPi4G0rU)LXA43aYM=`At~1+`jPiyuZGw0{!3!BAj8ch6<6 z^txdtRoj2b<8QWDOrDBTG7-QU`8_B!@C)4RZ-@T5nTl*FE6ck4V9I0swfWiA()J%Q z<9E>iF34!VaCx^~%l*17lZQtQL$ho-pn}nQ6Adi>@P$JD`qjZ%AWx7lqJ&UK-9Sih zf-Fg{tNz*IYQU@FW>HUn`B`_Qd0=Nf0oJ6vkX=+((tsic9*)?{hn(Niyt#ckb=x@_ zp>s98wsy)`!pPK8?M0!=^tV!b#@}KOyTiOoN<>G7wqedAM-i?bXR4T2%Y^ULjIiIW z+swTr^h>m|w{u1^ZnFyZY8uVtO)O**!p3IQ(<^{$mk0wLgT+~7cwS;E*e*T)N(yvRJ*m^TuUfY-((!J6* zDwf?gA`q6F-@8wzS$NYqEe3~(!?tmoYJ8Uwo|!0dU^h3~dY9}fZyQAS(}*PConfYW2t6Mgz^V$4cb9Xs5iHO*s=unr&XME5;lq}&sX#bg#&Q#L-z+%v>*B7^bSu$ zIhPl*@-jvNx%`PLvg z24@aw(*($~35%Gp=G>1GSWb9audGHl|K_ZoA1`;cHsh2H=FzoD{A1elD=t~M8`(-u2Q>ir7FTwRU z-k2z9Z^bZz?6~2C?40k|Ge_Obl0J`{D^LLh7Mp`^YGVZUOXUwB{j|q=j9>BEg z`_VWciyBIJO|*6Z_Uv%z?n|pyfB%VWOa3<45jp-KtEy=@6V~Kv^{}$)@A@FtKrJKN zT$Y{P-rK8Ds47}JYf#1^0ygj16evl1chtufEI+2@2y{?u7)0m za2E?2M-=A1E*>*sL-zE!b&5WTu()ya{pvE{^X%+r!I!tnn*vv}aGRT(jO} z>XfPP^I~yKlk@Z0Kp^mC820fgCqz(ic4wl$nQ`5l_yl-_+-`!=t73aG$M?^A7p=4x zoNrsFBsc12l=urW*A|p&vqs#2+%>W*E!}iibI1Uedi%mMF>M_}hhKrbd9&ZLyGL_C zu`*g-JJU|UFGXg+_r3IvbFeMvqnNQEdX`>;iI4Vm0m)I6QX7GJc%eQiO+-}Go+ng# zXR57$)l{3Gg`nTf#YB2jsnz|O`Cv~&HuAwO8UM&r{Wg8Ksl)t=U&dkm9VB?4Csg5s>QA9JT)k?IY;V*Fx4jJO)a)xS-U}!f9MCXHk4I!afquS9soH~3$8_Td z0^}+%iKO(C^i8IymA}A-R0i6@Fh8u`KExN+sQd zT&1Y`Jn%gkgSEuwXd0V3>@8%B{t|wcIlULphxXd6D}}Yqj-$5#Hl={O0A*F0xZQta za>wjfS?d^jQ-r-e+Ty8^s(SU+BmJS9XTP)Vg5lt!B};5GlKeSs?S#~YEUT!O#2r0G zA5|l#rcgrGMC<0QouIA|Yhwq82+QN?sBH())}Q0t4TMTrNB*(*STYTF^;YQdgJxo8 z(4oJ;#V=o<+vZu47d276LROb#igb7U>9aR>S?!s2vacW@q z%Po4`fGliC!ziOz5t!bqeC1BFxTjOvD>S`Xo#;`&KeX-|*w_2(<87p#nSq@ys5cc0 zF|o3B$^bR3tgVT3aqitF_z$1p=g?Czg_gEgxs3vswyfnh+CMcMzCXN%;s>-U5xbGz z9>RC-)YlBijLc%kCy;w?6L0!E)Te*kn_WlktgqLiLr)_8`n<=jO>S&PGnv`D6qG~C8kS1g%tD?#Emlmlgn!!SK+ewC%75|lD&zmz)&Nys$TKdz zdbj5L{)g?dY3>L`l^1Hoo2mg=0cOxv%jKhyRvZ%Q*>uZaVRLa!p)V8vu}FLUIXa7{ z(t0)k^9B>0zL1!pTbp8y|MVi(+>js}x@HNcgSVzhdYt#Ngt@1ZNV0RT0|5m5HG|-ghM9D^h_M6ZnBUoW(8*$Dvix6ra{^ z!S?v(CG5zSSEV|Sc^2}gKY7Ny%vLF6XHV7tm}B+~lS0{2CJ&-3w(J4m+#FEdpcq20`GOmKyGvEuuf0@Rc10o3({;gfc=~t>ervZ~)$Y_(og0eMc{9B-T-8%)TIp06KhUOc+=FiMSk6Lv2R#R<>~MnycI!vJ zYk6>hgPrgZ7knooUFrCwYMYz+EqsoC3Afd>1@=U3*O{~qyFyCU`|t0NGMfF6>?d1p zSRxYr!}m&G|MYar1dRO43yFi`t6G;(Ue)Xt`xd3elXFA-vU8>l+#35hg@Zx9WF4LW zxhm37s_p_TpEiwE;41$ z?PX=&zn*k0AkJBDEY-iR+od+;I+XLVic`#8&Dm%m@oJ$)9F1u4NyVC;imtS)a+Dfx_qBQAp#jfx*wQfu_OisY| zz>PRU_qGZ7uP$`HI!9Hm|w=ZKE zXB8iUFZPtLB-CV`48sVAUa2Mu9P%@yB0$=S9PZ&j?L^zom|y1}T)U@E;KUywR?Jx3 zbe$7OV+n17OH>RI;Ml6j$V;1IEj8*BkBwH~JWc~8M5%bwmxE0#2Z&*Wt8mB+L^;uD z*Kp#-;gl&jg@0sfTZ)rOK+TA2;podbb0f0?LDfU!(q84fGx^knnPL%7gPD<4!(JUiwm_g#$*e}N#9&wUS@%y4Q~x>mapueupu`@dDcigTBK&;SRmIdJE*aO0Ub~Gt^A@L_8e@^#=3v`4Pb~lTis8;du6zoEOB)+u)Ol`^ms41)PjJwA zqIJA&Noflin01H>XopJ;2D?y)ahm|MY04^XlainzkBYTeW>d^@#j>*-TEww{pakD( z+>#cpdaTNPkz*r-^Dv@5KY=7U36noQ@FawM!>>RBn3)B{i7rheCQ5f6-p82O|F zvp}h=W6;stsx0#x4YgXewzey3QM$Fgh9Y$^4{-hG&=v!|wKD())+CMObdFAWGD*a+nhEzyFD6-5V@b%8RXD>2K2h-UEuu^( z!LVA>2X!8p5(xC@0Y71vBYJEeNpV_zdM_3pWHu-9)`0LtAWlwvT1q8L>Bw$Da|El# zI!Wj63tq-7JRyg--(|akK3;1kFL=eusE*Fg+Rl+?nN-vrp|@pU%0Mt#vi^uQia{6K z9a%?DAuw69AcC+=Oz1+vK$_1Ot|$GZ1uxYwReG`tMIqSbGcZ|v0KLEJb1+8p6wp&p)u77Omq^d%=*f31OFL3Kd~QIQ3vM+-;jE4?f0;?wUt9}L(&pW%&TaYm%4DS z&K)tl-Df|$JoyOT!Y#gk=Ixyen4=dfddl!P$U7DOro!$3lV(;1bxxvyh>z7BrkctRHu43)`b9=c16mIm3TS{{x*BJPBw>f6&FJPh3) zW;HH|;nK3FpKdKj&hF<$V^yObjdS3spKT*RZ2wL#e||wFHRF@eN}NG6D&@wrS4|<2 zP8Q}a%v7|Tcjr$$y&6{}iD+nW*OxSN<;YLrYcfqv3K$-1TBR&^2_ER;^VO?GkqLO+ zvN>j%1fsL;1bLS~harpbtxcQq=%!yJXaWG6`|`zaWvaz_NLhC8P2G5&!wmQ&d;!EH z8A_(NuBsoG3?k0KTsl_*lk%BD*DtTK<3jc|n1qr=YgYPFrgmn6+(%Z+a}w%e1xe^E zlAUx4agkjC;B%1veBq}U^sF4`=5lw?|K2p0 zZIfhTX_nWn?=+V!KRfCo%W~V*nDqveWaEs-mS5!7&2CrCa6y*Fz8c`K5~BsaLIm$T zZ_)sH4UF`l3klTgF8c7{r7Wq|kkwIh!|TKfSs$W))QlQC+d?%6Cd2s;2zS(L!)EXO z6zbvXsSWb4X~l)`)OsNAqxKw*)Rsqd zjNiUa*W6K-m(bV5jpwVj+&rKfWgxNM`J_f&M*-B`?t%QWEo4n_cSa6X_@^j0@{qnc zl@%0>^@nUCu(P<9gb%suQGuV)I6Xb^ecK>HlX5q&Zx=UAp)6*cP*HEvkuy%VGM{Mb zJ2!UTY^J*0l>Jw$*{>lhbrGYwi2Fd3-CeyrnR}wpGA{2_ecu}uckfnBed^G=<8(c# zHYQ9VYHP023;4|@xEhKik~}o_O{UT3@X{Qx>&hSF3;-P_&_J? zxalJMLCO@#J4SZ`H>_JHt@3mx6ci&PKeTjqF|-}mSsvA5zB5RJR%W3>r)Ki{z2QOv z+ZlU~1}h!B)Vc(JxqMf}l}!QTORpt{7PXGLgCrvKG;gqBdE=?5KhllnXm(s@LgWLx z`@`?`WU~3fK766El6$tqoBs|ge3AN@++!B68ON$${&&O=K3nNP2(kWjQD(|YSpi7N zzPZ-^+*@PD^_!g0!IlyPz8~^BLe~?9DXDi7kMJ0>V$i^1OR(DcX*n?Sz@kn?DI>EL z^0Jn{w!2H4;v{``dW{bD7#*hO0-5jRZmQnW9H`uvSTo=IWT^by`A6xkJCDQC=-*s zqWIte`!#oj`x)VDDue2+%gVm_ufNg}~B!6`0AX|Y(9;@STH6t*A*V(#TX2~|iGUS8`yXobW zUnwmI2Qz<;rW$!c#*lc9oQsR+;a?TB5%>YzaTH#W9pNTwpK)?AIJ!ZQ zxE!jQAb*0NT-rii&LS`|U@uAagLQuNUic0E)7f^zk`!=wQ637FpUwcYT#Eo4ZVaqc zwBm!*KbqVr@VjnwiD7&_U7g&Cndt}C#Q zwf&Z^ssLeKcuuJ06Lj=C&e3PKi@~7v3~$S_wL{B7##5O%{e--L(KuN8G+Eb>uB zbFP3ZY4c~oO+E2X5&wDFcZRy&9bspE)XBabWqrJO!JSK6`Bd2Zvn?vPO!=T~*|}C@ zps(lnd;FV~(g&MUOUB40nTG(@1e1sOLK&44>^P-W-iHq#wtsoG^jaN4gjhfQNIy8B z-j{#0`~R zl$qq#w<>Io^3Ebw%V!I!DQF-}YGb?)1MTg*Orw??L3alwEG&zCzd{Cvn_ik*7`jTV zbnz)MA&pX45slMGkq^<@3j;lm9GPjZ;!Z@4$w$+_GIrP`e zu~>n#NhPZ5D2vw0;pEZe2o0447ylBPBv*{b3y%_+Zgo}`!K%V~E94l*HO9*>XXU7M z4K_}@ZR|AYAQUi(Y6(xpF+We8W||GgfZN;}X0efj94A3|e=l%N>-=z(cR40xFa!s9 zW=-yu@(33^e?*?wv?do?l6si9^dGMhvSyr{S&n~_b)00)SB$0mxxBU{Cdkqa;HOn~ zPbYaS543oEL11T;F{%`XFGr`+Xz+w=zt>|$FYyp3reSvJ-Lb@4no>_Z3f-mf!%1*d zVOVIURcY*Pvaq50$ijvcH-WS-rTn}Hr=E2*>V#V2A-xi$;j)bEf72;68y`53**ZQu z6u*_8Y$@6Rw`%W_&LHev*NKo>PZk!Bg)Px%f5;K~|IJ)9G(y8LJ zsxXZG1;?=l($J#(W9=pYJc!9vkl=2%OaxwFQUNr18|e~M&B=WQ+oRHaLI?v_1BD(a z#i+ElH9<7szZ8b|I}%JTZkkYc-O^-30HL93Uk@8+F_~=*01}>DnMK0-S6qFdx(xiN z06KIke=>I4)y-|&o(Iof3i)}?htX;xVgDmK#VEs3pqyF5q=;cV@a`LDIe{hO+h_h! z%F?pF;2(65loCS|mBKIDnS!%-vM&tb4@ zc+aw$NE9Y2Kjs#rTi{R&3gO@|m<;;rt%B(FE^7nj$z;{N9qez4o@`#B9917Z zR(sXw`@terZ6U~O%J7w{{J_!oI29hU(azE602oH{@T!dx4Xy9*IcjSS9{`hMV_GQ# zqmNWFPo{@z4U?i_m-@j3GKSI=a~MBG`9bLFT$^*OT(wC0$pNOBJsoFM3eEb$*lF(} zI`CIY{inrgfd9tCUhsS&U+Q>y&|UWH`)*$B>EM{wJqGAQn^Sk%X0cJ%LLKHvWTq}f z^|S`}ktJ)l=j~E4jnD&9D$ixYK_|N$z`p|2^Qjxlm=T0kq79PxkiR;fp&K_+4Tik_>2Zu|qjI_@16;s8VkoLs%Gy64HHUhQtzbe8{ z$rul=vEJt5Q{4}aqvbMJy_~umzf;6=wAYpPIQ87C!Iq1F$O@!ZL~d8y;66$E=GX{( zr`AS?s&wdu4lbq``UBLn5WCLZ7f6pi#M z?75|e2aL2;ToY)L<=VxUJ-B8oc=75!tv7OQfSEiEc#ye#%EJodYsa6bz@G~(uVb`> z)5qSPA-=F$a`{cDE6^sgJ=*rr&EtcsW*uIuK-e^R?a0{FkFX~pXtLU-$qR&E^+mFV zNn5Y32K+8y_*WGJa~Nex+;|0y;A-CBX<4Cmcz9@B!pO)iLaCAoOBJomE9sd%5#>3b zi7p4qxT=Jn+h!z6^Bu5Hk{Pa!Eec?!^qLsODn^6FewxY*HU_EPJ^ zULlXYMK!EflNk5Jk7NLOLv-7PBM1NUfzGuWE^reL#=N-4p0fG6y=b&&T8KG1onk^z zGbd;+h)+FT*9*Ra!e~crDZe+lI)z}XF{VzG+}^CUM1_nOoYGfjR}D_>HUk$3o=z$a zjDx~O)W9E{#M>{6}fUci zFl3l)-Z~X>Gl3@Vm|rsPLf>rO2UQAPXoLXV)j$j=e&^yxdnE7)aMaPDprs55NNSm zQd|2?1iVMTJ;g&hs5H(h-(3rLNzd7gq-W<2*!DN2ANh%}@3|GlUaGu6c3>@ifXA<8 z*iW2nr_{d~S=GxZ&Q~3?e9MovemMg5s%l0zigF6Isj&K(K+RG^K&#WPfCZ&XJXd83 zDu3COc1l5}6S%kOJva>nKmsL<&%PKyGE*A73~AxZCgNs8uYtzfIX8e8_tB07-OmF| zKU+TOm=Qlw=nG$~Ed%xPM487Wmtr6o7EyV%zD)zMN5GE+@!>kGtW|um|5659xxv>$ z&&K3Dk_l~ffbpZgVYw$j9t|Hf11~>dx6gz+H}~z*=)*DvIUX)XT98BTaMBdGTt@ay zh}`3Z^=Yp961_f=Vzc5HyUhzl5C!h`tM0SRg3KTq5hmqE^}@y2aa0a>IZ_C>ENl=d z8-7q1BIrM`aUq87_iO50_ zy3jUTgEauS^z_}9>UdqN7YkiH1SdCBJ+R`nYg&h>8f!(0wv=npS!;ZCdY)Nht)AxDe*T2`R5inf^&L?xvhro znbqd&B}EwJSmba4{C-?ui5uGWehZR`%rZ&x8q$dHWbxa39%FJ#16OBy($B_lR-Z-i zvYLkYDJ7Ld+k1tqHv89g2b#)dVEWY8x!BbtcCD1^Ak%^7K601GP;pbq*5+4NqdgE@ zklU=IiCY2Ma5b|>bJ%3&cN+B@lLk3CVXGl@D*Ri#zK^MvQ)Cdf?d0(+&1&vb4fl~GhtMSg#7R^S54U@K+HT4D?9#+* ztUn9ympFQu?M%)QwObF4d8Bcb4&yLz6@Tf_OKDB-t*$9&%ZFX9+Uqs$)^pGJ0S_gD zMO>=AY!!ZcNe$}p27w;=W2aI9fE^UjFr*NK7mQxKQimhk^(9tBMf|7!(D2S+PQq(+ z09^K`SIE9j*6)GOmfpW4AR_yM%BqI%e^oO}zop8^u;f)-UaN}%ghpGE-ZLQ#eCsI; zaC&v!EEz5+fHVm2uu6QH?OXR3O^Z9;fQg-O`A>5RI&lK})lRmFF$a=Cv-g5T zUgoYG9VcY?w>W5b-~Voo^-(}07b0gvWA3l;&-hl{D~$hPAafnpD@O`Xr9bCDHRaP!w;K1#>&LIK17Ui3Jl3yTE zZ*L9t-LmV>7J0Vqy44U_U%!EOErkly8$|o8qW0-;<@k1KAEd=+`A<4Z6aX@-je#h{ zX!?2lwn3aTlb}|-0N|oNFiRlJvweyFX`$~P>SFU4+PQ!MTZs_3LYJu zDz(vtdKf-;b_i*#6M@to(%nV@Bly79IsIM%bp;ZEvphV%j0*Kediq>D2b3)nr-p|; zWNXQc5lO-O{X1HecO@0gI}CaIL2d)`Yun6h9MBa7$eyP4{tfCe9;O@vo;&-`l~p|` z3xcf5<3ABQfBf_UVcf=Sao?XrzT4509#s#*_Jr#cr3Wv5);0|Ng>kbFd<8QR)J5iY%e@dUL~@g%+4q9#0DNxYTp6_AI$N7 zFhV#Vyl}4{N#nVHbM&IK>f0Zkw3CqU>q%Eb#G*AtK|4c|E1z5DRPKi$(I)(540PXX z1)cLgNJ1`&i|4n-E8iTt6)fVI1-Kmo`E$=TW7 zjChgh{GlAVSu8g4)eW^3UU9=0oocgTseEiXfOc|;CG$7tb8 zrKj+{5=FxnhnhpruU!PcX(<0CI--#)h@SO2#E_;^gydt^sUlC9d4CkdioH{2nd@NW zmPu{gvdn@?AA6x0#try#;HtKl?BQA@121Xi=H6#E$W)d#`$4w9hhpcW8$C({7(ri+ z&$NK3XH;^2$rU=bC>ZtIW^X zAK?d(5`*2WqRq$Iu^pvo0tg6T+FS!zm$*L3JEMw_l90SR_)71@1`69Ow+&_LBG*C0 zIg2^~|7w1-8vBYzHe?G4pv~dt*aF>(gz%7m@q#UQH;i!1}A>NJfq}I>nIW5<~ z9n&R@szhZvh5vu8=QtmEPs}HK9zGw+`Ai|p^H@FOBoheJs9wN@bE>U=2H#{>2^~U}zR@P0+1wMSi+Zze6XXYIMH0 z;i2vXvX(IT$P4PFTg~qX3W0npJM|fC%ssh}m)B!akPTturm~l*r&5|c`Fyl|B2bNs zMY%dn4Aa=F_${RbmV-2hIgHg%5niGV!@Ub_-|XFcL)tbQh@PC4QFEq_@T}$&JHje) z3EPbR=96pxQHlZJJH}tCd}^af7i-!Az%+gY_^&1D)HZnLx-$`zMI9Y*o%^ z^4K%K!bmee18^lbf~)4U%c#O}~=eHxtGi|lb zzOWC9jCF;y1$HH5R`Z(?wqwnks&$`&^hf)Lu{!Y4p_B_A=1|G6jVB4BMpr!b9dbZ* zpCt~}GjIDse{IrM*F323FjkLWSjjA0sjw7lT=8Sd-yT~1{K#_VL^jJ8x3=T9Sx4iC zHB|?%dV~630R1|8wO$h!Ebnb$_k+6(?bRsgtLL!(;I{h`3}$iEO=&|~E?W2Y1IhY3 zH?lO|)}DAWR8b;S)lJCw@>5)3EApTjmdEGWEHPZpZPqAwEn=?cyMcMh96s23!&Zlk zm+*D{W?2^!Mds>W4Ba<*zxXNG+|b0`>8?lv9VspFejz5=WHLy^%vJPZxz0&F6BwEK zQL;woH=u#hU4VQ;QKm|dUTwO?eAl#6kW)Q3mo11W2)=4QZ-c7C3)mn*$V z#wJDaR3YlVR}y#<#HFN=lvy0U`nK17q%jaN$`EOWq+7Sm68)<&^kaw;h#)4UKc(4e zfIGUgTB2oia4?%**sZ39>-iSHO=iI2dyC3%6RpAceKA7c=?5_Z^JBMLE(iGaR!rzV zLLnP;Gf4GmviSO=>fTKSbPlZ`^*$#9`aDu&v{g{ zd@lSRjDh@MXc>b$I9PVX_z@zwvVuX{+S)mMd0z0RP8msQUI$z!oYPIM@+0p%z-?^8 zX3thuB2Ty`g@b2c+6o{wM(gA`ov~#;VtNP`!K-($pVAimGbYBcP9&Mqjt~B*U1-0> zh^wMvRBfeXU0k9msiCAgR@Vx&xEPfsPgn`(whl$mD+8(9+9`Z=Oxq5`q{Q$b415MB zn3#xiM)kGoWt82X@`9~sL+fx9^tFH{b}>QeGk$7(U@H5xzm*0qjp9x{m1L4~#qyTD zk9~-0ztFQ3t`JmVn&){|@!PI_>nlh0Ji@=!*||pF^(!b(J$1@tb3`_IM3PoSW8Ypk zHULj-9Y`G?jOf%~egw4KPn}u5_zO8xezCMxw?d!)tD)}0J3qH_5_+_D$h&-7oj=@L zTdOF|YlV!2C#VyP(nB1JH^oy|v?kq;$zL=7KEVB;9ri0QNq>sb&3O`X~gAxf)}-Jh)g{<3Zt@QmbM3G_c>DOJ_4O$^XuP&|D!O{9Uv7~aklDBz3AhIp zoS$2n+ihyox7nDcbi%ra5`Y_Z1R z;c47pyYQF>|2HY}?yDJe!Kq9N2kho;w)X4N^IVl7Ec#G0U?E*3Uy&zQEPk!Qdu`{r zyK(kh4p7KsiZWVB+_UIwJQ`fR6I9U9x+yn9sfOadVV2D}iD-kvpqp3L8{m`|U8Rsy zEN(t0-7CQHV#cPiZU_}KxmwqYQVa0O*hHjq_9(lq)Dqb=Rc3ucW-Cs>+SUCEfAp^w zi7b;X4yBgFE-jjMR-xoH9(4kF?Rla06xgxo`}enJu-=F@CY&Uo=|mR4j=Oz{2|HK=mO+G1ZM^Q5Ha zbLV5VL!t5j#8tX$63dj)M%O>E0N+9s_Ug+66+F+#a$m^FzEM6Qw0OiKNEsblJl~(U zX_Hj)!3Z*MF!Wl&I9u|I$;Qw<`#?pmUY3}v2DFlhMt*n0+7>Gm#KfuUr~d`O+*V&y zgU3Xmc-$vO=UfK~Gm{bsX}u|6=akdY<-w(C7$Vlb<$i2a3aiAXMN_@-1BR#ZG{Ht8 zPiS^F0}6+#$1dJBdZDrPSsQ(xHIyZP_{@xnX-^j*$8K=9V`%qNwN$D%a~E{O@v%#G zadJX=D9a-h7JXq>0X;1_#8Tho)GP7;li4Ci3QgIBMSgf@PhezL)+4kVwh}v?67)`$ zRQi>uv1f`6nFVl#xv-k%3a)|+Is_@nv;z3@@!D@D(mmG1=<70mAmcfb5qDf9IuYA^ zTW0M@hU*NN@F0tc0zjpEg~kb>*7y+y8LZqiCM(72W!214X4nf_Pjm@H@<6Z5wVJ%xm7iR~eGcltzT@v4`R?~hBIFu4D?2Mi|_j31@ zR(`P_Tup*E_|rHD2V>BdVbcfi?Hh2dIg5pVUw~94Oh0GBsgj)VROKq+x3&lb?BRkSMR*R){=-^xqp1*FL86n3SPKM37^9+%lAeY^ zF0Z6)OVYk2Eee)uTFzU7`7jQv7 zlB^PEsp^u1&SY%)kr?7}duGQtV4bgR))N4({S`EKM0rW}75t z){M@+glQCL-?!LXE952?S-aQ4zYxo;`#2wOTUQXc-mD}Ge%+gJ5~#-GLZTFQ&G@Thrj&#z9Nwevoiur=WFGvZx+9n(}_8|mw#S7SdU z2=9oG&c@4`9;D8pY6oUuLd~YKmP)aJ7R@t>2PFR8(}>C=^Fy+xW;4-&4#XD}jS+UH=bH zZxz*68?B87cL?t8?oM%cmtp||6e|>Wf>Yd~I214LE~Pj{ic4{q;%+D3-e><~j@;xX zw(_ny=VKXct&JHJOG@@PB4VIh!3|?)@_}5_7Z0zEvc#$En!li+wH0z`pw4$Jac3V6 z*_%g+(}t7xKUv1$P-)qOu6sw1_-_xtwx$-FmnGg^9gqVbVJq=|J`QH93scG7RBQ+= zV?5>lR?qKoZ0At%(&YB2Se(U@P!+L+2WF0`a%JZu3ySYE>Dxnly zG^$Ra|9n%ec316ZT;(8XjT$gqxxp!s^y8cd^^4p@sP1{-0?zaMawlpZQw_WC&N4Lh zCu}oSnpr&tuUyiuLME;wqob2F&D`MFOgTw9oB(wYbuh+{itg9nl%UDg37f{{zmC!u zUaQupN4cY2KKFm!rZC_vP1!wrXJ_Ss~BO7le#%AKta$d}ecT9%k$@dnFozu`byQb~5?*Dq_tLBLrl@!jd_rAZy zjMy2uLL+>~euksrbA2T=VvwS(?Y_%$|F^cRy$?<5*}WX5L>eC;K-k?vkS{t~tj+Iw z+|Nb@fR!AZ2V5V%Km7dWH<=^+r&Nv9XZtH7_)oEtq2#b7T@OYpbdb&U= z9Y??VBfZx~K&y)iqYUcmQiTqqp7Z^`IMFw3M_#vmRiB+WL0#dl4ZP#T`|le0;#bgA z=ed(wWza2FzX%*6x~A>R=7hW{j^kiYH}qmw4(j5Z`@7ceR_&VQg+k(cJ8!V}qqZl6 z*DP=E8^|14jD*)Fb`6@uW#21hla1>y4*jftKF1Yhb07F_q{(sCWM4nrueosqe|L=j z>@sq&Q$I}M_PFe<2@x;kFW`4k8!c9}ig)H+&@j!mb_jRy5vcm#OS>`{lcK4|QN zvE3JBu`n(i&5hR;c!%#^bL+g<5VH)D()~{7msTAVdb*XWf(@XS$qc8!)5`|wx>Lr-B*DLzc>*q7gmCkM94ZbLcDt?T}|A_s?* z@#MTPAy4o#yFA!&*;a)X_k2SGBO@+8yM=xL7m+$oVg;urac9I6s%^s97wcGU`QWXH z2~m2kU4uCeJUoD;Y#o}ENW0u#bP^++Bn<_rWxdcp{(Ndu4Wzn5ci3kQJ|Yj~l}r7* ziknvTMggy}`qb%fjj z?os*2D*A!^D<8jS1}?Dm#om4X&d0B>D=#twABj-MIcz*(X2-vWqfOV{)fxkDg2X zp7w^>OGJ2{A%#(jB}^tw;;8w3@rHJC=$W6-K{lr!Jp-`*)0jqu{Cy_7Br> z;Zv^MbeS@k_3u)E6{7Rw&%+*eP26S=*;^a1;WKomX*W0MgEqsqjkrTdJ?~j8wmITt zsuIH$j)(=bM#MSSMB3FwO{5BHs~pc>C1ZV$3bke*$T%RRB{(^=7zNrPQCD2*(7%*A zH!bm^>9Rfz&%3d65R;$wV~u3$>qk@PwI(?;?@=)YD`EJ$yMMEdd2YAE`Too&3(lJJ z{*RAH_WoH9W29HZ`PW?Xv;e)c&R=jbj|}E1t~^%o4hj>&Y@hZgHg<>eOMmce1U&1_ z=N-(%#SUo$j%dd6gRL=1~UVvS^qM`6tI}+2HZtkGC5SN45+!hgw<33-bnMA?L9RYKYj_?v9F0F#?9P-QS%)eTwRkwV@7) z=&B;~@;p=4S`+A7Bb46^_N z{J*cjh~Z)Mp&5Px)KQNVchJD7n^?O*uF{Ig-+$JlU9WU~&^Ai_iacAfjh6V8bo~+^ zaFJ^37_MVXeU$}}v||r+sxV+zG>| zhoR?Ku<1(z4d~dryEs6F`Oj~WXDtNdpRhhK7hsWNGr<#RJ$xuwfnXE5RhLFT#YfDV z#Y}}#ZBS&&3GOJ^k}&9 z=Zm06=X4t)QP*L~*IHIl@&i%a&)sH^?tFQT9CF&)r0oYaD92$xT6}RAT1aqf(zv65 zi-T8nrJvZF==Tpo&v1WA%I4JxlDgh^CzLl!Q)~pCpW$eenk=>jE;(MBstIVy%&iq9 zHDeBz!u4tX+kP)*F4U@E-xTRy!7yB*V&LVsDIP+P*PHOO zdgOiS%D*Gd_Mue1b>9uP+F4g}iU1m=0`>OeU6WyVPU|sa{_x(2z)Bh!k~B zGiN(OZ4eDXDfK%%vEAnvix^e7HmhwTC;Yab#~-vgoj)s;_&+*FhzYrMa+$+fv?ani#bi@8uK)ztD z5zU>cXe#M1+tQdnX|`UPXJt$P>+Lo?=M+6SY!+Da0Vj39GvM)D+z60fyf~?pK4U61 zbEbI26jdd7&Y_yd7_@3_a9*{_l(CuZV|=~auJzUR%akI*pZZ0D5D+RLs(wNAn1f|r%P*(jn)3N;vPPpBo~%NuO4 zaMlo4=djD);&^Wb7!T-i%>NVmWqnCo0>ACvzoxWyJY7x{ZFdVB#T5hM2JbGMVm`Bu z0%&&{E4LCVS4lV^H!U2{qM#AEI*)n^@=$FUpHTI%<_|dE`9i+8ODB6!=@Dh;iy{)a z0QsNl>!0p}COw0HhM`a~&(4qAF`V0k z_2&QQ1&|ZsVcpLpk`fBW~lAOa!_Xs5*wD1NqwVdE>q6{F`lF5|;QwA8cv^drZLQ`HTXk-aQ9X z`P)y<+1ahhLnNb6Z;8)cm-3INjZ???24PWaEmz~5y(7?;j~1Gw-P~OqKdO8Cay^B1 ztIjohu{Cg3x}zi>1AnU-6oK3BVR@W5^>eO5XK#?uT=%Kb)4xgm#4&%fbV}mgL_UsW zkL_De>3>aPrUOL1|Am~%sKq~R&vXtI?QeukTH{j)EF3*`VOkZuF>u4`$KqRLeW^z` zThQb;XJK(WkVNFUw+hWEmnGw>Byc8guDdzr5Ida?49l|=cX+YZx%f5RVbZgRhPDqv zSYe3e8EO|A^Y$AC`;s(NGSBtTf>r#}Vi&?y@8X7@`s^I(uuc3kn577=Zp60`0gnext6 z#exCkU1c*6ZtAC}BsVCuwO!q$V6h@1uexIHU;e2!^oGP0A$wwnm@~~;2=ws^1JH;M z?)K6%LoYW)dJ$qZ_(DFn84ecE=e2F%@vKb?$kbsH$Goj4awus9qk?fs07y1mUOE$- zh)a(!A>4h+`yQm%t?~#r?achqvorwRP%cxeRMwa#P5I= zVAOkAv;0N#|1;<^ejc4ur7^v_IWtW!rq;+jS+KiV9`a zKP$Tq0&KwrZXeyiJ43%Sk?Y|$@36NUaW46DK%2NH9_CCC#fSlyRR6YqY7$_nyyA%)(#R)j`h zM_lhW2Q|`VNlBwQo6POp%{pNi8Rz_PhT~^3>)sYrG2a1jH!A{|`1fLq zTM>xJ;`h~mLzfG8Nxch`sUICT{^{SBiZl!|Fhabq4Zm}1jDr%_eIA*pv^LNzzsKmbE_Ycxkv*}&yK$@3h*|&rYB{fZ_;stpwWh)9?4KiDzN19_O2d$d5uqJoqVP|{ z03fy)7#Sk+FVnBhYJz8wGE#9-&INPzJ3wZBZ!mf}l8UO~L^t?%DQc`g{Luq6z>joQ zi<_h!h7ZgRKGd@NiM#cJAJd=>qZ@)te5D_ z_^uv#DCHxhQgo&A?$R--J<3sKUT?n-i=RKurHdytQVfu#T|lft%w9LpahVdK(?P)W z(nr{T5NsLy`}1eBF^VnB=|+O;-~lDLrZ1OX1z_&XIpO>wIz~nqsF0(l-kkL;e`aQ; ztxf;8DKw9sqh$j98tO3vrr;__unx2lwzG|N<8C;ad21(?;EgJud{gqfH}Raxb49&$mwocs?o7~%&#rp>KFd&5EL;G$3HB$^wD0k^92%;y?eMR$=I6fO1)DHKPSf6))qvky9mI@Nsv7R_0we zyMDrPm!SeTiiIZXxu$-upfOaaop2mzxR^1HW9KflSBIP}0C{lh+2;XWy0jn}HH?KF zK;4%C66}*7m(~zec))~wA~M${P z79Ut}KIZw`>SfJh$8-22&eRXri>_o3C2o?z;4cD1r_$I=lm#SttSVFb1;uMVKe&U~ zq^P3V5R|Xrm&y@iRlQw~gZ#9-3~R4khDGrINy%|!CIG;d@DE=>Z}BgCpCI;JR_VV`2wye&o$E!=wUQ!Nc4sc@O55 z7(YX}XEs9Yzg@sO)Rx#|?I0L3PHF3y4JR-LTbnm|&)?^GRr1AN(>YTGB2Md~LSJw+V6pQg zm>N!WKK+{R6PeZJAe+;Y`GY3J|1HcoL}c0at1(vm&iENv62&oLp&d|9QrCJqgpLQ+X$5R{D8P~Y7#S-MZse9^fPV)XHaKsHBQWs%Au%R7 zLitSN7T3==-~i@~{`yratRdO=jA4@jDgHNnM%^paN>d9O)vf<(u{siO#TLeO{&ag{ z{qk_>y6V(A%39l16irJssOV7lcmex-F+!Wbv|r*PYw1Rpqkx@h$wh-edyGb2+3wSHG&ogb7_g4D@VmiB z1KsC{UZiwy?EURtVkdQg9Y((eK;!py+2Afxq#+%;7G$>V`JF9jtj=lPV^Y($jr#bo zlVJTT3OoIJ2$Q&CD4rbZ_GMEBpLg(K>vjLj=?p4A6$5>rxY0DD!dopo@#ej|Q$pmk#OmoRj9rfQ%4}Q~tk9s^$X zc8Z-=Wt*pya^t?dbW*}hnwG9SU6z?wTv}1&psJrPn-0Z&FlSGkHXD6=1r*FkxPS{@ z?w<2Ou*3y{Eoa6}-W8TQMb`qkEF7KgY)cUx74@O$rqD?AT zPh@497~rx8Q)go|9e<~ystY6rAQ`cpfPg3>h+8EWVSzf%T@??%4aQIX=tve^$LIm? z!bmfXggLYSq*uBUgg%513!aEo*hiy|a$jIsGj9PTHnKJ%t125BZdzhL8AN%e7sY|a z8yIy_#?iv66RIQ&K?XECz^0yxx#2s^Ergpj5sq{U@Vd{fW?QXv;4brZ$4~k?+%IVLrcv)=p5Hu zCuGnaHXM2Evc_Y`T9gI&YHtvjej3cH%e_Ci#Snyon8`3CL8K~yF`N>*>>20)9GPR` z!aKLtP~x1-Fadn!*`mucf)$7)_=Gj;q!yU&427`&(xWldHwd*V;`J=n#_nRwLi9Xp=?+4%8TZpieQ*eXQ&kOe>3__budPqV6sP!1CB|kh|{mS z&_7$&8e<%R1qN}Bx1$GKPnul&`UvnA%yvSvXfH#BoIAXp=FV0Nvsp($Uu}K zeKEbbp{oDJNehxF#dvfffc?VKh=xB>LPrnfVlm0*CITQf07I0YF9;4g3)&5=YN-0o zX~}<&P*r97&<=ROZ(5R+6Eds~eK^_1ba||;Oz9-OcPP;n3iao0ATQp`AQoi6*ht#d z4H=ZAotE59oL<^C@b5J4Rz5#W@e(nrtOE~Jw9Qk8Ib(p(hE_+-e1R5n=@U)^(#~d@ zz=naq7L<8k3e>@+DKQ(y+Sehj-`#+kcmKiM7iCrZpFl{W7n(<;KgoE}mvQ4vDeJp$A#5AQX_0eA{lBH1U z^^FkHzq3^FUm3Yxe?p0=o?+>3Zd5ihXO8cayVW5VRe+o19W5QSZg`r~Ho7#fxcTsd zx^Hi3MtN|$p*WwIl=?ZIO$EnX?Tmzk%1Y_!H1XD>gy$k0@KN$0BbSI?BWL~Nb^#;m?d90o z-zyr3AtEW(>T~}#-%$opn4CCi3GGxdy?T)bQzPxHy78O*dqdtnQ1gBnb`#! z*3zOgBNx8@VM20K?_PO#QaP%Y9XY4uTLZPR_VqD9_;Px@q&w@J@0acFTYf8AzJ<)8 zI}XIgBB$wB6{%UVzvWJbeeM|I<9n<5YfP6B)U2eeg%s`; z5g^*@7q-URlx9h?y`y$l@oby9Dp^2&D^7{7Vj%@l0}K0DdXmd1%apEgFHMFl)U zaozu5Vf>IlrizM+0aHDE+nl&bG>aPCkp> z=LQ9aE1$(deE*NMEF0SwYowdtfn}?!B?|x-_gEcxHvlBAJBCi6nd~E zQB+ZBO|>Rfn|1AyYd9eGunZ3|F`&}#yhlwQozl{@B${pU zIs`jW5qdxq1_=wd^t2i2v>S1dHr> zUG4QF+*d@e_xg>_=WOo)4=wq7(ZSnoYYsw7x8He|=2T&aaVrPQ<^XNNhqy1DIBsil z_Ah=fGtawCIwzt$WI_H0fUNiw(SQD$JTM|O#<;mtaB!pv=>N)1*#q)UJ**$}EPDQ- zFgjB16`wMc0Dya`G+c^irQp!Q;Pb`>DGR_H{8n!KJsHwB88*jIiKXDBQd}BiB??Jd zxinA=3#X32-K(7$^L`J!A%0Pn?qP%j1$HSF3Vb7s(buL=|3RbKBn3{;&mo?AChEzI z5G!UC*5sVA=4gFdpM?wE%9|Lq9a4^WjdW->Y^!~HYFzUf{vB;JQrG#hjQcKSm0|RQ z*E-FV*nKn@kU0**#FL+jkBLb_`qwRk5J>fW3I$K$9A@kX-Q9oh+!Gx zKOGT$`XQsCFKczric%-t}~yS$xUsD2(R{qH{3p!Smhr;Pd-70vZDie1u2;X$EGTDeSNc&1Xp9pGA-dp| zOY|B9U6@#%IR1|v`%Bmaq0MR-}Q4T_tR z*481&P^0RxUT|YUR&*E6bt8H<0|A4sPrAsAxw{58Kl2?upal7!>wquAvn32ri`g^m z=?83i^d@HmVNzNJ;z?MS#>=w>o_I*nlC6jHm-ts+KUJBHN<%l&Q@mOYejPY_`oW~6 z^_fST1rJ?tjQtL??FKOui500DvXHzBXqlGywOo6(a41~eG8IFw+DZWv3Sm!<_kKNm^v>$94s z!nlz`$Co!rM-;Me-4&mytjMQAVGaoZ0YruKz`LCu3zSbf ziLu|B)LoS?wj(DDGuXk7(HJx^Cb_%YPvb#nNe#+fQ4ZEWM=yCSG;@HG){0z+x#PZa zqjh)GKcD$fVx{3D(ze2bSc$$qNhw$a619_HFSzwzCb=F=dkfd=Np`oa+H{wi$0l}< zCGK^i(ZdC}Akz3+y_wOruf!jl*e;cO^$&(3tX_l1vZ{P5hHqn2%O*eRXh`@kJOgCC zNb>GiOC8hHh+n*egJCCm41yYs-twlQQ34gMf&gFE9|%BhC)Y5g^@(4E;SA10Y^_i{=Y6s3PUwl1fOsCT6fB>pzZlz=N^=a z<_zee&PJ1xGcfrQZYcnY5M1|`sh^()IgdbjFnF26LJXSWn*{s(VMi!=Tf!kKZHkhc zsH@VO(OMM2Oz@#ZfTD$J;%C7mrv;{8QO zK7qoCuCdeF$UNw^8DZk5tbwUVn*BhUftlT?%qChtt79!SScZlu+EE-{J&7bM;G0BH zV5k6zPpnf0hiMoUqeFM%^4EeaZmS_hU*B9A5u@C7zw-~{AE?oAPOMgb^mBph@RGtu z31nq831L(s1|EbDa%d?7Zj$U9X9zw=Vo`E*c~xbfsz8UgKtpbrdU0E6AU=%Z0*I3K z1LF-ii3cDn_P(2LEp#oRSjW$CQ4(mtkIc3RZx=ZbU4p;3SiJI)`ax9&R3$ z_t*O<0N-i{iYwaS_M9A{X|be%>eTbFpPDE2|4$cWuYhsb1c$}x)HnJ{Z+1CG-Aap1 zL0vQZDeMITt^$-=U^)Z*y!)^C`9Cm|^ z)gW0~Y(XC9mXZlB&!?*W=Q1IliWALb4ZoCVG=dd_jkmHGsv6aUxQZdg3lk+iX4dTNAZHfi zcv|e6d{W9(bvEY34e`2g&MV7o{TM z2Z&Cz;D^arEZ)z1?^_T7G~YjTy^W1ejbI4=tsuA+bXtMEm=_Uh%mvZe)zKH++pnpt z>lhPzj!_9&VW9j7$$Tu_Ynq<5F+Fux~&*c zV~p{Va#V?l*EnZ>KOYlegRr-QjI^=%7gb0V3weZmgnzB1VfN=U%=C?S}%$Rve5 zy+u%g$NNGFS$9s0fXxI}zQ=uUZnhGC!AV1iLSWq6L+t%L9K@Rw?M#3*SjtBfOdap} ztc@wA)U@SM0P2~ug#e)@t4;zp|^8~1Gl3)+Y!|&6)@AkN?T}k8Zn`-AZ z8o!P>?*3EP)J}aE^2E{kv9k#}==fcbRC#L+ee2NbB-tdgfO^H%pnfyKu$YE(*z(PC zMI9V1MU<**2}9WmOlymW^}OCL%6^Z3Of;C#npGUBB|PPbW{KT)-;7MH6GoM zch4+LSbltOS26vvbKeI=1@WZ{TO46d(2u{H4?|bb_`oP}E-1&rb?-q1yu=(zT76&1 z$_clsX%63KO5e^DiGDOX>SW<}S_qIOGuZGsr-hFMnvzQ5~e`k?Rbau<76ca_tr$#($6N_*+_N>=&Wz*MR4kADlahZ$dHQbEman z?EI~M;^V3xt+O#NC$W@t-Yd=Q|3y93ZlERaBdwCaI1YY#`Ni1qIWDz;3|4212Mw=L zYo?MN6{IuT{BaN`Y%|udk*CKPJvZq?nYTuVC8MixlYWSw2c8BX=tY!{X&N0y7L^NL zp6;%U<^!n*WCnSIW4=5kz_z!WcHmbkkQU5$6^Ee%q6x9}Hbp5*%u(1jfCG|@vo9kC z(KxcA!1FvRN*)NvHs|geg}|=KA{Ys>?0q>Qd+3Yg`4K6G8pie72(9I+@ano63r;P3$T3!u)+ye z%VZNg3=yC4$6(Ts6n{w1{-l@w{aRlse)KP{hTv!xw{^qjv*oup-@=@r{F9V2DzhluH}a|MxOO!7pZ>M9g)ogrPcLvnNPwzHgYzE~ z@7uUOB!eGh2ep{r{qJ1x53!~Y=a=d+%;T_o+*j-(4##g`Z`AF87?pFQz*$ZIux(8X zR#G=Bj>C5a)|LU9thvzYS6qTP+wmnSu|!1LU~4EaO+n%IIQ!7Kc?XgJoBgCO&AlJI{LPw^MF@AhQHe{T7gA$ zA7N6-_JmK`T$C{H)2cz@MTr)l`deOnH_1=BNbm4jTWEH2P%woKD4a{B1t$4DM88bt z`T8;%&qoqAdm-!6Mn$nn3%<7@sPhn6Q^Vs`Bc^C+KuXc6Md!c($OQ9*ZJGJ3oQOP5 z`@0FDdK4&peo+fWf^yD#p4Ee0krj(}@L&|;f}=(Pt^Nis z$S6#zaCYl5sAd8fk6`mc;0PplXywZTR)e4%b#Ej12tb zl5%h0D|mM#>F2XFbzO}0s+BH{o3^846@o0d?%FUz34&o1z{JhXjY=m!o$}#mx-b+r z0$WqoLVSIPcT#A;%+({_?!0XWa}OQFi5+JS?@f$(a!Q%c?Kh*kJPcK!%LV^-Wecnf}5-JhlKP2qng zpMtL>pgArXRW-mfkxv^t{K#OEVJHWANxk?v3h*m+d-J*K&XVsqcWJwJY`tet_zrfz zM11k;7gM$jSkTMabkA0s9bHsxtY!?|kRSxgSmS|hp;m=c>HM+;Qi=TMP(zVW|LaQ@ z;y29cuQT1otl1(?))4{e)jShIVz#HNjb+021pO@iF6s;yOgu})L}Af&Oew~O9PLpz za-#^wTH(BSDo$HxR-t%@jL6o_VL(2;n2cmeHcTja#3JH^cVPi5_O@As`)LEmqg9t! zt)1|gqQP>_5Chh}Le#}OLq=fgz5A`k@`r^AQm&ZfkePdpOk(j&w!~WwqfXiHpBXI{luZBaqaqtX~lNl)>D^~wN0R?ko*y!C3D~iCo4-3T_E{<0(8G(xDKUm z!S0E>jlC)L*0LIh#}CIN&#AxYH8m50#n?h$pxRMTq{vT!(EgoSlD4nwZe--D`*JaHs2exOY}hHVQ`9gM=^t*-4}o1 zGos)6*L0>ubh^4P zvo=0&;fvsd8a({Wt(2*r^ouAL;e%7Hbe|}#h}-musDoJH*{kZ$6GoY(MMc^@FUNj` zv|g6k@WPY@M^-9;EdKr^l$|WOxy^+p>`7K3dDTl({7xu=sqh)nXdIwl5} zn9e$aN=>?@UjI7scUPI1 z^Ed`C+%Bqs?*ZqZe^Bu+M{-4l|J^@I`9B#9du8yv!y7J7f(|l;C8QmW`kn33z~)`J zRceM7v|-&>N>q1ZG*v=ESM{NvyV4;;{aAst{)}V+O7_|EyN*!~Sc%dxfn^Y`JSoUK zz*Bk!GGTxUkL?}*vJN(m(ai&r`|6EMYgu3wOX_rk{aG6NwL{yhA~}h?3kc6IfL{iF zCL{GL8e-jO&2pIB-zO!fqNlZxTauDo8bl`2+`tyTkUzSO+Tu0>}SLRhD&q7N;{s>c8OVZcK#W9|% z5_CWjOR=>`2&8ME&oYJ&{=z%hZbVeXqzgv!>LQe#tjFj!Gr7tcd1X@{V-p`B63zZ~ zuW)M5PIx=sLj<;D?iy^ZqZ_L(Wb=qWt%iSk123sp@WI+{`PgqFTarcr?XyWjD1~85 zr(mD#bZ-$rTH=dbb3D5A{3kS{?`u+2KLZmhMq$Gm{)Nu>SO!Ty|eo7YOXvNG@MFw@>(XN{ZaxCf9^MMjn04xW3aH@2ZU%9PbQ_D3`@La>XHpDp@V) zX6^}!nL*_<*-}oSdvq^3>m@Y~TQA0))ml)<00toP!oYgM zKN5zGYV?*m$;VCM->lVczLp|)v_FvHY^&FVsPskTgpqo+TD>;&uJV$UVj8?{dny?T zX7HN-+xY#@*3X!PN(Dno3XkN^l-RYZY(~p@>MuTc8xxHEY%GZv&3ZU&zLc-X!-&X{ zj)Lzm*H|em!cauw3^pqEge`$huD#tRv5k@l^MN-kmTw4F8k$p69Q6J+MBlmE)+R(O z;$9B)mwh~`?L94R6kl$w4Pbyh{_eEe(qKQ&l9mI=K^6*I#^uN~6!j*ZP`dkbMK*hX zJpaR!W|b?Ae=WxX z4nDOL4`CL2J(XSVu_~)9#mEVA?s#Jn;>q5?Mr!ys(0s}PxM}+nv~Cbo2aChkjK34l ztE8&x;@Q65p&&%on;VDpulZD*EioQGGSo#}qa{ze4jn&zVC!4VNVAnEevNf-FjF&= zMhW$-hFBjj^?DC-k6e29zE6n zyuCrht@S2G36>U{=Cfta!hg~Y7spSar&yzgfM-m84H_Xv@%85B&k8FRkT7DMUKmz~ z2(aw|U}AQKgQ;TiE8|Gyc`t{C_;oVWV#9EGrd0JCM_Ine1iik=s+WM%FX!&p;Hr<^ z1de`&t-V|JN{Z!Z(tG9I3LB5Uq4L)qk(bk=G}u)#*e>q85?E;JS=dQ=i4PSfzM$*ZfQQrZ}Ed1~Vzcx|P%2 zJ5et`^~mPK(&>&SRwZBfKbVlq2*2h>X!JtBYbYx0FNohkj$3I~Cs|ZPczC2T8$>!4 z2VfK(qcWFsa=+{bJ_|b8Ytqq3LYtzbMNdDdT&l6ahfweDX!HPA+*g|&STjro7LKyA ze%zAHxf_0`*-1nSqyf2N@IRm6%*ia|HFSe6m42rd-HMjrKxk0=1u5EsO6dUgZR!Y# zXc*<$<+1A=ugU96@m4kQAD;x{NT@{+7aN1{d%4^ePKXGLS{an9^=Syr-&# zhg9&Cc#){6=oG*mE^-oYQc^;`0bE^`T%3*6eSG6Bg)Au&04ebIqL^-5pu;tI8#73q zr>!FOQqEW(&!C@?T3u2)TurciZ-nvo_h-ocHc%Hxc0@fe^gM2mus6ziPN=kfxsC(e zUz+Lf_)6T#vX{+xRi#n!+GCp?PXg3pki>GBJ*GL`e&wVUiBLqAl%5Q8kSDy4O-{{(V7Rs@2KkRo_^kP#eo`w z(xajaU4md%-~=d8p93!sNcYt0_&uT=DSkgje+ZWrAeBK@6yfgY52Yve%FE5Q1naR$ z9f3lk(OfZY>{za6jZ6pj=6jEqAa5&KjK+Ne^BhHQAUVz78>`3fueT1kOj^OWam49} zopskI5l^wkrdBT{UMEAhGDBrkeUsMk$UE1Rr^fGA7Er|pwjOc>=_2o+aDuPCh`zxy zpEzzLsblc^LG}8+jI)c^LB)zvcC(0U8I$%W+NAC@|2Iz!$iRWWafiu!hG1=~Lj6Yo9_k4-GiK(>>)hs`vb`D=LCN@`8~(<2njZ2@a2E4yY+CL@amJl)ho zqDG2S^71%lW^BI4dWcwU5F-zgOv?gdc@=EGiy5@W;sq2~-~an7U64V2I?&~F9V-)Q z9FmFLRu~-iL`yWPwSm&)%7CaCXNT;2{HG+QarcVydCI}*WOH(O<+yRGzHfGuCzOqZ5m5WO|c1ZM3`zPw$zwOdCyE1~wWi?cr+`}mokYet! zSHiMVJgds?ayhHfn=BWTQJE~_aZIK0;jJLi2^2&}_v%K&%#gOT*S5R*I$e)j=Z;9+uTEALo_0bdkcR5+rU59 z!mMy$FnG`+o9L)CV-^f|f!$j%iT=)A#on~sX}}s*6NksT$2mD%sF?+~$54Y2=3K#c zkp2=+La>UwT_Ky&>I_X>0=&v;dGTlMuuY$>oFy+<;c#;ue_*FBPnZ>0l~)N11I+s4aHb}_2{m&|*SvpEs| zd`G<0xY&D7CpD>I`Zl5r#Fm0i%QWNZHJXr$hXOR(=IDopin;+Bp<-_bdghLiAMt{Mf8-9Hb0QPjEmue(?2vBH?MA^R?J6&2q)1# zv)pAtf9T4qm}2h}ios7%3qGuUz5Sc$<>I1jh|tfi@tkr;RM6Mkln_Z z5S}1xAg6|<&g05T3tz;+2%hk~H5N(pi;8thUFgqn2Q?ixBJUIfraT~xQ!uWoGA0h6 z3k!{5;YO4`9sWYvN4`Us_`b!%)w=V-6u35Aw=ob2Xop$6L@;{a^X+HSI~w|zrYIFA zs39wja$HFE4;UK{B>gWlhgrP9H2FzmjCG5m=o*cvDk?9m(7Y?T$^-h5?whEDfybdu z&`*<>Kn~4ErwH_pQEu9VMb|9Hd7JFU+fuI_B_RWcn;v+{+Tq*nqyV|%Xh3G1wAY`f zw(C3V%RtU=xJ$}J&Q*A<5Amq7_x6gR%)~l8$BfA#FnhAVcoxKlNG7>C#-%vSP^KkK zD%?H8b<05K=nE^DkC%VZJVgy-pQ{-XjMCyEygT2k)YV{q<1?fLWbWNJ!(0Sqz4XwF z-DW&081^AqFC+gbQ6ggT3iuk^x|XiG%vLj&rkr1wY)D3W%s0PhbGH?gu{-r1dHqL| zhTjMGaOH@-^)OXp$G7T7%&*`&8I!TKP0zWglK`x!7b5Fq|D6F~e6KeR3gzdhcTqI# zFh2b8g8p8~1$aOfWwqwfo-x3t-by4EzC3DI>LX8rz#NHmg& z&4veF{|^8U=#zy9H`>(Ihe!X35xflFSxh2_<3cC+PzY(TN}(a8ZsdbM(|8Y9{NP?t zU2R*wwHe5L6dhz8ZkeW^)`$HZpPt^TcVhozBF;Wbl*;M>N>2*uDnvPhJ*%U}j?24} zAU~R~;B-x*&g3j)l=+G*AmDad?zU6WwD$g08-H9+MtW4qLVGN4#^S$1-kckt&!<&z z%rmhhV}R|dT8sT|8QV%iAPWud`#^ZEriR8g-lRpMfi-deC^qh2Bdd*%tx7D^2`vn& zs!7WJu8QW=f<*cn>fl|=R^bk>A&dpR2y<(_5<7I3@$jzN_ zP~_m7+HrX0e9r&-{>2#>O@q#tQ#zP%Q-%Tk&MQjKbr${{$t}z}=zl5YjP5Oe-W&iw z+9!Sj|5x$nsdqsW7AJpANtJZTpa|Z zserNY>dX{%2+y%&QA~WWHqZK%o@P{de5(3mvscgjX=UoEE8M39U@CP>0nO&t#^;_j z+6eY9ZVlGrk`bsRCrANeIr`KeyTj0B#ght9W$TOB^au)UQ(){U-(9d9WER#WkqoFh zRP>;EVq9`aQC+VvP-(1&y=dOqYiD%+r?Mu)uz$|Hza)(Z>1F@UqFeDMUu+^r7Ppiq zuiUm+ZB0Ta1!&OvT!z#lzY0GoSTKZ#Q{_lO%>+!Ux$h2qaii-;pLih6Z&W|{whfLsySXaN0IRy&SCs3z~jCk@s6#BDFEBJv{V%J;!zgmNHP2nm<5>N zJdLzTT3@TryR_&=S^Jb4QN1w(P5=FhfX#cObqT*u}`{tv2J6p88?c}t$1Exdu3#gx3ikj+A zfqV65#S^a|PN#i>tL{_F-%!a5ggGY60wRj>zKeZpR@^{mGRU_&OcqUEf*E95Ri!_g z{$*l@xxX)6ibtP|lKrtgD4M^=OZ${$T3W5Zus2a@?}ym=P!l8PT#W2jsSV-j551pO zx8U>r470Co$n(3u+~Osx!CW&Dz+o7)oMf>}mT--?w9?r3<73B_?GPXIKDQg2x9OvW zhwl}=q%iY>@aO_yAVjsUc5&4rq0R^b31#Kd5)@z?XP2!{YXdd^OJhn??W4qlPC$rkmOY;&)blA)z5u^e3fRW!(q*lGN;ygaYDKxo5wq6S)-t25UR=~v zsu!zJIAXA&I&*i*F~EE*Ew04F)d+R3MBST~LCw!jwqYkg7h}Ii^f0=3j%|9Jg^0p7AO}{Xwz8`xaA;nC(eR}^UW_e1 znOX&YCpE}4<@hcAqZehcDEfblnP>`($*|xntU!qtOt;mBEgC_=<5=hOW|qvI+jqRf znQkKahakX-8L`(!OYb^nCF(*0tozbU64h@%kx>+ zP4CU$FbWSKg>Ur_36MuCqI=nUia@057W)MA|crLGaq@T(gi)d3sf#@#<;kdEM36sFic zwOw^}LD-b;|GWTDM~xAj?3E+j=taNivltSq!u0ntmGwb$Bnu4`spjTh#U#gw%QBeWReBK?KuSn|#PTjopevfC{nSL-1WNAf!2k$xdu0oO^a72{N6F^an7( zu|6ngLd*>$`!lqPrn+ENq|Q$1X|#aR2An{pd+PhcBYa{Qtd@}y@~_*OXv+~oNZHe< zEKd!Q=fdRScLD>|XswdNTV1EMT+W1|CK<5qhf56Ij;Fu;I1hy~+|Z+OMW~E37>WZC162mAXc>uqoVS1pPgi_qkE>U&(shJ#y?IKi=%CKEzQobMCR>}5 zs`~obO@CYdrC@TfdA`|ihtS{lUuVcjkkN@IgGpSJ{|7THa7}hRIdI?~zfVjmTNo}# z(cV}7E7W!b!=%&dT%Hn!wpxJ=YXcGHoHRd5K4A$6mzG|)2cmu4T(lh_!wCsD6NUjR zH#dvw$DTYj=zg=ry2pgnnN6AmH0+GS4c|CKUC2b)Mhn z)V8EZo8hruDWAsNhe$$+SH`SstGD?uS5)I^^v0)B6QZ+!mqR+b{bBgdAHgGPXDdIG z%C_^QKxO+A#>qbGodS4^B?SarZT?b2u~GYkdy$oFU>iuMOexMy$}~$$h0>od5E7h{ z3}yBkcP6w297fA#ir~SFMKjTsuP|ZK3?uk#h1I#Tf<5Kfr=ueG;xm51$_ zDq|#33F=Ucq}LZLa{u81`9rb)J#PcWNC3A}`mX24u)`O>qfs6%^&d4ZN3Jp)T2FL) zK^53A7J4?>1<(zi(>pP-C%ORw)Pb)1=0~cJCU514Feef)AJk7k+FD$HRXIirS&Fa2{VGyW5!&vd@E+8Ut*QN=c7ZpN(3eED*d zb{^?0x0JLw#ln{0Is@~odUYAK(|ya3DQyVpP%2Y&2sPTD@cVH&R_gQ#i`QwkA#s2D1MDq#0VF%JZJg=Z>@?L z`T<~w`+YmW6(_sTwKod*4pw3IU1X4`wJQ95V$t>2brtS3`y4`=mEtaVYP#qg1>QxD zyI=3Vue#N%ue!03z{1FW$iwk-*PpAo5kYF3^_{cQ$zHSj0gozX>_J2#SBbkgBMO?L z)#RuUYpkG8p;5UAD-jnITDhmFL4mM`xLY(PKDV=IRX*9)ye*;O{0G_`25Tn{krnrN^>CPdnW)ML33jN2zy%kRL3K5ykSPM}d?DT6UBvMBQp z$rNCoi)NWf&~F&i0(>vjxt)#&7-{G?SHOAoR$W!k>cEo@4g=m?Yi;`?} zx1i^>IkAANb)5jO{ko`(E}+`PWRCrV21|1@E;)IHh86m4+VQdVhZ!aJ=Bq)lg@p^w zus z^|8p_FtHiB-Ry@*qk@fne0=rk(G?Wd~1IjZ$KZ(&?5y#Z%&Z_or$Zvjri`qvW{op5aJM zUFOP)V9V(vm`Q3}$gCa?K~sM5*!~$qKf3Z0Y6?=7SKCR2!p{!oAr8tld8r5YAy-I8_?Dy?0g9sbl0;dC6?K(*I>sj60)Ui)M1%9JKsZs1BxY7D}LH{2&6d4 z1pgCUe8s^2Gg6b$%RdwhK67f}hIsRe-{(1>OiSr{JZK_*a%_PScz4ijitU^#c8W>jAcpW!It+pvEI*Bpi(AC{s!r)!r)E&a)N{ZrQRTFS>zqna%Z2l zdepBd3+!WhsPX{OOj=<>q~Ao>yAoS?v+7?DZ}s zySkP3o>4dKq6txfeGGZ@dMthb$|P5eO#iR5CF2%Faz*0IF4t+3|EuE|H8R$I_bSP3 zAsHozFDvZEO9HbH-_wH$=`ntSQoiC7Y>f`-HJP_@w!)D66tO-uk>O7EvD%<8+r_XzcR2LNZoL z@Xse*oL&AZnKU3<9I{5*{Z+Kh3hhY>x+CH<0<7Hdt*OjVmXC5fv+7Iw^e3!p#+HDN zp)7Zp#qEP5qqF!Qd22s6mHqpM@%!*b9Kv3`aXad6S341EuvaQP<>=akB876B zOqEb{@6}RP@y;KO1K+3q51HJ8`OHS69LfdGD^NKQHovveFH(D+QJS5{WS!zUMeP$> zP~CGtb0#-lHzVIY+eq|xoh}8kBV|6sMgS~ z#6KJK&q2)Ss}uaYPqeg#ID8rbKIYz<)%pP|&NFh!fa8;6Ffwwkkk>2?fTzg@tj0`r z^(XsF&~}QRuhIfEgQ0Mm8|h;@uU(e(gx~x3@A0sQ95;!;5iv1@aCYeWbGu_11}MYH z)zv|gLqgv7_8zA#dx^UTi=9w9!auUYjKDuu-{;Tl0;?CkSHhQRP*c?+!;$PQp%9a) zjW|r?|EE8|EI=|e%w_kbDK*z~eq4s){XZ*@%jJx3auV=E`iuuj^YL>P|&}cd+WT%`1WNVJN&VSq3;v*~A(pe{|37A9K%u$*PAT{0 zH79F{8%meSkg)T`;#G$7pD!{ag9#JDZ$Ay4P4M=@D4Jzp!}qu6;-MxWd4DBY>=Wk9 z*!^WrU~^q~-agG7lZfRNVrPRJoc5Bfl@o@cO^hcZoK@sTz?RFG9FOto5~nBHIfr_h z!UV0)qHNsu&eSNhluTk?zt+EN#FnK-7{UjA;{T)!L=M=&)+b;##lV)ugY%#0UTjnj zaX~*SZW^1y$;A9+aJ7_}!2-Uj`_xwd{WfWPWWL?`;5~_%slTOs4wVcU|dDW`tsMvsH`js3{iR5 zSJrx#W@N^{AEP!ZpHR-`4$p=B!>7qqNV4rl-9(-d z-a;BmA$uUVWYo&_pYMNKy?jia2g4HeHU1_i(tEr6>vibd)!DHP9n0rs;?)G?L1fqm2&?l1;Qpp8N+?U}fS$x<0!uJ7j zWP(QAgMIDifB~O70+5>0CMjXbX-8)6b;-BvY#S}F*LC5ngWnxrt`k~kwE@Quz9=dbx#P18+(hdDe_22X0(ois}9 zMMvHo+?r$cwcrJqC9Op`W7Ji8Q0;mxm&@bw8j#1nWG8qYprlzQ7Fatdfp_S3-|=-^ zKv;V@k=Ww2#}G;h7dl8}OhnNvbW%UF-FDWg@&FwyCHa2XNd)^nQFbu+9^wrp3#JC;>ANTVv7mZ>{4Aa88Yc=akOSbxd5i+i8g<+Cg zmo<>#a^1`*h)Bgy2>lSq&DHm|S8Sq5SoySdNZt)mVGvFFeP@vGyscw=VdC3$|F&v#7Fya- zMmZj`$S12}>TOjAD6FbjwzS1fLY{x2#1j*z9eSn2(Y?shy0n-nJUP(=o-3gqZWNx^ z7Tn|Z!fs=8DMR5n-}>R5BH%xmMG2ETH6k()b?1u9>}ZP(8MD2Ugo2?A4_G$&^)j|) zWD{fsHisU7AG{_y{#)!{y5GIS2o-u;v zy@tv-oR5;7`(Ch$LZ24({4z|>_ZxDbqit1Ok;xSvSc}g~TFnmi*k8kvPddk^2yw-dGlZuki$8=kl)AiK_& z0K*=axz~rjm>DMC4X)8&wAur;{_4)BX2m2Obwm4)F^mnWzIPtn#1 z6KY550+h6A1T7}|BWdKH{@h7y?u*{oIHP+#+3c_SW`*&wRAtPd#_S8s?B70S`U#dq-Vt5a8X7D|gqy5=5yz|AAM7Bp81TS8LYF<* zHODod-GD(UoUoSyF@O0%o`iJu%4Hzpj7%C`=S zXH#;>toR#@=)0wQ=8H&? zqMtn9@SthKEXb~xcHK^d6WeybP^S?@c&paSYYiQG+bt+vmSHHxcQ=P2azioZ{4)X8 zkw01Fs{qBVE!~z^Zs@m`!qZnQX)%>N>_i2IFE*wf)z+k%QAn3;y+#B~)6QDM7?2`2 zV8n~??3El|<=oLU^LD&XzqNIoclD9`zX5x3vKwDrJ0N7QU^rIZf2a>jgbAvos7E9F zfV~}v#-eyYES?_8@lW(&*v4KjzK+@R-9#gwg_$|2#%N#|YJ0{41rgcfizzAi;i}hl%lhc?{@m39?>kR@(7+JSf5^3hu_!(rmKL)b`j(DwWrz?mmd*9Iuvh z9VN%byM>BR`_kCp(bzQqB?-{SMho$LgmXLXxYPAG>$pqI8icuqx?c?KL!ZJ5UbwWs zF_f(T%sd(A`97FPuLIFY}uJCqd4)Us2W z;vB`o9xuzzU_t!G$_h!QKMP*DJzUpS(ZEAEQgpp@R(Lj$!gL1VV7Qsb1Y_uq#6_8#mkf}6 zzWjHT-O}*dKYTX|-aarmh8m8NdHgMLT*&0*)fj9THgrpY^s4K4l&o6a%D=bvJbQ`x zjIE@o?=RcDR-+WD+&+x$9=bl@Jip0i*@ZFza0AMkQKuHsR_-|Hp>+k8tl zew>s7*Vr|rQb=7}w8g&d<_*uJeH}9_U-(u1H{$V}OZ{(ZMH;kn-rqA*7dGGKb%zjQ z3-B;4BOS>pu^Aj*KlJV|05N|fp`hj)>6iOe0|!2kD#2>xD5G6{63It@yu(Wfd$F5> zUtrLw{Ri6Q1hD7;hVt%P7)0R9jr_wyK^z*D9j5Jl<>=Yim=c$pn?kjgHzW_&S9aU~ zXvTWpW{U}*MaE)nz;4AdP<`NZm7Sf}&|xMu)x!l{mik^OCh?~fZAXKSBSEU>aO*H_ zNL8teDd+nOGVg8Y585!h-poH10kjckGS}C}P1~FhdgDL~-v|1;0NiRRS7yn5Ggna*;i{8(l#$Hz zV~f^0yZ}EKiNpC`iH_{FV`?!5^;xg%poU)$T_rMGEC7YpVHW)iCvhUz#R$U+e43kyd=#6LsNR=@{8!{SKf(D_Gr) zrAIMa16peWUSV;;!Q{6nWf*m%$+f76!(GR!(r9?7CV0avc{Bxz5;>v)$*K})1?8et z*6-n#W}@#Bt@r%KU9vth)|T_t8ZAMauf1Q^VTtcayFhTn3lPuF$!199-eiX@{_6Wq|SahNmwD2FfXc@oI5(c zn6!ADvC)%%Lgp&6@9TM0l z1DAEImg1?ZE>l5*1U#)rek0p|Bs=31C^ENLnmVT_kS=7)NCikRCKje$OQs-Ic8uxU zGdoj^Vjfp#SPQ=z-j72}Q-%sA#?BnuoVfBE&Iri+xEg@sboFu+>CF8=onb4J8(0q$ zc~v?Q#I+wM3j`Exr*q<$kL?T=x}?bmeB$0`2kPm^LM(c<-2Ph)ZEHXlPQp29)j>0} z<$Ld?cCOpm7T&7w3o|^7_6EFXE%*(-EqfKwAg!~O$)l%n zh|k>+mhX9xzWo6B8QRdcl!_DZ)tY|D!2vM1e)%%cg&!^aXilhnp=;KYf9Ci0bP4?c zdwnklM5?B?JRX(>#b_2FcvVE1?lx?08rE2f=@w9fD1~qw}1CC_E;^iTX4& zq(i4r^CY*K(JUdbS6W+^fLkS*!ylX;m^dLm=Y2(DUR&+3gJx*DBFY~I`^}hfYynOE z6gS9|en-kl^$SleMA)lsz{=`qds3!o68IsIF)TwQId6!FGp3!_i++bjwdI&ry1A*@yfD~fT1MNj*8ob(?8IQj+9e3PQEe}dU z46p6$z1pY(e$shKeFx^w!Pqnos1?dZIn=jtpM^SXM=4Ev(q)z)TXfps-xZ|$d{TH9l99b2YG10t*)+kwG?uS;p) z7GkWj)$hR8FyVB25}GUcpUSI9S=v(I{UZpa$dxI4yC0i0rE4j=G+os!0|MgT7C zOO*`ju@LO@J(YN{BkImGyKLDO>=WwjyJd#t?OMeSHI@|xC92r|rU6x$pP?9ODa|b& zjtYQ3b}jo<7gzSp1UU(im=)5DxFAQxCA?D zmICwM01$2?Nfhv z+DlZ+_*KDRix*~s6?gqs12Hho{OkhJu~}_OI_i9h>kiV@BFjJu*E7+kdbaEoOGSs#1_jdPg!5N^DY^>PbVP!J?+os2`2C_ju^IL>ZYO|6k;-xy<<@xC0Qt4xnm z%Eo5^M4jkST7YUdEIVyep4eRZ}{zsj& z1~-V89;V2q`Lw;_{h*uG9$}V z8YV@J-1*Hd@BNAg1YzRC669Ge$sF2rpvrHp@|i!rULMeahR{g%>jThUUq?k&@6Ob; zsBJ(ie6t8Jl=w0R?Krl0L7uI)ft>_S)*AmC8Wo_zQ68f zhOtHXc2VpSkhfh#1#%F%wC74eA&<$XC74_X4SF10-SKhpwEe;-#o2QXDA+e^1JrUS zoGSGyqL%4LpUm-d7&1t%I|k$4zaSgzRhpwvO}-&m8y`*xKPl@z-I3br?bi%|;@>PJ z51@ic+1k1~E+R0!-huEA$0}WYC#4#~L5;y?(1ivKG3}h4pF@oC(=7`6Dp(oBDJJl0F=v+dQmA2mV+JVhZ&+9*o4HUB zkbm&O7+UVem|8B5quv&)h;;*#-~Dxdo{7fEa(Eo#usz;4uRHOZI5?|5X?nOxy_s%h zC_!^3+oq-oQ|%@mrC-tKBLy>ml~KeJ&M;dfmibSczs;1FUO*KiOTPa8IP1dp*~o7+3_1L9HvM*bI6t3e=$tu-siS`OwI#Ji zT$tY~#=!ArL#XlH6Cl$}gpTT$V^m>(y0sZY;wo#Scp+Wh)yj<|@t;M~0UDRye2Y0v6*+9glNnwwANmZ<49WR}sXSj~?p!ir*o8E{3*xwWiFw;&b|zkt_^&qt!>JU>yChkZAI7Mb z){HmI?~bO`t^L#rE8dD0kgsgnB_Z6@w1e~MhLiXwEY|kE=)Z&}0wL3t%%UQ@zOxBJ z#&Z2oNcnmmmVSTtQWIAa4%7X}A1|pfM+C)k+dLYghRPA2A17{mZfsLQtzZy$74n zWm9vPS=;aIh@?O)*!GeZblo5ddcORU--M6evQ8V1#xI?O4zj8?z?I9v@3aP8x>~-n zbX@{pFkjU6NMoUM*OAGKy04x9v{=C}?ImkvtTcz

^z=WM#qx62o3d~;jOK|b)u3DKc=tN-aic+idWbXuoA+pUtn z^XbuOK88N~3F(G}B3-3Lx-=au&@kZC2G{z=&d{WBhXY0?iP>vUBZOA_$rOaYQRLLT ztLIh^d8dp^*=X~_!y^U9emkeG_kQgVN`W_1e1p6OLOoCMHQzm-I{}j*!lhb(RiCpW zEqLH@E@@#%5^z4XkfL`o9;0bL^tiMr+E)a+rG7`r)?D{+!3T|Ll2Sqy6Z2wmrdW|j z4~UKkL^&d}$@fP|xWa}bM_`J)oDU@NusLmw{TZTo+k9oTB-h6UMjvra@>tVVJPH&g zxIIr-tw?h?-aSIpi%wPk*!47_Tw#xApTJUe(e|J@XrhNvtbw0d`j>#W3yN1HBKc)R zwIXC916dFM zMs2y$CwbK$j<*5lhPX&wH1~wADxN)d8TcKgYa;0f?RTA=eO@1x(#m4Dng7aDoD_w& zMGf6ipz3PvWXs%p&H* zBe$lpxiqP+3wO`WCo&yjp2y3|W$I*X(pjlGEIiBN=5^AF5S1`zavVUGjdhK}`0T_} z|J!8Z!}3qbvf0gCKX1mS7q=2wkRtsz$C;gk9hXapon^kVNSMZy^{0`Uc3@<>@0(IOV8xQG>3= z+-5lO^CdKZtrdG}j2Cj;%W!jZ(xa0Ba;aalD9YUaml+5ByWn#9O85++j&s~`=hLYp z6q|2F<>FyQ6IhahAtfJ8HpBmkDR5j}d_^MQT7C?r(%n`8O#f70~+ZSN6^T+ZD>TE8-A#+=K+mo zi(|nNn|W2!Lvmtbvp=wY$7`gPL7LNaGZI;5_|)zRdRO+tWP=NAn&H=; zp(=C9bSz}_#<$ixiWQJWSdEiRC%?kcoIT#jxN8N4n`}C6)GDPxP%gr<^*D=B^{j?WjHe@JT6fX_4Gc&32j}9gNsj6} z@7CHz;IV`c0Y7Rk{`3EZd>FAX*z>3+>zq>&`IOOH{2AA19{(MYtPP1lO!MjmVC!oq zzD3ePAEtmJrpWPnu@%&aY<(R<>9MRS0AyrgL6x^^%4_%%BpoW#r+jJ$UC>Ad}0@$gu%^0 zwrg_2fIM?HOGCrSc`a%}^9WW0Mqmn2pkPik?(O#d{)>B|HWxE4)wc>8v_w5NC2 zsh3b+xq4RzS*|FOo%b33W|I3F>NZyne1?Wyvrs#WOnt3ecz&#vkD>9rBH^_yUlG}o zZ;@fd(hOOn)#)UcA+LC{D|)#{s0rYK4iL~Qd_h>f<+pYgIwmB3xB8JA&BN0sC9_CE zh=suO`6^Bl6fqfq^^ppDzlo@+Pv9hwz3;VSzRY1Pe+50D@44q zW7o0e?6s@e>8C5%3{t?d1hH*I*vloOHZ5bE9{ul*oZ$3iua8fkzIH`*_4uSp^dPSrL` z$+c@gA%{S+vYxz2Q+&hQmM7c?cTKN7b+6OatHz{ENw=486adOLnSJ~uKSS_+(eBm8g-Y4I>xbT8%wE;VDh>h za*W~-o-*5;(HOdZ?TGz-4XTTTSr*72qkD?YM{4vJqQWAR`ndTTN|sZtOkMApbZ=It z9CzHP-R_rv91S|+K+jZ;rrKUJWOlykO;>@8S3}_4o$elqKzI$5pyyU|($uZ!>)R=Y zRxjpMi#uXsVsdIYvlM_+hWA5To6JFkdb!=1vVW{dThh8_ilHK?Dk|RMLv$r(qFBb6 zsOR|Y*{I!8tw~R*3V~(qq@4OjwL8BiiuF{kcx7Gd*i5n=h?UgC`CCTF5L2u%A(-ck z)1ar~bsqM)u4*B3Fr)op5~IM-6ADQd`bSkh4-jKDtLxeKq&co&MMqo66Z|ciEXBho zxvzoHqt!sOYQ9hB1sfQq)x5kWrBo#^w|c&;&Fh!GViH&m>_xqh*IW8ER?5lUKBbrD zITKhUh2J2*k1!#BdgQtV8+<9hoWt)?9h(?&q1MxqyziXu)YWCKAgu;L)aNs97P;Vz zq@DUxTEJ#q{ewi62}im|8=+VCGn?AgMy)p0+Jx7}H>IjPH{i(JI6?sp6bB*< zvT2S$9`s9|RU104?Z5mRUuEKAlu6NKn*gU*cr5JP9yvPK#Xil+bMM{_lXEmRW<58o zD05h9EZ>j%;C{}EgeH>RsWa8JU&k|V34+=P(k{tdw~md#Ilb3`EFp6SL3hW~_3cJ;f7hxFh$CoX z<8?kAi0fcQ$7^WyFJl@9Om2a??jI0I=J~m3F$F;81B=IAnOh+CIGb}ZG%K|cFUH*w zb$rI1nM)JW=SOqa!8xDB_G?*wht2WR$3iUKxZ&MJMtsQ(w|yrq0?cF|37Zmp%OevL zpN94}!vLBGrL5ASYQzBBr!S7+4Wos!XS~*Vi_cPyqdWz*clU4)YcKyFYhM9X<+{8t2uOD* z-5rXw#HPF1TN5dK3-5}lFC5?ilNOube5`uK||M1*%&pkJOH~g>VVu9@Mey4o8G(zZ`DCQn)P6CP5UUO*bgyLEUrMEL8ZgUx1#<&wu5eZ8zi^HvkuDCDyNQvxtVs5wA& znocu!P=rrH1P7rdUVcTQ30(oRuMq)on39j+z#5kh`qwV{WSYO9*IBH38XAFUlH|&T zvNk7W^1}vyD;&bWwlp{&e^k31iM_XL{qr$j&@~)$w=JFACbho2BLagSp}7ok>CwNQq57NJy@|62J^We#ZsZqYia1@qg>{Z$TTZa)axlw zP&78%#(Ff(N2*?WWoZn&wa6pynl7ct(Oq`M4}JhE40Bb!G_t(262^TPcvG(LZ#feX z2%u{65f`|xo;OafjSCc)gDs4xZ)X$uhpFy?H+5)d!NMIo6;V~lT5`yt z`6~geEiG8qHcSR7qx8?ac7(7$Fr_9B`pbi&lEz&~7^8gDX!Vk~2VzT1%Bd$v>1)V` zg8dw4&DAQ1IjZ{tp60M{i;oi&?sBM?*?%6-OdO=s+reJSNQpUSv|gVE@d9?TCKs`skOLyf(~2UezY;_t) zr`+nvZQnj@ppWKF`c5D9&Gg2)yv9fn!da>@O~oXj5n4w$c8;A%oFm+{zkRK0=r}wT zV^TT6C@3k%5JPa{<)yf{_Z+-9k&{h{rKcIIo}Z88|J-=a1m5QMG-YXGFR$2NNB^@H z#+8eL=zU!3=f&O68}U$(s9~<>(U4~&UmUIc$N;~am+_=J#_u1=8b+Sr;I>FeH8G!b z2zkQyI2c|{VjZ_RS|&8ZFnrHSG;^`_jn1<;MR}PRO1;FuX5@VBF0oTVFD)=D%@asS zAKeqe-Q1rp+C9iaL?wo~568YKlTTrnR;kydF5gGYqbYpHC=8J|aaHhSdSqhxj$5+y z>|AA>TIcLxpwXsuBHAV9CL}h2N~8E2wv;7aN2Pe6@n)D_DRyt^te{CT7$QFyjk=gf z+!mQMnYF9E*O;(7%{M?_ve93a(P2sKLG7(9cTw`T9k(ZP8qWMqY zc^}Jgf#X|bI)D|6ft6U)z^oMREXzgED4iChiF9OQ- zQh-)xdXV3Wu8>a4Mk18B);ff^$*FpxI4Z#W+Hz>TzAV++HnG{olx6pZ&pSxiriIWE z_;(8-8F+g!?`enz8^Lne6sr8A;W0Rwf}4!XCfCGrwcvZ*^(Qr6Q6~NLvP@nSOpVSV zg#u0eK2Lkj?#acoWj{IR>fu(ef?corI}OB7B^0w)q?Y7mFXkJvE1TRex6r(h#(ygE z&+WPY(nhOKH)3fqS4v>pxQAQ4EpiWKe-j$$7AzWzw*c4Tm(OgdljsIroFERh7kS1O zL9C^LqVtZh&fnkj<)D2Yn0`HNQ9RW-J>X7)S<$RbsHK(H-FQpxAyD1W<$!Wh8_nGB zt`M%Sp@{fg@%OirbKM`x^Hu^HQ9js=QSuco1vN^;h-erZeTC#y?LMVfbp~bd!N}}2 zPEVm~vo<4$Xnk;B+F#*QG7e3Z)M+*`>NQfx`?Iic5!$D{-7~~LpKGL0+!T^)b0);j zY?lh)d*H7)j1<4kWu?O|@^&6}uCanf!E))s%4(TcZ#n6GGg*46a3upxmr?w8QERi> zvxJ{E@Lp^kB|C5MUV(%7EJrhTb~*VYK^!nw?=&8KWc^{*kgE@N+8s+ug_qo|VR#EK z!>l%mGxXIu8?R+#ieRh%Od#Vfa!SvE^#0!L_mzZ!LkI+ki|3$=8fTCr!DeWC+Z?YS&6T6qLvoo%>PC1Kc(H=57# z7%-#R%cYLN8^{`?>g6QkUtTo3nOX`|n_K+-Zi-YGvdXCX%PTyej?K`}M^RjF`FQ>-BU zBpT*o1FbgULu%2E%838cz@_%=7NUvkPWnX z;{LE3f0a%|@+t=S>mhFjM#lJOxsv9=W?u@l@e(8MAH08>IvivY8mPuzqjn(@|2r3e zkrbo?cPDtH>B$qM+V2lviF?h(e3G~$O?^o{#24x;?%+RhnVK)Sl5`k&sY`MGxu`$3 zIJcy7G(U!78_yo!@AsFB;hI@l#g2_(_YV#xgy1v;^Ppka@If7K<`-GpMkO}zPkIdU z)E+7e%rd)zv#xS~Sn={bc8^4e=K>Q|OeXy1=-%5KTjX~gptf~xaFBakhVdWMM0JEt zOgJT6U$d0Qrqr01;G-X(LH8uHDiO~gvb+aZWA)wNw!MG_0#D`FC#z4|YM&V(%zmrwbD74QO)OUJ74o=!bl3Kncb?r&4W%TuJPvj3aW{rtla z@)^tO+AJm0s531rF4W)W3HXz`*z|oz{h^11jddk+5)6Gq@w;Wmx|)1p!ocMoH6~)6 zjIopG>x59`TK~o-=)FXY_`r|Vvm49UCcmh9ZajF7TpS7{JQemNq z5Qfr{I1`^Rt@p&`BJn9p-@dyqFCb1K-%mSB3zkX-F~S)olHjNOS=qz9h?*fKrWCB} zUk;~d(%)BLXPBTD;SYEK`%s0PK|{r}jjVz=ddiC9Ph-sTB8zoWYO7l}V#eG`1gU72 zQ0H&OD4>hG3|7_>(A3x0oBMn`ty0P>5se|;u`=P0{9T*wCrU)CzX}x}WX!MTUC~Xh z0FqjGpTt&zLlAMSlWA0`qRn7gF84bM+GoM!7GwJl=ASDnD8$ByBGbI|7yGkN{>ixh zVP*jVRED3bt8W4;TI5zq=d=f)zs3O7DGm!H5~mQ{sXAt4Ekem zogh3jv*W>>jfAnWx%M@FC6XB%ID}^3y&w#tc)9>Ljfd%edy@b1&;I={prn|uDJWBI z^T=ZwTg`^u#$W%{X5BBuB7vC|a^H4|d%4UQwI*}j)$=b2h~&}Huo~@-3=9K_tyX#> z6+%pZdgkv$2`zv8q%Hs`jth>4!`~dl z|NZC?8bCDxZz$mdK8T7xObsdj&xPR6bNsm$RV8-1A+ouU&puzybhVM|D~B?Yjp+$e|RXCor=5HH1h4;e<6PVY?NNAd4sWkl4&p}^9)%KxMctMl`U*(56|74Z^{aXFm%py_;`j(0ry~_Ui zy2Qt+A2lie>v#O^D}Cu!M8xp%4@=Mk^gM9ve{tbL7^-w>az?gAb+hQ7aYxkuOfLAV z6Zc^DG zd&~0xD46O_Pl6(j-M#m&l8cO1xZLu4qyFC>%dY>%?L+QaBlWP4^ zR@Rcz7Ix=PK>eQ`=l{q5Mf<`Q_j}PL#qC~*Bcq7Be@e}`&l~%N?Uq7?=1omaamIWQ zIZb|7NL@Q58dF$x6jJ^MPh|q2<;8fLG94Qf9&Ccnb zC7#0lmBHQDwy5mER32ikX1^x=HJyt-hkY+2wwfxEMX&wl_bAK1u-E^`p58w}UEqs? zrJ+yH&#?}slle4cQ2uMDO(zZ_gc2D8%`Ka9f6fEuZ=(tS!x<5+4qKdFZsS^1RQt`9 z_}7;IvH<{u6B_#W9@N#4;oko)XTUgu#R2=mms(Z(TG@2`i07A77x7pCuzSemJnQg5 zyVWDTS4$@rqh5@_k_MXB6=6$yMOftf+tQ?>RQVkE3^H!A1s_5;wf;fN4 z#yUY27A7uF;zQc@x51J~|SZnBO`A(MF z3;8z!^lyv_s0v%z6+Y+S>i-J_TrIW53qiyVD18l-y#4QL3GK#_I`tF5C#?Cp*f_sr z=$!i3aR2`{+Yp9mLQ-7hHZnp0o(>uQqGcqXqzcA;dwe6Z za-h`5l@93r-**PsRViYq!VV7>sZ1Jo%&%FHpZbNX8$o~VU6*n|{EMbn2RdO^YBCwj zEGGueF_Zb{D%;tKX=ZI5cPY^Ur>U7=Z#~pGW7c4w3#Sqn*PRqYE2#IDdgq79eK5C* z0d7}2>Bbuf!;R&17<0fiV~=FANh``GlznoPmPd;0pP3wV1yVjRgIhqg9pZ$ku$Nbp zjJtjx(;JtEMo!Ss1XDs279P)$y254`@~ zne3gSC^;<*O2?e7y7a3CTmmDUzzFGx5CEL(!m_Yf*BBWmAOv5t@^=fWw;EmDc{20F zr^N%!F21olDz)cf1@7J1@@WAX2!A@iIuVem>l+#n6q6hwc15+l+^;p{{skCCqSdF; zW77ifG4fE)l+-qR$#q6PC)hCU&&nZ|&Zg2L^Kelo`5E&Z)&eWj;Z2^v1zj%B&+lj% zQOvxW!05MU$()7w2Fd zATS?_j~jZby&GmA^G_ERQ;Hf|@YR=DSC?i8ir+ZLMd_me30&W}?B=5y#SEs^pA_7E zuBI_gehVs1osjs*I)-i~TE~dho1Xja2Oz3e;l5x?b!7+@-sR02m~`NiR9q`@=K1kl zdzcxb7|y}YvY^w6cd@k@vUebRUCB~kHvISJxO??K#nLJqWUUj&JSj}9$$@Ig!on$T z??lE-_d+zbo{ta>Y6gp+V`E`sN3jhlr?eVEc>P#2woo|dlNs9v?>|iDG3frdbH<)l zsC&)s^1zF7M(rOybB~D4El4$7Y z22FBhs0CPzMNPWu{v=}e5;vjrUa4`fautE-Rl4Y?P-+imG>_cy!0H2yGt${juZ ztyzNU&H0Hf^}PaN+QRIlC~GWYqGE0s{ zs~Kp9R{yY~`Lk{S19xPoT8ie>J)zi7P^0+sVV|`LZ`FNw7|K^Xt{hjsRuR3k?{*BQ zClVT2Vom3dQg4{X=GCUt3b)J$`FVEgt0GTKa7kNQrfLNMl4W!`#UR$f8Uag)xb17{jJ!NC5}XFf>7W$4c2FpUtY+J7nN@f1 zw1e>EXal1T!M{4BBftvge#Rg@95WjLX{<7~Q4zLwL8e9E1 zm6y>1Ul+eOeSB{Ew=(<`rh`YJG)x75u zSvmYj0*~-L{fH2)vOs_dK*5?F+$NfPabdf{oP6)71T*TBKvJh5e1nJiILE;yALFW# z)iH-YR6&~|XxR1j7`QnJfq%INIer83>SQY=+A((Xa`F@vbC-L@B!4F;Bb^Y7TFy~+ zwzfzJJ5=+oLFJl-<;yfkS+S90F>&|UQF>6CLTqAu=AJ3wr!}KQ25=q$KC(c}7Xkbq zVE#YZVLP0vm>EF8ku#_x=fhJ*eQ~NjFL7<3Vv-csk+V5;S_={V3=LxH!JzPZuu!Ed zNMyiI6VXNI;^F3(d69aTONjlH7#7SCtkbr{1Zg~hVZWUSoCD*sD`w6h&mJzDiq?BP zuTGZ*zwMu(uUa3Q0glP0sH%qTpX=wNDsOXdgP(ldX=NzxCh$`xIG{963G9{|A{Y7_ zU)~|usnlBxS1rKy%b)cp!uxxy?^A1?nQnS9b9xI*m%J*raS&+ZyZ(0>$oU;ky=9f2B&ZkN$BIDWm9Xb_dDzl z+S-3fL+%mH}8_|Afo_+pm zC^UR=D`#%5#f>RrI)3<9e-lVW1Ofpue6X%`c2ok>I80sqf8)MCHiO0EL>rr#5PTcM zMl}hJ?(e5Oe>Nich^V&h$+uz^&3Gy|UO|S+vN*uJS9|fcSm)Y2xA@kxb*TBbiu7+H zC|P%iaF+TWKzv!A3WUr0;l4EQ_b|>EDt$adNa8etq#U7k8WUXb7sD5rn+C6PgfE{Q z8s{|)RoWf{4BA`Zhd*jNx&E6tWDJ~kaM90uf62F4QTMLjjdIqr5n9>O)cl4N^mjKu zZj4j!fq*=VlGZe?cEG|eYX8tF{Jz6O=y$}t`~s<0-jIWQNJQ{|>?CyhVyV|kh_PAD z?T&qAb_v4BL#LnGc2 zu>HrLA9)Pi9O2via$a&4r--p_3@H_vSn9$;8BJ;El0xFT8bP*Hp1gq$R&XikKo4Xp zoc)O4rLxGq0(_>dH#H;rT>H$ zzo?=jG1azR14vDx24fIvyRHVX0}Ph(t&nOqK>-#To@yZw=SOk`?%(8Qiw@Sd^+zE8 z>5QR`Wlc@Z!ZOQ^(fADNy;woLnU(bP*ti!Rjc;us4_hdL*~;MR15l2OfzQnxFYuMg)#@ZuAxEN*f@V;VnW6koWQ}!DQj*XVq|PA zBQ0Hh&d%kDISV2u$HPld0qd+)Si>Wupir}MOID)LJg@b*u>-OT@|z1JEG&19uXUR^ zxUXnlypTmkc3g66Qc;g)JBEf|Iv-I3D*ki@uB-rfymjhP?ibrv<9l?Xj1(ca)--%iJIZv_RNhMPI5y#%C?(qX~_24n_#{wxP8x>GF?_5JLvUUsztF)=)$Yn z>+fD3P5go_a_A{))YEcgEV*ILE|~Q1^nYdsAs)*@?}>(Vfn8q_?9UD&WdtgZ9X`!l z&{5d5>~U3tqU-zP=v|kI$RbHL1MQw!8Wgse8 zJ~9F5Ecji2jYUqep`)EKXxO_#l?mFmk_#vXbMq-rG}K}rUO8MG{CAO zy77q2vud|_r$VQFslW$d>iC#wyY~i1Ve61{2@W7SC~LjDy;{=w@eQeHkgbE?HS@Pr zi5tDFmJXqe@Ei0+`$3ku?Cb#n4)ZZ;UZ4c8wJ=v#%XJH=)pop^!zbkfI{xM;>@G5!i6Z5t z@pRp*8}Ftsp-e_6+ozvh8<)L33daKlU!{L1bKj!S$WO;=Yglxi?^l*2*;w4TKWDeb zVW-?K?x`8hgwB=lSv7ZI#Tq_LWsdlX#WlXA4rtJm}9e3{|7tpW7g zU;}vnH(0j}qqGVwcD7n4jnX%TmnRL4Ud(nq<3>RfINZWH`~h%T#O4oj9INH_F4Xx~ zG_<) zX!s(WObBv1@507=(D{&>?uCaxv6Xk!EkFddf1~l;so~CU6yCJIVO}nTFY~3IhtBQg zjOyWJS|#TQ?(1>%C;aL@1cd_{rWv#smq5#owxjQIO?#224wCn!YrH?+%v|=0rJCjl zP8Vcne+4IuwbqGfS`bq6GU>#sI6c)R_+lQ{bHPMY{#0^I_K1dtTWbv2UW}tJE)SaX zjtd2|zD@=-O;OdXsaax?U*D`N)+LHhJV45=?Js8@tCmR*Ag5B2lJ9#fsfuQn?&Wo$%JJ!4FO`#2-Zq|{cn%%K({Jt93dBIMS7a%k?iV`^8 z>Pc%k!!Ct0@_DXayYjjrLu@X3w5VM47>#=YlOKy?CLM8`Ps}Kt93V)*(f;Ojw#a>7 zZvfG`@4&wIbQVjJm_p0C9vsyBlfaA|Qx6L8)hLpB9V@$iO)*{Af2pb(he{^6uxF_y zX)wRs0J5;HJ6O*2xn3jt?!q~>G2hfBbo(Rf5a=G+GAVG_M+Ho^?e=o#z1QBWuE3AP zurpDF z4fY~ClR&w=2-3r^VniU&vv1nzCT`C-O>eaTr(A2X0nN%Q(tN%vZfxbY z69~?_pXs^&Fm5`W<}N#XC!h}DRwaC9ZCpG5QpYUKE3fLo zBequNj<#FImss>)x?f>@9(^z}?0w6m(QaUT@T4>xD2-`T+$h5kO4QT!mOtS9C>~IO zy@I^gcy#=HxM@JFaoOGL;NpOY>BQwC!(%@w0EJ)>ARA(pB$++2bvWn8zHPsa$dP_( ze$*&6IJYfo4bxF(Zaum!WX_7%Cc*T;ysTG#d~T*JA@n-744TnE>m{gDDv+O77ZmZu z_m$7{a&z-I&Sq8!T5-N^DJ5s)7R`#EI3%E`zFj)jX{3OYg-~t0Vn7EW#44k~#zyNz zv#}S<9;zhXU-E3$5#ON3TzfoJR(FzWF!Wg6VW)7=8JskiG@d(|;cg{*c^9sO;dWK! zPKMY*GAELW;*~ZJgbGqR2{kk}li(A88ge!6Z44}yY&aQ*vGp@aYg(bJ-o~1`IW}>P zV*69lE~775WpCypm(*t&Z#*-Px6)2v#pcn6V@M>|%|P_>u;rFUF%V~W58(*r;xVD{ zsoN>_`a&GC6so8U9$}f97S@(oqWLcNds7Leed=@Tc`>MWOX+hpzuc`59LP=dYMJ$( zfL7aaRGhD5CYu$vc3Rh?X>_NnaKHEppRpNG=8cll3gquC#}hTAZtF2CWq^ISO6GIW zQ19mp3~0Qk@?h@7m38}eFm3;vF9?OQ>SwPsF1gEEb(>vjb&Gt?9)cat^to+nQQvHM zX4umwO_#pzH>_pb=CqY3;66V!E>W=bDu{%u$lkyOG9XcXdTUY}XLYX&a;u?&JO`7{#SETAv~=tI?Za5ygH0*ZO5_KyQV^MqUgNc zfbMP@5T(~OzI8&r+q3myn$~uR$e`Mvg{j+ZoU??4P$Z&HIDeuXYd-}*+gizw>dL*4 zpSe}tlAR^ZLU-3k6@HNcLM-Qmb5^f|T$a72b(q(i=51Q~`{^>7#|sr*{FMU~=HnWz zCk}x6c|BdA|6U{6Ox)llK#zr!c60t??W1>>fq4T45g~ca^h|pi8glg@YfCpfO2K{l zK37QR7aG}(ZA%+egkT9&vVz{$2E3MrP~im4gkyjJeY!*_vqeUvalyH<&TMnSF!ENn z@CvumA|Xi2wuA1S01cn(a^wq}QZQ+cw7cfp_=Kdvmzw!~jJO(ETNpl`o#`n2-)D0D zD?=RDa%VI9HaeQQ9+THNrLnuk%B8&vfDjKPSfF8g-JEc6^ZYyj)2|=XZ+Dp^RHGq66p1pUDsvQvQJ-U6ns5Gtv0Q(KRwFl1 zsu@BpL-r(dd((Qz+q~Q|er}fUpc-Y;OhKxY%ovqqLqyIJwp``v2Y2k-Oe$V?Z7v!* zRh7e>GkKeFYwcWc$&}e+=@;vvW-)N3Rq?xn>Xl^RQi!2NxizMbMm@@Nn*1F{jVH0s z^7`6nX>x-QZlFJP-3XJ7x3*0i_`F+L{_b@S-?t}AUpOk&D03Q`o2Wt{4NG}so(E8e+L&j5315(7 zw)i?B*E0G*_By>Y_ryN0_s8jg%%*i*CY6^FS{McOyiO7_c-*uyyf4iKs%t?NZKs+S z6X2DOan&avPqe?Bh9dH=h ze3~Su9PBRlh?E_+$oA=X<`_^LBbKxGca&R?!GM;W~i3cuHag*2r|< zX5ilPzsUgbi-J9{0Q~^R-?*h5S5X}NE8BZdgt1;=bT_%~2H$OOD>v80oy>wpA_5#pz1M9I zJN=`Y*Bs7FRPZ|bG1Qs0jGwX76>OE|NfRZ*@HeS6zwDHL1W?Q47OJ*Py zrhhrZQ}gz^Gq>VlBYa51yt8Er&npye`MkU9?_Za9Ty`v`&7J4!1lD(-D<-}7NBFk? zp&7lTVfg5M*{uCgJ$Dnb%-zLs>fvRbfbrc;f%sdR-(bP90~DY-RPevq!)tJ`ui4<9 z)@B7*ePrxw9FEWOywh@WS}SzHY!KX+ zc=rzR5&o3wA1k>Bu0_xOYb?8JIJrmex$e|dSF!{0Xb?T~AirySmF%8b7F z)e?3&C~qg$ih>Mn)X4PRg=T%Wkyb_ETNMrv5Tm!yt{Dgjsj2Z|U7?;EZfI(q3&>#( zHabF8n>5?VqctzK1QLB-zLMH}l{vo~Vz_u|qDZ)>J6-@o>7$XrQCVWKe4A&ak^8=c z+RIwjDLv0@tB?DgRIGLSv2&}YrF>f*=ViXRctBt?$GQa3T?+I{g*CkVf4o5wKBlbxC^{ekiuj1PXHv;+^3 zy|%l7qS%k)frC#uk6^`4TNVA)aUPlWuhGfJxAm0Ee!Z%f8THz4aPdV>$7uW+@^e?{ zRDhlD2k)dA!Q@EC(e?xE#vau;l>lkXYr4R_?tOqilIh+F)&^LLzrU%9*fl$|#zo&r zw#*gKl$=_!;2IkMF!`#Vyg>aYpbg1l`a#vjd_SO7k^Hf;TZh&i-zHz`p+$arGB-QO z7p`IY^t4>$<6lzYK#njwt2-H=7Usl% zdRot-}TFhVmBbfuxPg-%i7e9cA)RipuW=A-dJAiY|HUt=@OtcY67V$ zvJ8tWE zH63pf^d&#r^JjWTu;Wt}WuU8Dk>)vOXWu8hY=<%bKy=D&p3h#=V!!rKnsro8{cH%MY&T`2MouQYjTu;r2}rfKTnGUj8d@+}Hdy$odmH z+J)OE89}EWCLNiLOP+1lE6G&U0@M?Pmv0Z|Cnq`Qrt@ae3b^I`Te4Xs9}y0)neCfu zXlQJd+yw}Bh%q59+0W}#R1S#gobsBcR~(Iw$O&2E57-fub{lT?G0$i1hqb4$))@$= zeoep|vs%UT`usu29BA8=^NJj$!qL@#vL`^pbFPt7NK3_`_BggUA?$6pUd8^$G4>xj zp3GK;lc8lFVzeMH3!3>L8%6SW&ei&=<2A_KLMTWyl{$$!EugsXbhH{L6fJC)+B0-Y z+1V6mNcB@@Ba#p0hhzuy%|{u{lUu~LJ2a^|$%Yc%YUoK1dFV-r+HcyRQlk8Gq{enYD%G$BPGr{wL@D-mQOwv!eKvenn5&v zd~(`eSCpi6X1wu5PlEwwF%gtd5e5;ppU(wn?%I_`PUJ*s<>xifqCw3kDGA!`r!1G3 zBXkNQW;0-pH3=v~C$d?_3?KI8cNH{j+f~r$A*}D5-PG(_-bjvnXS8>5WV zl<+C2t1i(VnOrP7a8*hX_>2?&;I4?V6|~aR%`^W%rq$%@FPD7_76mKcQopG7D-Z|wh?>GA_G}`$jcYk$to7uMG8Bqt9!~i z9jh%B?RK5Gn4X@Va&uZ!`~0f?Od5_F78_;|aiz@wpnmtu+S%Ka-|x6_I3yu z1{IHp%jz+w&4T(Y9^(fk$5>jdXhbPsP6?t9)(GHCK~I5>P<)69FX7C5-7|RoV+AG* zvz?>bnQ3SOdLl_=OCjaWHq?srRN2E~prDec^uv&mGa)vxLwdxTv(aU0Zej<(pe(3h3jEK27Q6{S>852p9K|N&3A#Ymf42)8m2AW;wUAZGUIP z!`KkN&=f>ScXyiA=S;g5RC8kD{+K~~(H|bxlMT8HaGME)Gd8C*DDlWu@ zgUjW4$pNJdUweJ%Uk$O!EY)R>p^GVB#ypp^F)&b2LBJDU3=XkDFN-$n-B+jzU)yA` zzGIMCbdP68&&VdG-NALxQ7GeDS079Vhw}FoH?Z+On#M-ylhxQXV7S`F8{qW`K-OrI z!gOPlT42!sfYz839X5mTWOo zjQ7bD@5CALn#7uEk_09v*x9L&fPK)uH^5QTohODXO(8da7glDNDThz+^90R@Fj`0C z9Q4(Ug>TjDi3t(#u>oZUHD@XaL(5(Xrw4>@0@u?-N_KYStVIOO9Ep6kmuHfYP?!Tu zvR5iyw6h0`^D#1iEEFJkSCpZ@6iNM@H|BBIGtyJLa8aeb&MW<;V#mDO;sSZx4;MGecJwpE=$F|f+0MPSzw)nhy=M5k&t8$;b3o2dBmIf}YQ zZ;C~&%%`eEZ;lGXr*1qCiBMLGG(#+z-v#zx3xs<(BG5ejULi+pj=Lh`QdcCt_5waG zimBGDoZjX1QZ_!NlBNr)&z|e@_*H~Q%e53`Tgxi@URXc1WIJ@+{msZDmnnkslv~nWqlq2VY{zVI>7L#f6GS7CF#If_noS8lOn8eH0-B_J@G)&z=uVqwO7LPm?!&X`DhV+W z?OGGGy_stN0=bkAaVPmVOw@6!$zf3iz{OPIIXx;JgP1HNiVk(KY*&z0GCl-H>@_K` zJvDUQP&O9D z`4@9T4a-dgyR{?i9GLrzxC|5QzBQ6Rj< zdX2(gJSoBG8DLO-4UZG=LjI|emWF1u?QDq&*Bj(llfO4xD@m`FCD%%HvTJ_(kl+yN z3WU3Sc5)hEYb8nD#4v+!gT4c?1gv0jdeyhU`EYOd)KH=Fsa!~Sl>9Da9=p%7K}PD> zm%QQq!rwj5SA!U+^NxvN)SR>M!>dn$`!X@T^96_D5cUM`o+^H=-O}E#loUcv!8e)zkwPp|LjpHxvJ6|@FlI-R*&F>(@4QHzkAuZ$Bgg2Pc$3A86WCxBWH?w#8*%SLgX#PD|PzeMH1;%r~2#(`CIb zk4IOF2AR2kJ5o3)eNDF;_Fjmih=}+VtM)qMYmJwH9WJ+zFzC72lCpS8K8-Tai9qS8 zs6=-IgMw5x74{NDX{VQ#bUEB7USFQav3+!T542QL9>gCSSP%Np<$LQT=HAuU$KH#E zbIqHjpzka6k&Zf4)SSOVy)@D3JsRp@>=ib&1mwGHMJ}Oiqq;OW;FZHKO!*pzvdTKO zA+sxgS+GdR&Gns@Shi>jmtR&~eEg>)B|07@TP`I(BpNxpy+>h7U*tCwbtEz9a6*+ne<gqCj(qKb|5&$ zRWh`%Y1syE$S{H>lwQ@iIGB8ieW4c@X7)lYD)=2q+H_=yhIooL9Zq!}bsjb?q1$17 zH6M1x%VL6v2BVy1gOhyXo-l9#vfKL;-b=SI5157c!>m}f57U9ovdPrS-Q6@Xi79Mz zmc!>ELcU)p%T?5n;v%$@r~SC-JFX7vhE(P^?4Z665nx>3>6deLd7V_Jy1k$+iJtOK zm3HY+v7>vy=Hp>8ntI1mPYn{_(OK9#aFNlGe77AFp|TdbHIvAHh%}}YXY=`!3bR1@ zE6KvKbi#MwPBBc(AnzF>MayJ0s8>Bn$RI7VLkjL_tzaB^Gs1Xs1I)Vqs&K}@dQ|3F z?>P61FI#GL$K*K7ux|75Ec%pVkzsQ%%!kJ|E20Y5 zuhZJEnd3BKkGK069(;pOu*g)(w2Gv`WDK9}Fdah-GZ^w;D2W$~A7&myD;(RJ*RiXk zWfYH2jc=|Ne4mHUO!Q8ktuhk7JFeFwNCgo`nfb}qvwlYzHQl-)Qc!7iY z@!VTkjzlExD91{97K>D$)k`x6R2^e>)KAk1RAG)N*$?Fi-Mi4lT(j!PC@{3a^tC51{}EpjpA?msfZ^Hug2yx{C${UdU0Tnc zPlXRCILeTE4XhVjczl6pkZ@tQ&0}xe#l~rZq)TPLybCE%wubHA&!WJoEUQlFjr(>~ zUj3yJjxu$Q)uG9Q)p#t3$S@gkLpo6ML~lejUza>k}gHc&#TQH-dW&sJwi5H52ptEC&{AT zxz1uBnc+mlwZE)|J~2#qIi?&VC8bDFGhwRb#|7Gq_x=6- z$8(mINI6VBI2NJ@)ZwGw+play4j%HC3f&y5I^n0<hMuGVvgU7k8WMKD^ zr(zb$9CUFd5~tW%YfmaLqFCS7_X6;fryjBV^jJj(a3Ert!NKfzWgK&M8~ijICJ8M) z$`NyMNpXO;ybKy~|1#Hu)ycWsQD7 z5|NvW5d|Xc#LTm5g!OEDtYB2a_fO+`<^worSl3qujh=Z&F$@gkYC}K+yd*;dg5KIm z&zZI-3~JD)d!2I1FG7mrT^M4J1%6u5rT1*!W-At%H;vW2CtGN`IK zXfgRBM#02_#|~4PM-Evr7#2>;)`pv;k?fgdNJd)mL=!O{(0;h_tP~4V4fjWo(_WB) z6uk;rZS%z4>z)w_^tx}GRu%(d8C(w;Phs)Zr=j1yCsWgOWbZ(@eYo}`$w?>DGQBAv zM|%&!Nt+drq3$8&%i*!0qDxzChQflfqm-?KxwmGQ(IJnOysM40l09qo?Gg42*}EmX zwo^Z4bTdj|T)V&Rf81{@CEcUor-?TAV{?>x?m$Y`p6OAw!TR-DjzAzajp4~eJO^eW zs8ia2lUNo(1^xSQ!_l|8ljNV?L_0jmlE4| z1w-i`0sZR0pOK+IPabqJMe%`v?X!={K0O>X;LO#-pdL~6Vo?@gw+vXqbV5NW&B zda~*`-B+cBY5kGodBZlB*9qn;MpPi0m+5%rpzCL*O8xH6AK_(8wTBYI4dP8U zu`khe5gzQf9lO1%hzup((H#zJp5R<|Hr)7fhEuL`0~>;30Wjm-n zx3uL1uMUAL%i8lFQ`$}2hRVvyA7&q$pZlUr(#QrD^{V4`^{xk^5g`X@i^aVW#X%J- zQxv=q>;G#olemA~Zy z3kw_mwfmef65(lh%WAiY6y=BN)vloN%afgtJVXN?>(bZgjbktZN*SK<~N?V{6Bp zKNR{IQXC>I`tgl|alIJkC;2~}E*C-6e82#=!k!%ICc znx6kh)Hw&&^}SuZ@lDd$w$a#)%^TZhW7}wK+qN3pXwaZhV>W6U_B~(y-kJQD$=o?- za`)cPTA#JHsD8Km2w674s87D%uS~14ldt6x`3QUHqeg8iA!AzB_cr!wpJ+)6`&vr2 z5NICkH`-3f!%W{^^L#GROxvx$mMs8gBn);x#v^6a_@NMzcEMk|7CbbU{Z<)&w`zG? zm%ZJ-quEOgPB9$=zb=mqx4lUgPl;e7_<%)^xRu8z)zk?ABk@Mdx<5g@q;4$hB4EXC z-dyZ?7nNCo9E^cF&NyCbMvY=0#VeN1)}nZGV7=M^d+7H%shT#;0PN4G4encrF3P`F z30p)cCoLC4)`i)sYL;s;W<}smRW_GBbskrRmde!Sh|gScUa!&(1IB(dVxox``te_E z`yfBx_+Br!*ZfMSdurCS_^3&Tu4=yV>Do8JJOfp2T9zZMri%h3^x`KsWQL9^T98vL z<+=-rsFg|cfjKkP4W0H%HVF)aZh|t&4>`H-1Hqa7vhTXs(bbKeIn$8Hf5(PzYrrG3nu8Ol<0Y<^bZ(11D8-EZ9u zvMOW&mS*pxn;xIE;Xx$@qIFZT^)Ugz`EZvANCkIw5QTrsOzoWoeZn(@stcRL+NU=% zGNSrfZgB(l7p2E)G*LD1tpFJ&}!%H#%ho%&KnGL9C<97IJM z(sbZ3f;Ru1?iz03fY!EDS^&BbT`H?xc}tyfG_7W-_!V=sX}N~-B%k66 z+gBtAs6as(9J$MuZ$_dCI?J@6Sn#Us%CQ)5SmIg=S^v3rP_)TnUkRQb zU^TZMloeMuPyc#z9CdJX2NJhJ87D5*dH!1bQS_L36t088Mv2r_`1+_&qMR<>iOoVf zAUaCsPoB&&1!|Z#zcNj4JSqIW&5i<7@b?L z9#I-?I{3$2?R%P>)UZH)%i;vIsQM76Ek-RPoW>7u8&8 zDW5KsTEY)A8U>d-GjYRR>p~s&_v&ZBRjLQF-9}sO=2d?-|E!{xS`$Qc8RFeoRzwx? zn}WApxe@tu?2V7w;=azmvWZ>HJ3=J@NKlXatxic8Oin?epfTTUse})RF|GC+8ovAQ zk&(Hwa4_D0W?OU&Y<`c+lBx6$1T&T~;z&|?{Sg}CL>liEyGYU2CQ(aCejB}Cs@3I= ziR(;&kqotHjm2XR4>9|>lSW}IIsvl9%^7)nxm9x0=w$j=@&0QoLV)1GVSvtw!l22b zyd4}ss)F}a0v0xukH2?9s#NZ{uaTk5g}+IW_)!+6ogOuOCl=%pQ5IE(3r_w$oyqPt ziI`e@0zgr&2a{OJ@3%OAB3n%Se1mgNFu6ZlU9IE^E{OFTQOpytPD&`P0iKjbcdd+TBQ3|cY!>5S$E1yJk9sgXo3<4dN`X?4 z7<*0~R!Hz5iqK2JxrTS_O(04QU?@VXRPzpb$kNIhP1oWQHY{lHdlk!lit=xTEE=1x$DR$74)*YS{%`72kj>P^6u*qzucT?+2fUR%&%& z6lD!M)BZLTmSg*`F_eqo@!jd|$G1^MJ`1?NQ1<-3Ay^97Vd?txGIaNog8lgITGgt* z0PXG#E`RY6als=0o>;&Tc1#NwGpwdnEF$i-sjR&DE0Yj6gX!}xk|G$P7y9Tx$OR~j zt7XZtdilZ|y?-CDV;23IsVd3ApWVo16 zWcgt#Gv#4r%kKP?Q{2uW4{~D7+29$lEzFwtgPSHS_Y@Uf1>!XF#Y1FqbvhkN%I#dQnJqv*G*RtldUNtE$L8Kz zX)8A?+44-XreP`cOE(8qejbyjwG8phX@VRPHFhICO2fPB$;2oL=E9);HTtB@(}?J% zLgo}d!SI_pY8O8*(FG|&@Sm}x_3NwIfsK$H?eAj?Qz08y;=D&cXwSr3z;Te;;~DUf zXr>8H$L|jex+eFF1(?TD_0FK-VJJir*qq5h>S4h9{O**Kv~pg$kMvAyj=^B;AT;@q z)wu4P5P-v~HZD$!I;eLR@pD}jH99)OSADv~xo`!#+|`;(tbYJg26UqFhjp!nm$R>6 zsEl3p}a;#LmemJBFBUD=|n2=jafd&8Fe48 z0wm&hyd1!+@_rRUZk8Ukqyfg1fc;T6->8(~=Q`|C=;6hlVk*St_IUcJ$9v2Y_5`(? zOym90_d2cjw#O9XY-_9jmQH$q-lj5_GG+M7&g*}y4T8TyOGrw(}!u7`4JkwYrjDK)(? z__4jF6Qo}1ksMES8@24kbXO|&IDgKOlfcN}6LtlF+LKl~?4K;R6#Z1OG zL2_7nB#=q){SZsu=|V9a89jAQmXV_YF^5&c?3xVa|w zE0blA&iUx0f%8gmMOdqAOEH^i%dqulDLRUX-+ifveb*0876Snuan`}{CcLPq^3lY_ zZNl{LscFYTVy8a{N;DB7ZW_Scxe%eA7(ZL@HrQL&e6Lic30}PD^?L^SQ4+RSPtNCy zULU_a-kR84uyeyX_%;{&l<+28(j~X`x;sM=SSF z&Jwp-$6Tu7@RPZ+SeM^Laqz^7N2Vv=Qkh8Z|+kD~QIe z#8S?8_vpjqM4 zMesT`(JO!Jy+3HqLYV~a?!|^CriJBYxgKjw<8IG~y0~>K@&iLbCW37FsY&6@DKu{A zW=(5&Sm30U!>rHa?Z$#qwKB&_+wz@x%~$ej2|yA>=j^PaR3Lf_Fd z=pEsyo23mmpncKiM=5l8kn)MxPsG)04&h?5id1A=DQqoc3Z_wD`@GF~wpvp*H~}X5 z4d%8IEn#KuFQn6i?gOcQ;^d!`MQ_42^0VoE<9~kPF%!GHUJ(fHADSx#1mwz8I<26n zy={yi8|v#Qk|jeI-Gju9w`N-|chfk+Q-e>RJ3$h7wELkfjaFb)LmjR{yw0Cu>Z}QR zZ-UBI*deY7EWO(pG)vY6;E*GcPZ}nV{_+$WWH;nt!l7TlLqYWO|9F9kKYu%>pcR4Z;VHnUL3aiiis60RWcXzAy($J{phH=!Sy;NLVY)o zxpKk#Bo6^!TJ~36%X z6=W5>MIwu)W^J|v{P7>;{ZG~UYk#1P2`nOiw-}FJshx|6wzc^6tJ@X5r;G(=s zULN!^5pK@6szsJ|1UP5ZC@kG}hg?V8`g1*oEegk1mI_H7wk7UASroZR9>84S9p?%j z0!wRo9zhAF{ZyMw`tO+7ZK)t1MJ4mQCn2QWco@nDD|G3o^fPPR~dg~!l z+ZWx_6TVWnEq&YjEP@&d1P?1+%8@yo2L0}KpdMU|veUXcyQk7kPr`5vk4U*_J{w3H z8NJJ|&P^Y3xk=UBX5C1~Z2Wq9CHGe1a`XY0X)a5=g3=g|>&C!)Zvw|^?Iu;8v}@AF zvGsU@hNN@?MWNzxc4bAcVw&RLG4McgXT`tA&F|f~$TJEdn=b5l{r0SGh3YrS!y>y8feMR zHyGMp$G;^e1>8j{PRyhl!LSUc`!wZJnn|wkNv}?%+;7)9SAis zkGWNW^)%_Je$h>958r~XSfpj~4WJ`JtAp?pE(HW}c!KBEp&?gFq3Mm15;Oq)=J}0rs z`76#i-f%Bp-jrOKQe{wR%BpJ@e7PO0-CY_Fd{@MbVZ&m$ja8{wWQc?rQ6SlD!6vnx zy^x0eeLK_uPb+=P_#QifLmuz+^Bn_KULeSYYvKl)W)e!q^zC~rjL4AMBPZQQY6alJ zVb4qo#-R6iYva;7;|LLups4ek6S~GlgIXgASz{H%<ZB!TYm!<;T1lkvE#J3U<8dig3*AaviYWz5wR(xpb0&oW&hHhK+`Il=FX}i(QxemLG+G&9AFjBwBs8;(7N(K<=KPmcXbdR|nTWG^H z`X;>GX^h%M{7`5m6cqQ{a&BSVlZ_4vRtK z=kJ%k+pT)NY(2SuY)!y7Xab1?v?2LUzs2;9FRVK3y$?d0QVz>yNkIyP6gLmSP(hB? za`@XHAajb9Sf#8^W5cnLf$s>3Rlj1K)8>Hgj5PV$4M?E1C$I)R~-_Pp%n8~wG(Wg2K6GENvr8WLCZM6pDh2Ch3;wg$FBH)mS_|&clc?^}Z zIAqdc$r(=*P3?&&|AiK{#NSaa3=fMZqKIpmy8ql6V0*=RVwVf|Qis+NeUv3io2{I7 znx69iwPxAXuYG-e9U2H9&F3pIslhNno{?H4_^FPOmYnViW*lyhQO#@__CVilo{n}c z_&24(KXec`q;}1EF;BXQ0}!j}L!Epd;?SMi`|=|8beFuwVSWRhC15Qu^LlEUb$iV( zAhfK^K_G&Wm;G3!xHj-phg$JVI#ySY#LYy7>fIX7HoCN2czEy0>UP?EFo{1Ja?LMn zLS>{m?)Iy}#2cUcV@bEOQ0wA{tSQF$e_^fu0Bnegr@M=bTt>pa5cX-B z)hoLjI-)(+3LswDdS;0tEl=WbwcZ-w#VK%}AR z)i5e>u$;*^x@X?%jjlci;-RAe+U&qx0?=WbjIJdJ?p zE9vVFU$Y`hWmJ?xaA*l%`84$^B00wCba#q$=K_2UAEp#9&JQpCJhse&)QNotBn)rD z$2^`T6H(l1RBg5j94t%g)J(9VlR+Vv`Q~yl*!S6;bUUwhyxkV@=5#(Zr|@q7a&&dD zq`pSwEvS@l|2mq2bYJYVLd_2;8^)eJ_1E@UJMQtYUoWX*Qg1WGt=r~{MDe#F6?TEd z#W+NMErA9kNd>B8%51GfJE9L?>WFygthx8_nG*@-N|dW))nO(DhIAj{O9@<7IliO{ zl^!+S5eUs2MNdZW^2S2y!A}t}y`(tR7-RRm8YxNfCVZ)h65J*COvlTM7_ zcXT#wZ1s;C2P7AZ}|3jsNw*}CrxY0Y6{;O8Eu&T6TP-P zj2cllzQnaw`tB)6GTGGDX=;$nQL^lW?#pq>uDt9`V*wY88+`>YQ4|x^gJ&~a`Z_j| zH25ld+oaiOs&5Qg{-$ayv^Z4$qQnJa`wJ9n=2G6*>aT}ay|N!_x(dp{zur}A0CY3vHY~(JabA zEFrH-f-|#zm-t`62q0S=V-m~f+S2PQ3k|onSS<{yaq08rtnU0S!;Rc^9Oh~v6APbL z5_+W^S9ENHlJN#a@9?$#-oFjd1W<;suv1*PYHJar5xH$=a{YrA!Rs(hzAt$SPKw|@ za2qi?1UsMm5+5k-fqaRw2uLt5TN#>Z9oF}~Rmla*HZ*#K0Kt9TJ5A6E1PwxkgaA+t zz!&yWAL4&B_-FEWd(r5^1@0H?lDBFcXr|b3aB+jvvpZ>Omkc@)yI$?z-Lt`ABZRE) zp*Mjnw!-JB`Lvs?Eb*l#bGatiVgNNcQ-?~`fo=uszCPVcB*Xw9QH)tlVXq~9M);H7 zzlK5;It289vR?4Klo1}QFYU+2;U%^ogugM`Y&Wv~=d-zA_am<42?jDtf&}6B3Kurnf85ektSU+r1OyUWS zA)B;WofR^Su;*iUL+FiN3G7~f6|6&?;tRJ??gwKm!#qX^LHR5hu+b znF%i876KntQBC1C*VCaeemjwdQtEX7GF)%8MKNcMf`}GU=$PARa*MFS3x2N_F*2-I zXy~s$=w}V#cCj1<`+cR4FH5gw@=oz>1-OpxWFb%aOhpMvfY1 zt*1p65uz4oW;PZKkDs8iQ!s@fj9k;DN;q!15%R+HdG3Qr7-@p7bMcP~+OMj#8=ygC zjO0Yvu%bOZ>K$C@*VZ3bk@y~(fD&RtMe5;f*-FYI7hEeYnSTw%gCO z(IRPd=^pe1ew0x8L3re7BxKC4X304q1&7@vj4Js2N#V-SgOYQQQ>IQX)UpOy)H|V1 zswlpJ4V_DUd-E$uR-^f%Gf=~A(>3lvk$4!Up=3isDOH~)W7R{dBR+l?90^gpm@L9mlMqwTP_dUU)pn3KEeD$Zx4%~O=^=;N{EZk0}V;T{Nyv=<2EHvU<3+e49 z{_<1#0^Ytb6FkuwZa29cliGa;s+sP9P-x7T=U*4aB_$=!b8yG>Nd*50*wkY0T!y0K zL8C^aTYom%KYe)O5@z>*@ziNB3R0(~^CM>?$PQ_%N^rIaruYrO^K>9yFgTd(-BKhP zh4{Aa?4A|CfJ2)j;bJ;5Y0JyMxBuRyo<1`+7U6w&T)3gh6?hAvIMxS~spRnALVTA1 zg8VEzbrJhtL(&FXcuCpEzTeoJGC6V@M%K~8rFe`uSN_A7-&v$5=bNqRmqh&00w1Sf z8}azeQ2Xj>zQzlEz!oopcAtNHiRnD0j=d#IC({DSN`&inss0c3+!6mc4fwJ z9AZL3X{8y@lsLkVbrfjY#j`eAislchs$Y)}fGpl!eyc6q0>)R8UBPLI&#SX}ACsKdgSuuCfZ{d}$k@RAj55&#;nu)~ncYJx+)#mOF(K9Zl=*uTWdos!=l zg_hX}BKr5@&WJ$`_y@jnHlgn%>=qn6yxi}S0Z}&^zdzQKmPtyZ1FG`BCQxH`4{S5c zimx3h;w9a*kfPLMgMBB0qGXWeO;|a6xD_9qXwthxQaq@l0IinJZ53X`k>27UpWHv6 zR@%g3fzzcHLwXjXcYmdZ7{f1v@W;$BF3*I<{5c-R-Ut($T0)j{kv0)6SEe)bFl!=B zD9|iZut+w}Z9V2CnED#~9al9y(&)x+H3KU{D=ex}TF5z#khvq#w4slbTI3NvG?#7E z9?R_p;z0vV{%``rM&Xx0+=yF8=rdv%MPfPOYAQ*-sC5lOs!v#yhHsv#eL(M3UhsPu zNVMsRIXOmBy`V3tV@H@r`>b9y=YBXeLX=4Z$WdHh@=#C>4i$Klq^+NjUvuaB-;&ZW<##(Tf+FM zGRjo%#S=g5quRoVX{>(25E5!`EdGrg$p!M z6sAQ<`@v43pZ9zwRAF};dt4R47!GQC%Gyh`QZ{{IFdQ!V#hEut%F7oD#4h#(ZMTRsVQIKzJc9xQGvp58^ z<1QtB&g9#p&T04w@eCl$+-d4%|4yob;yYy$?`)zp>kY6dzjN8Ie|ryiw?T^&?*HbE zm&3Tj(rYn;&*!ukT7i9q;7A-1qU9w|M)4yD2z-L2BOl)hfQ3W55=4O(rm>^D1< zWfp7Ei1eIPq{yZB9W&0hdb*k8{{z?|zJffxyrM#IZHwnv)d*Sq$_^+dwKf)Aww+}T zrh@!&#kCR)uY2HL;htJ}T@F*ux_1GVo5!S@YeyRlPEfYAahnPxi5#?<8XqqJ9$h83 zWaF>(x%Ugukmr3`S?)S^5dPm;Tk@S5Hn;oRtQifvfS5h6#^4K0-U%(q)IHmDKru-W zJ=$m>X!z%TvJzm(cx^PAPhl_EK}R-)i-)r2qu)W&0ECAobU&N>MKolJ^Lw{lVrW=c zdYONxhdO@9%gdK98oVKG4$HwI-cyZFSc#B$Wo-G!@C`L;r~v?D3iJc)lt--1GqKKYhKlhzR~_EcINH7S?l?wx{bO z3D>)CGS0>ldFd8{Op&7FJ}FqK2L1<3!Ln$Fz`a^EdlA3tbna1R{GZjU)T`|ri4(8+ z-XhvWqRM#cg;5m9qqQ@oZRO*3Zwh4h$IY-}tJ!&36D5CK4$@1>8#IZMfsS|@@RMwFNek~n z+|wJLl;Izw&J(66X=$kMmrNF8XfWLLGEhf`3FKm#=bV_|)62Vi5hf(Uw}S5{V&qn4 zmv63?k+1Q*az4~0hp2yJl|h82rG3S07{o})bJpI4-zP#X3uRm69HHP?GN?dGZNv3k z=j8`|7Umh;4*mFp<}$bS;_w;ybF>x`{Hf?SNnR@`X)(#EJ@;>^R^kLPB1K6W2OtnS z+MBeKi_zqecuy@M2Ht)EAN2X-n(LW33STd0{;!(p(!-CNMA-PPL%TXmfDD0aW7S3+Tsr*m~1IdI)trs5Wn%BzK5oj8)nqEU?;%)%r32D z6T+5Q$d~xk(P@u*Qs7XM5IKF&y3G2LTPK()`bW3GElsrZ*cxyE7t4SXpU;LMj@`0@ zcHG}zw%_&S^KJIJPSyaOOo+x9K@o(PJ-TY}k(}-aRApM*08^WcCQR}INT3VRSPbLnQ56Ew{y?3^`M9Hoo_CM;eH{a| zV}?PCRia~-qMRH?oUxbbfx-;X*vAnQQ`4~9_NGtPuVW+u zAeGh}jJD7e0p`C2(#Qf?#E>Ea!p7LjLt38Q&gl5p6&<(OR*_IYK%P~)LV5-3R zzlt_e$tts|NrJEos8NR8C=x=bhIlkiZWA7WP9hDs#9*6kpv(^7kI~2fCa}S!pdGJT zV@qYKd3hS@OC=VUm|2hO!4VD>>2$CJ{T$Dv)@w(b22=J|mpOUMgOb$|kB=3Kcip9{Zd70JZL{U8 zaUn;jMpA}u%i0dA0 z{J1iBgR8G(h!~ue$~HZove!H|i5|q}%p)+11H?wUWGt{El~u7C?woc{rN8_k-sW_C zfuLz^E9eleH|@FH10jj{3{O-<-a>oaMquMZ$ys95Qf8s+?d;Rk9gL}$$A++X?1WSh z78pV$U0Z)+z(8?{Z%JQ@T$CT1NWP@}Df}esZi@2;6TQO_%SJwrIW2Rt3-V2jV3S1k znMJ8^#r(otBy(zY`Kj*!NX=QVqt_OvsYuDa`Q&hy6;h(o1&+7=z4~;-fm}}(C6>Zb zGJxO}7X{kxj|y};&)+|HSFfX6)OVp^2+cnM^Jj6; zIc2OXqaF8?sSJd*{IM1@S>~-OL{G)9&ktwo-|G#9zPDAze)Rb@e=wDp1&WrUKx)MU>lQmROLE_P@?^BLhfbJ#~ZgsQN zk{|egm3dTa)|UZNY7}1@vp#*WVxj%YHvqA6TYGtZg;DH+rXX;1)`atCNgA<3UwV)8 z!N4wcFL5n+U*vC+2rL7g#bqrYflR`rNk=8W51!LCKhnZ^2lUYD51LHYjgF|&$BXRD z;Sv+e9zM~kn&ZlSS}VeP{OzdgetOq`$p}CFEwCy)yg?yNbAn{`k=J@@%T*O)|bt>IUz-^BOO%4qOltM7y9N0S|h^-JPQNuM6N1%*-}I(P*j?pR|gKPK%GXQoTR$ z%4l|j3sM^4_0kipe&5NqFfkPiuX#y5r8b*>b`}yiOF)=RUFHwHT29C9z!clfr+TKF zYyEu1+v28-%-g*?cY4UF*MowAl%y8@;W{&HXfP0!Jj?FcW8xJh; zBrdYcrKUDG5o=iJT)Mve$_2_IX@`f^VsZ&ftBVhC(QIY@)?m!8K2y|Ky9=fAJ(p1D z`6`SFSJH5b0NkDMr$v_-tIJsi(SyT!nHhK+zB0!7p{P-}_bhJTOuU;(FTYgv3*>Sx z73bl+jtpasya}X<$3GxYNl_=~D$OpdUPF*sfH4dg0~K6DzU4B#R45Dc8h) zN3AyU_xE2al0cLzpZ|5S0gpz91^5x!P1er#(i)i!WumbnPL8Wo_-pSZC%wQyfs@6QXm}8^)c=ffP|z&l;`4Dp za%tg<*X=Q2MzfA9H+~0{ltlpfho-CS8eIo#XYsm}9gnfVj(+pn8;;V5ZDl3aloltY z1lYYra#UPf2Ks^V%~o5@m~AGJw&2N76QP%%A(UuzM*pt1EFtd*%X}U#6@YXC4K&(2 zV-60ErD?nsqQP4dfR(EPIKe#O!OksM39ZkaES5P53Btz=TmH}XO&SXt3gm;ne3+@z zYooCQ5~#3LN?KaD{3pxG?y+^djwo1SpNEWa+j{|oQ}T9F{O^^-u?H0>n5c~tPs!1% zLN}^=(~F};34;ZS8U)tRHn7{gXT045nX&f^(`K^Qi=>sq!;ek`HowC}(Z-MQz;LNF zRoX$hAR^NCkft{w+<38)$ajBn8=yg;tl=YW9bX=3`Jm-BmHPNMZQDN+{O)OZinY-s zuF9!cy70-Rrw(W@-72n7wG?-A5zJFCE+p%!Qp#KMheJR>Fd|7`>|KoNgKzz`8V(3x zinO$)Wo5U&#XWRd?E=${=1PdiY$=P*zoyeYI13z5l{GG@5@VHGo?=Fx>*s1;kEtd^ z>Sexza+dR&j`K4S0h1Ar^1?i(9H~{`tn=GGtHffRN^4+g&C0tg;%lJpg{6itW|}f7 zX%O9%oF^}+ser{{YM|ApDalczCQSijpciFyn~dXgM2H-nww%5LYjPxl7DOfGhy3Wr zT(pC4-CYS#+az!r_DLG-sHg$PlM%;R3ni!aFu1W^YgEA?Gp6>y?N;kMxh>agX)=4Q z42j&UjtQduOzWMqQ6VNK2+hrT3Qe|3DZhHz?M({Jrci{$EYMfl{?xJu3%miz-lhKS z-$M(on$>Xrz{U_0!KxY>gHa@7%c(J~E1 z+|44uB)kKLAkiMF-R#h39z=9Sk;JqXby2Fj%lW4R>ruBU{x*Hmo-a@2boL+fQ>3JR zG*#GFz+H5w$k6eY$|@Ba%q|IT7BAX|u%R@lbZFyb)TB&9cj^2ls0i(3XaBam!|fz> ztHaUg;z%XCEChtL7~9(PaoDZS<7oiI5h;_W#Z^?*W;~$&KfbNN8?_($`gTr8saP_$ zC|>X>^0Mc_01atT#kS3EO%!PBZ6}5A`8kN_O_Gcj^&4>IFeEmC^1V=$l4auzS6ps~ z95BgxgK>ysi#|{WsICyyYzJ74jiw+ zBRz4gI_7D{R!!pczk?-zDWvz3q@<*QProkY{-Q|!8X%UcH9s^@M#(<^Rc#tadMehw z=^PWuQ(Iz+RK5okE{j&+|5X>x6{AyCH4s%EhQ7*coSost+e99lWS})q!$;r^m{Zy%TTMXyt!fuwLVRv5 z43DwA%i(ny{?=msbrI#El=r?}m~T*vU=rC=u{sr>jh!7HdD@XBJj6p>JoIg1)#=mu zx5m(GPE7y#xq^U(QDFoPwXhv&`-x0^KMFNm%n;e1fB|6NcqK_hitxi1(6z^o_eNr{ zW!hyw{>NlnK%?#)11*hMl*$4wKohJ;^^Wi#m~1{b`upPru`9xgAu$NhX(Qk!aPj*u z@Gp$=lZy8|Uv`VaV2hLpPq&T=^R4&zv@@RpF`j7yC`cVYpeLs5rNd!5T~}pbL< z6)2vrJvKyJ1KK%9&HnB2awB8eS?T2n7*GoS((H7rfzP{#T)1vp_i-Ve`74!yk+E^% z{`q-H`m5}wI=;_Ui0C!kn7`gnr1($MK5S!SH1mf{8xp*&At735bwLK1-*~;xp=Z1g z?3uZfH#0k0j?=H;gM1maxgOy0e37S@N5Xcj^f4GYg(4Iw4NH&jDEYFpjJ{IyS`&`v zPKXubdlZ0CHuzOHS{j>J{yAxlfWADx5$e2judJH>ZWy@RWLMJ4@p*b&-PX3|%W{ZCyDd35*^W^PE8tw5+%2}%{jRJuxvBje@eglOuH@S6 zbS0*ORZzx1Tq+DsP?1M2TW9F0fTbU0@Pft7=0eF5TnPOH#03ijO?_5ZqPhNrf1GPp zpzK_lAbqA#R2$B~DKl?^R71mJ9~i@Dn4F>E*N9=W7}0iDtKi8ZFnfnn9D3AVs8Mq5 zN)dl}AJ&yZ>V>zT+PxeR=;@97{JW-v?(Ecd@4nV+raklSx`UFhU8qkFtJ`PeYesqx z^rO{-Y^`ZQB_vx?wDkiCZ;Pq*+QCxY&9ZG(+^KwoprSaFA6vW*Q5l(F`sUlce%@=lFEHf}cN@9< z9@tmH-gtGl$b>ly#FlRbrnN!uU0;4XB@#u80zE~nKJ-O?LlXpXb}TsV;hw-(YbLLl z&~CMks4{m8hgq+}WnAOt-xCCoN0)jRHwa>ZKtBXJmg*4Ij0M`cu!5-P16~1bIwdc! zE*)#msALG0W$5cy)vMq4n?cd2kcmdq`otmR2_~c>+A8fKkWfz!xTEX+n6`4^{e(b7 zWW}66;7x!?z!Tj5;h)B&K=FPK$i&3NJD{5iVVU%^I%>`YzSy5InA=ess7KgWQfYo5 zY)MXAsZk!Z6JvyNz*@0Kr|6Db96W71i%cTO2&$1Krv0E@tP}6_0n}_0@lfCUB+H$q zI+^?rob31!t-??!Scl^ib=4O~vaB|T4eQ3IgDFh}brLhXts3}b>HFeII2hQ5uP!CD zH1WmrbGhx{JN`0+aJCbgeE%6!%8Q3_Ius?d5x7@2C+2a9@$8(WNy;+ZCtHB+kvJ{= zpxqU$qN;r#$ds^gcyUqc@ukZhAv&6t=|fDNMY*c0WRpTVLuMsrezM4;M5#!6^%9I+c4kMAtURkyL9KyQ1>T-mL?%<-a z5B!H*a#*d!b~8kZ%hLks0kWg@nj{=-VdhD6Vrk|=2=ebix5Da?Yhdonk(GoreiphZ z-tqLDmoHw|CRn5iEqW6J(?w1$#-gjOVaws?nd0TTTDSvm>n3mzP@6@zh-UN+{So-K zc{@}-mT=BLU2*Ikk?SPf_0n3hLIOJoCdGmH)#&2V*q`c+sV(!)x)=2II~OiatNN?{ zPbXOf?#@NC9$ky!Fo*EansYddFP5sY*sI13h@7W-z45G)h*hKF0^QwGo(oAsQ34ZX z_Tx|N*1^*YMeb_@xm}e`^1`03C))Z+@zvpnaSkOL@s=u)Sv!l}z1(hfwr^1QAWE7& zTfs+BkHpkXT8sHx1UcIFf{Yx(b9r=g;ewOxZxMNy1hVX!`b*3BbCcpWr8N67cP^#P z@;kv0a|cowk6#>P{5Woc`wvPQaqJuG_Z0PqgnCbUMBVy6>WxkQka5){2v~RJQrKX< z=Imf$Jsn_fQ@*qA{}xD@oTp3qGf3s@Y|P10OhEP_GmednOWW}LEMn>Gw;%j)3p-`& zeSnUh4ffD+6P?1B+I{|D*_5S5_SmU=Dg9N;Z6a^#9sD#zK#IEEZ(X766fr+RA$eBo zQZs2KYAq(>)fDe_;i#JE4gPUx3qrI5Cn`YzC(-HWD72_=JxA86ZO}9OVZv=hVzg%4rNI z-`J>=`R;^;)X}kjW{ip-B;s>rN$rv6OF<7LAoOLu4mnPW{Qb8O_-~yN1QR4s1%z{j z1)hW0#X}GSD}{!nu4i$7V%{=dvS!k0nZF=Mpi?6%zy^iEiLZ`!bs?45woKq-iM3!+ zl2=d<)+jp#Vsz>3f+iI`4I4*y2)BSlbub3u``HUeBh8}Ex~k#-lJ5>0&@6GoT0UcO zL@n+YI)#ugYnJ(`c($hUZvY^=2w3i}VB?osR6CZ#7oY|sv?#GbZ}9NfL<{=r~??vXv|mlo;r{6ih+v=lz9xq5DC}OTmDfB<1O_4G2gr0JaAB>b9BaXwnl2;PqZVAALdE*FYZVgJnU&mv^!a z%l6>V5xr}mO^J?4;f%$hPT^-f1R8>DAPZ_FV=M*hTwa#W=>x?3@84??t3ZQ{lMx7L z?7o~qFSUAWbt<>G$QM8jYGsP%EZ^2lCLzPa&;R4*{e=gofzZd$` zl%er*A8%Dgz(5R$x9wnSa67?|tdn>lc?=R?HD7{_HotN(-sy64HgO{Q(f+kZPrkpw zH2p@l1X?bCYk3gVQ)SFo`{&1N0gd>&yXQqAiFF^6X)+WIO5ksNGPy{_92}ULbl-49 z6d=PtWn0zn<`na2A^pKh$3#q0axjK4$I^Q1)y|_H)E}=L4~p){A4<~AsK3pnSK>{( zvH2!4IbblPIJ8O#!<0)J{|_x_BU}L7eY8|#jd6LVh`w}#&14|^wM~e(`iCVYBm@DayGx{`C8Sfh>FzG+yg^z@X{0-D zx*HMc?nb&hq~8lYXXcz|X3m`7`2NEOxN7gc*7~l!Vz0HxzU})(>Ewv{{OmR$WoUE6 zSR}QE<|CDyj=r) z0?Yjd#9G(zjumw$K8ho^XMTC{b&GiZa4{uiPwt5GRI)T+u}EXl`Ck#1>GRu}vLQny zQC;?Ba~f>1&t7G7BuypCHtqu_e>iKW^I+*B}CgR z*q?CUcM+)Sa({NYY=ZI8P=SWA(VH=QMIqdE{-i$w0h**e%B6PWZtYQrJu&!12f9-Y zL@h{AQp>$;VnF8w^0FJFjQj4jpC#q$aw>9UJSnuC#~r6OLqMX{NO`8{kLCg8)I2aZZ;Je>vuxZ>MYP(DQ_Hush&yXG8Txvg35J* zu{I;no6D@Mqc^XXWsyfi5;lX5JPt_^KnLIq)xUYqSdF?dkfWv#WQ@%w%Ru{T4V8V?bNIx}{ zA=(~bNddHPN+<{FHzEY6QOLIWqx780R|7frqje7ENea+>{bcDc4q|@yUf!!@Y%t*F zIp~NSfrW#KNO(MlYhKxgI|>tN)SI534l9p)LoYT+jDET`)}u1Mo$PdNlpnuYm$=pE3q{BDI4Sk*xh7M{OFXSiEtLM@4v-f!X$I3wZ|PU3bTZdPmZX>i%J zqrX3D%WgF*0e7u&dU%+9wa1`@Kc~`jdU@ zvxdRG0j7NkC_K%vg-JPhd{M_IB}$l5F)%EHL|(Vjbn%(U(ECCkzsg@ZTE1Vio~gpR zsWOQt7E0456!SQWumD_u}j3TmGv5X}p zPOcgGiEnFN7)bEo$Ed6(!2x9j)kOrG0+nQ;L?b;W1|9qwLNG-6leMpd3yw029w(3b zBO-6d9Xx<3T~en^o*n-Z3xA~7>&YJ_Pz#2DG|8&R^5C5eg~13_q9lJmc<_0Z z$Ad}~w%Zx;9)?VycI7r(2GmDAd?jI~?-&bXT;B6)PC<4ma|n*?KxG!k|qsTs;;CM)M1rpFcIE4uFrqx!a_GO$1Cq{qfMzpH{}{nMK->ugUe=qlpX^6_q%fex zx~h4g;``EaNom8^VRT(w;Vh4h~9!PZCicdSZx*s z9BrtRaG1y08>pz^F(N5M8-VB?sEcuavm37!*T7=2AR-W58eh_-XNXPE>SqK!5djL_ zYj8c4$ZaDn;N2GfS5G-Z@5=}pQfkt~BGvNO?>jOwGTK$}29|-Wp${6Gp9YQUeiUpEbDz^-(mx22`e3pvdVfP;`gy!a z43?hE`~1eRC+2a~GI|u0eYA6t&!d^_P}=~usNi)5u@`dQZO)Ij@`%S+t!8UpU&IQC zAWp!Jai7i>k+8`5h_pO>ddVx9@4Qhz7(fHR#C+L!^pqJSCQOayvGFAc(|q)470(3O zvBW*L@<9{tHyj<6>uHpMvB2oFM!+f03cXdcxpKr6@yeyv67Gj1WN7@vp9-Z(9$*0x z{|wW+TcOV+ZbM6}K#Hb>W<0eliDCNtj%?{{83IYH{rAzxaQ+io9^hopGecAfo1m`r zy!0fmVyzr=~^Z>5T)t1?Yp>`bGu$$#)Jx(P6lHHUOKHrS*IPtGF zu0HRxovxRaJh7ZFq=AEfX5h)t|#~{pV5BsR>Q-ri{3^&xB znD2<)(m?mg+8z}&{zxh>MM@o|+&5?BQWS>*qpf{-lQ!%Us(MLdzQ$Lb(DS-UK4sHA zeI`qVg2oc07tdo)O!+1XkqtjWZ`6>^L9rcopgtRHbpAZvDu25*a$?9(UW8v(~LP1LW)xl2;&nvd| z{EMFTOO-sEoQxeyKQUYeDt!&(`I2tiP zYX!Om`-CM3tn>wo%AO&Pj43JMJ>sTgc8LrxfXP}jd6P%bQIs#1kqALHn376>$PJz#41z05gZ%`00@ zx~;|7OgmFb=VV8J+0r85;}VcPL(PDa>O?lsBN%P83H`2qwe8H}(T^l5N20JZ?%y<; zUX@s8KEmcHnt_vy{)Gi7HGMlU51dL?owy*nlbM^+`Zy)S+Bxr@yXQ~?s4RNCS`e+_^sJ4xNS?jf zf@P<>QouVr0$fdwGjY!v`L9-5xyMbRgBMqK+h)can#51>crU3d|tP?i=Tt?>Ex`sc}|H~4afm|TX+-~qkA=X z-h6j+6u^J|s>*VPeZ?F?o1Ao4Rb@7oPx5fa4s(MaAZ-$|!qh%CWfg6az9lvbACN^+ zzMcnkJn?km^UMV|edY4X76qEEd?nLKNmTY+B6HPvLw7!V?J~^<0pb>& zBE=1I^Vd$r1OATwYFZ*9e(s0<1*_%@-;;UHzJF9Z)xCRsTw(qp$6U$J>pGwsP1Qkn z@fuQoQr+a4alNsY(zPthN8xsMg60#4CssD`1l!+WHF%XPcfe0CEhi102AA`0>Ztyd zP{O3$TZNWJ`WvC?J~!*r69Y?q(-OJQT{U0)^QD+ok@fiQR}dC%=Xws0sa{b+GFX!$ z1v29(Mvl=1FY}_j+M_q5QgDdBab1(kWRO!3GyYlV(fDPt`xQ6;;4(yW@9B2R{FPPd zR+bQ3id9D?&@Zy6Y3;T0w|zpCyLo$?r4LJb)q6zOEq8cl4YP8`YqqfdSWgE#TqaFj zSoYy~5~`ed`yM*Rl`jM!;jG?(N_||&4(d@LM`tNk*aZ?FO+mHUQZN+QMM&ravyl!?VJPaCV-ectnB~ z`+KJ)sPb#@wT7KwbivZct62k}yg^+@{`hqWsG!Tz52~16F+~qWRdq2_asjP?a3t@n z))E4rc>8^TimQCKW4B4k>vELH$&@qqTZwmYU$IsjQI?u*$NXnLHtSKBb$F*82KRv} zhoj0KP%xyY1$4eCnw57Iq0}?BE)fb^duDAuaWME&TXj8O5#>{dA=OytUBfn~@{rl0 zJ&f1ghIMrh4%=*usaJWOg6GBFGW=<&CE&YgCU!D|OPw`}4mS(FQOG@$N4c!nUdV>q zvYTngovjnO8(%XeHqj|RKfzJ!+DhV|aaTd_zpXFXWO!;sQmaDBz;JmUgD7LTW?u#J zx;*8_-@m=;0qeKkLR zqmc+C*?`}U|K%8-fs&uayEZ)Q2KhqYJ)1s3QERsuK&ZPr@a=m8ap3$DC&UKW*x9=Q z$5(k8fqJr^@9UXDp*;Y-zR7%_G~e;D*xTrEEWP?5$=GFe{6?0SA}7glI-q&a6w1o+|^iZZS&=ZEgJVxr#}h~F$K^-$Tz_aZ~VuEn(MdF&34jqsNpmG-Pl zw(KW5KDgqk^o}4fpJ^dzW8)sL)VIXT{T${2Ii6Llj6CBfW0*Ko2lY*IDXWyr^pBVF zj1(q(*bT7cH|?Wkoz%eUn-2-iXC9C`7AEDH82B3}Ibe583$-3|LL;nX z39!aQKy%=!x;{^*ale-ygI6&;2Q2EY*rpSTi#}`57Z#_A+wR6=dJGTDb!G6P zbn>Ugu2P2RC;B~RY@^w>iLE|LhDqfG@(dA3 zNvU?B<0#x^X7Opf5mxBye8I$c$BJrc$lUPoIDgA(nV*t^f+F*DEDHfNLa#0qH&eCK zKHrr2dT^E1MCvLbBDM(;*3Ayj^2r;+%?~0)bzl$puqsuNRR2cDJ=4T~`$T*bOQ)p7 zSSEE+DznOW6p}cSA}&*L+&nX$de+N)Q|0xokb=4J_N8gWdO6>;9>dM0b}o}PJ>F{e zvw_Vas~O?!nXxRGi=73M#OZ{UDVR{q__4>u3}f37hPVeV9SQccyEw_;kE7lNhCvFW zV;Nq8rqdgTM`vil_o`pzQx(%jq9`x)F{edFGK{nuiLaFWGXCufk1&RJF5vtnUf-i;k8cZ- z(%(is(D3@Wm{Fi#$hVvkJXD*>tj$wp=c^X4vfL+9stC~$hiaZ)-$j>qO zt#+Lw1m(-(@#P6uj{@)Q)4C1sq>j_-6{@He z72+Oq?l0Fry)Zo8Qc{Rxf`Q%+&i*Vf-j0c}&&hglE5PI_s>2DTZJYL;PNF^IW{U?~ zFjYF(yB^~?vw(qp6`D9MG$xjFC20QQXdBc?Wi>+sdFU&M&03n;)>7ij&~rOd70flY8F2R=&Tz8r(QVKuxqSSz=+gYJzt|R&T)q7ZYJU7H5ANp zaUhA^ed@GtOOn_7nV#D4FjAB)*Wg>kthb_3LeT8=H6wqqmSe^1RdqBDiSIfhq{t^K zaG%l=;M}z8$}~I=i`W#>byHgtwE3Njhl5`~WX-kP9$}c$iG!c|h#t(rW zSRhoU;AnEZNQFuV7stO}pkqsQ47%O*prLvY6~E69feH2fHy?L zWi^`dyG1k_e-^u0UHvoho2QmZ$WfiU@ghvb4%iqp+zPT8USm zEo-Y{>CATf?{+8x90(cglJw-`+YN zusyvV0>IL@dFw#bUZ^;LKVw4EK_DME1;Be%0;gk1#HLY>K5W2>cdg3)zrAC7Q}(T+_@(3MaU~d4hU@UVysS0m7Uc$8nS{%fB$Exl zzUy<$`{~dw3JN>wPV+r6MUblUR+U5icXUpj3;wiv6Ofo~*`mnmB)$RZl=zOfbDjt7$g7E$ z9D31_ES9E*;0EXR(a>o_ta#7!dCV0jyy?*<@!NDh-^$c%UFETN8jIUWX4=`W3L+Df zipwUh7mKBju0kP4f|7S);V|09DJ$zHB6*Tw#p8D|W;v_^tTt2EVfPHnd<<8JF<>+1 zY;=oFI1OFE6O~7(gX1n*NA125J$v8Y@V>)*28mA6nAUmSL~Tk&>Gh_Dk-BBp* zg;Ok#eF@iK`VsU?WnX%nqN2gYAY;Wb7kZnMsgT%is!EoAg2d_7TT6oBSxhH9qt;Io zNs0_qqgX+HY=t+mGFO`+F?CmG;n=LW6?5msIbv4wSbeQhxs98nxV1YgX3CB0X#|?X zMPnZ%Du=`Ucw#^@p5D~uWuVec7L)@O@BAF5&0eDUsZ}3IQ0rG86{<0uo`P{j@k)?q zS;>Tny6xcl+7&KJ4p6T z(?#Q(dBV;2lyh#@dq(9ATr0ByDKpEKR5Dk`}nKYA=ke zD*5So*@OCe=0{3zmVQ-`?+c*@KsH`Z-Tx;Ir8gd~>R7`|f70`wBLEsj0I4Z;^39>2xwMFYSL!7ssZ+edf4K=yXj$oOOwdKnN(bMOB zu=7|Lh-+4fiB$@B@f1;OeCPiI#(^L2MO!{fQI^LCfyV;jZ~2np4sd^)`H$&8)krPP zdNa-Sd9N!AnKrA!c}wuCZ*l9a$6FxMJv=c%g-x1YQ1G#=tW4E+2uHFrMw7wH4capW zzux_}aEhJ%-oO{oafSP_pI!{=7&YFvH#UQFb#u!qEtNlMfE2{k=(PvuX)dx3@Ft6O zuMzZF@#m!y4MECJM$Ban!Go@T2qG+1UN(4qAflpLnewlm+1uN>Y_VS zqu;Gq6X&I?;K0|Ifm<&dArA*Oe{M~uPM;-sEd`9{=H-b`&&YVOiM#U8waP}PI>PeDHlzp!j4`OtFAcr%VHbm&cnk#xqSOz&l~^Eb8Tyn zvLeIq6ACJR;x~_Jqu?m87~L^tzGS_erRWlW^w{O}X*oIiu;oF|hhd4$U=agz(YwmQ zAfISBA-nDdkzqoVp0IvUkf{JovV_drDzc^~f$A*bSYBCQVTxAhsnIHJ*Ch|KCaXnQ zCe^p^pKQ4O=)HOb5(pv8yx&@#9#>}E)sS0HL}T@+|6^VgWNM3xu-mD1qVJ0zYEOXx728Izc^vANQfOB!|Y-# zeXpZ7?!)~9#1ML)fR~o^UarOI8+C7${X{kd1317miD?`l_{k+k!2*_+kV!P4xBE{7 zmCGD+i!q`2HrPzs)&YCbgkZ?u=mLgCZ@%+&8|>jbJf9 zzSlxJ4bULJ+>Cm!FP7X@<;~CUn??WJ-25&Y|L4z@6mLJ32Er8lp&)xC5L>2h)~4wj z^~aM=%um_kXO>3D!)0M4L<{^X%Ao%-fH)bbCJ(6`_8!5XD&~Gn#G)-SNCU;gb_F*u zRO0sP;m8=PQlB+pUo)TweKF9Mj8%!~R5P^&zw;Tf?b01B=zRBI2KMK1ipmquWc1Ra z8RnxCw4dq@{o&zW8gTv*>E;lv@EK+ZRc2bAkQ%pZR#ly1a0pTvRK`oc&tJpDiLqrR z%-xDBoB}kJ=-f&PX2uksgeZ&lrT@0|`wy%0=RqJ4>p(LK3p)q$!~f)yA7ly(^Y-J} zT955&T4US{Jqa?pq8P@BO$xOXHTF~4dXGarxFvLY+?|=r%(-0chw=k}IP0L#cqyWX znW&~&V9*KX*z`8bUlGSk8FIAsOWso-+=bmqAVpG6l(=Ka++0f)aaH~0)_kw=&f+=r z2#L~&d9ksy~_`tay9LoETF=u2cup%%ob=y#b_*@`>X z!9NkUMHtQpDn@B&B(gJ8DmuV!dMsv2%Mc@0r#iXt#%j`) z^mw)M50nOW=((^bDiay&#=BHc4Txvug0r*jmE?iA5BP# zD@*C!KYN<-KH;B?3#@A%Rtd7R(yE9;5efSC%IF+kwDZy+_3oScw`+VK;jTT4-yuOO zsDh|#lU9w6*h}|*eExz&4un69E+4M`?8;N&DN>Dnz(uKJVY}3mlCX$A$c@*Vs#}V7 zxEHoBRE%NKJMF=GknU+a8v^dS&wDCCGLtU1*{c^@QpGa2t;{@p+M7X5}mNizVPwC^c ziAT;upKwa}(|o-|?dSC{pfm!htC8fbyiG7-+X{b&kb45_Jb@lB%@b@RJ`?)KW-Tn+ z+abbo7eSIGdN{0H7w3B_=FE`0sL@%OCG5^x6(L7ion?^U@J_%z$$_o-Zb4y!mQ(?! z3YEpxPH8Yii;+c!{q$43whA4Kqv@%MIeUa?9_oW1AD~ok=|{%Ffy+`B62@*?SQrLe z5Q?<}NnKjl$BB5*pt1bY+BXV$x3By{9MB)8>~;KX{rx+sTizl$S8Oo?oN^@FauXY` zZb{7{XHdX>aDF`lJC5*Ami^;zz&E*cVq?#oK2-LL0-m=lA<=Kf=;>WC$v4O4&G9#V zn#1E$+w9|9M@)qbIYM_kUfWZGuwlX8niFaY+VMB~g*4Ix)HKLav_ z3rZRAd>BR^$b&sae?Y|>5;;vRdQTKg)sT~RLs6juVb;!EB2iWV=XAW7Ja9ATE32jH z5zPCFql?UFgR{J@_vHtI5r6El|3r}(BIGHX3-d4Sv+rT6e<$>xP`8%>oax9jJu^$A z$vaeA`ORWC6Ilf=-DQkI0YauT<8iObn4_U-c7I6P8}F!cvmzU zB9UOm;}nYkD(N*w$%D@MPsBrFBgZ_@LWr<$n=4bR1SQx4U;l&s|49rM=qdCexmRgv zgaf_a>VE+Cf8K%~HwQg_QCH4QYMG=P)bUZTm9$QOVDH?$tg8RDOf~8R3FKNAE3ohb z){kYE0SAIUn40d}W*kvr&_Iif1o8XE8cv9M)S)56yX!%v(?XZL_&#Sa_Bbvc8YHsj z?XT77A*OfIJO?=I|E@1H4D9Pi zkEhtt$rGUV$qNGiw4}eOua+msD$dk^TWtHwYn&>YugMhU)u@x>V2A*>u6?pgOhcXp zJoF1WVu-HFjMo&JQjpOip7RsX6qk;%U7Zvf7=!uq2;wv~5cW+D7HYyPhf{85zucvZ&;(K$d}6ED8c^Uomh z?%>J7YS4#tUZwTw zE0S@2e*bF&1OhdT!UpD_5Rp+DlH}Ffy8ozc|KG>i^7#IBt!YxLX}u8Xc*G|JhqQ!$ zYvKPRS-{W87OUC%P*4rWdCs4I7Ji2H(`oa+(k0FX7$WPa873jFgn!4s=%&9**!%n9 zUP90J=A&XiEi)6Y#R_5>u?zWsU$Q?w@j{dsk2K+BL2tq@l0oHO9`eyq3OS?lq@rpG zdZgm9|Kke(tqVt@Eq;OU@PQVm@NV>8phUJ;|1T@`FDw8aLISwh1{0GKS0-Tnf2HM* z*LHe=f!xI9!$);hLcDw%UwHnl8u;Tf|62|G4{OJT3P1o9C0mo+j$a5MavW4XCjR%^oPT`#uSbTk(&&x+Sk;F5jV-l(;<Rj+9#x^H>4FsL2O-#)ixDK11U_-u+)MfUln%pjNBF2KtYD zd-)6Rfr2&i_vSB8APn!AtDKp7LMX8f%6fCgbic9s7ZLiq{{x#o8LSCA*D*52jpf=% z2kazF+yqM~(wQYOa>^MzwTE-ggu=fveVu$*!B@?NYFyU&M*P_qu9jO;Sn0FMMua`H zYkVCZzc6%QiU7tIVGQXMB<9JmPTIfNd|o_2M{RwYJ1xH>YT{YmbiJIt7sewo#pj0|P@BbQ)5rQo!NPUFM*QE_5e~I%uu{!+& z?TA+Reu)_ndVv82QYXov)hYe|q|6sjoq6&9l z*DkKr9sZL;=I^fMYqG^Ysi-`$sEefkV155x+>aypVag}!e0Q|lAfg@oXHs88tn*I!m|L;o1sKk3>e9lK06iQu zS6g}?+mNKUf;ir!QQLD*vhw^Rc=i_${gr$(0rJ?UM1Z?jd%eIj{)^~(jsCxl;s+D} zZseSi55q*b&~IoKkL%R9-qZ%F@>&BsvO5)syn_j-dBWmNQi!9XF7Yt{l2=OD)U#x-4d*7y_UD$hx{`T3>|kFIv-jV^e!sVY~)-`WgNx zV^YZi^vO{-40BTt#QiG?GE+eFRm{_c)v?lY5qGSMzbuSvy6% zR990BqiR!)guB*$?2ZH7JeUSc zteq6Ye1=YQV3y>YX1F<9dX%#R5w)6&7`@Ju@S0T|CVu5$!v?v@m_FI zAXC}Vv9h}=%m`&kN(=Bpp($;YYUmPESBCVk3bS5J46Bpz9;uAT;P`Awo@mz-wNr+> zVa#C9WWO=Pmas)6Nw*a`68w$$PpiF?5jU9HIhnn52O8-nvEV9vg8+^;uH;yeryhywZKuR zGKN<SbsNCjUe{@>D5%jGs=YePLROY+ z*^Q-i5=w02wexDj-rNbPdqqX*v?to%7bb)g3+hT=LQ+*!a9M%n@%ddPNtFT?D9R)B zRYv=ob-SG9TWUB~>Zp0g@JuHj`pq?I(nuhj9-DazEAAC2<|`799;s=2M)2tIh0qcW z^<$d+C$gushodQ^W!F51z1)sb$VM#xKnSoq=Eh#Ak#b(XhNvtOTv@aILx78!!Ren< zqoSWkxG7J9-<}I+el~tw z)mG8Hl==kwdzJvo&&W##rkGhvhnkU2+fbv~L7s)okgyc#VNIdADSCnM6X`Emg~a5? zA(Doss?kv!Vgn>8+GfGQ6omsKC&t<}LT6`hO%`+2q4`ptY#eL(2>X&9Q{UsIfEI$v zX{sU*t?A972|q^h-U3fkWO(b+t{cVhL7{M>mJJkXfxwe|ei@001`Qv!9`d1DZ5Uz8 z;riw05VNUvteJEfHL?bt=-{4qq%W6_5Fd z!Kq#3$~8=j&lY?mMSl9PVJn@Z`^*T7abGz9Tw&H%Z|fiEk)-v*i}M~4h+BUT6&K$yddsV+g0-&vOFLC9by`DQ zXhsBAN@Tje7F^rmQUeH7IJ}<8(R(qVwgsbcbSZ?4C->$<}E#DuJP^sB!^_Y`9gkBEwFk z(@JzNkT>l#iHylH`uSRCRarbh)0Rc(I^W?WEw1R%d~RLwj?Xt(P8EV$Uh*lWN@wC` zi(~nS?K6&&3*aOSYwIWh5lgQJITf$lgmD`XqfM34E&|{@6>t+m2_{K2x2n&_x^HCBf3-)Qz3P3Mtf{K|Tz6%f4N(FT#*NH-d;|wx)F3&(pW&iv;vJ z9a!=m$yeW~*;0?!sn?}63Z=Voh!vL0Q;qHppi@Ufyiyyqe4<0h<;sP9#zL}mZl7EE zgS+9TQ-aLEqFYA@e^lr9`hFSHhJ@5@QwJ)&l@M=1Z*8&QL|CrQG$WH^j${+(mVWcA z!yBInD`$maJTJ*W6N$I+G{3)sxe_{0s`#0v6xgxsN4mK$;`f^XKB5m@zKy%^i4h$? zHGP~O6rN3fH51Lij@d_s(4=9=SYY9Ra?5_SFbjnnYNm#bk)cOCeUdgUDBdKyN>QSk zEg_<#inV7ihOio<1;N+WSp2w*t=u_ZrDbY?EUA*S8A`FTNdPG;CZm^5(p6Per$jCY z$K2VBB|35`4r($Ktn>C8oUiK@B8hlIpAQ_wt&9+nfv+(V7_6rT&a zE4p11iqz7Iji&XiV$*^G)F<1M1-hwCw-UTfsmO3}!3FKbt%>P|#(~ADDs-3cG&VY7 zW-dbf-( zPQ!rUDzfM2i^jW{`2f}S>b%O|S~f^d+`(xEXzix1j5$o?3tf_3YLY;%^k$N4{6jDr zAxoyyg=tysYBYJRyUlb1o*x6H|26#?EDl)Kq}--_D(&~F9Z^~RXYm_B5i3M|CtR5s%m+z;5ear0V?02TcbiIA?rO(*N3O{VD%lkg`+;>s+DaCwyTNfstE~7 zN)}W=%jZSGBcUQY#F%CIvE0z0VN1jo8Iu#nR+&t~1#1j;YI5|2@`XBt#?8Y9-;f|~ z@G(P@h0QJ!0hRBLVH0ipnSk-p@}XJh=x6#Sc~5Ow^Ih(_1(l6_q=p>|%(2ca|=3nG8^QCQShxbfBD4wA(ASAJ86bT#Fnjtp>r4TvF_b?ZS* zS1x==@X2Ajf@in+Wo)t1_ue*7VWFmRi7>Yya<>`shHaXlJufXGUd!RL4cU{^=ZFkE zuL|JCHWdjW_y#1opJbgIx5qpR*p9_b#xkS0oJ>#Cl6SqL4Ql#$_l6ABD${f>pbs}2 zfNJ%~45rSVY6?P4UCA&QLn#}#(sc+ail1($Z(AZ0mj?N1P>5-Yjyq3!Z1-OoHNGWU z8S~)#=iUym`__^L)E=6uE`vk_}aLhM38UWE_d zv7LSj`x)}V_0~~*&LK2#K8M7H6?Uh2+QH2&^Tn{&hk^0<=Gd{L$tk25Z;4`^Kew_T=k2PhO{6pBRH}WLCMx!;zDevxY)ra z-qb}TWZMW{ZAx{+Y^^hV0-)yIfwG$Z4XpZaCk(xAX)3KTq76-keFxFK^7sDP%ydS*1O{bggE zBeLWU9s}bMEGtj!f>I63wp!{HPO&CyQa1L)jjZ6gP#W}ZZV%$1sY1$ayUJ-=uHy&K zs!I8ESN=S3`t8Wv4GgYYdkXgM!F4aV@zVV>FV1M#%o)}5p5Xa#wHd*%|7^ zK>rBSa+X{R`M|`xQ(GhJ98D>$Tt`kqh`H*ntR+O0?nGsh8lrSos3zmZnXQ>}Vvg4ltLs+lEmSR#ZGm*7j zB0E7x-IeR_vh*0`=82j2rV5Rkd;SwfzA1>88jQGjQgcDV6SVr%1Ne|En<4Q!OV?Q^ zo%%#$mh@;7j=7APVe-~3!@Wu<$XO0vjHc7}`*o&bhh{3alhKI=r6o(ZOsDmajN}Hg z&a4JcsN<ydQMcFGsulM%bXETU8P0(_Bs-UUFQA}V`Oqe%yN_>`^g7MQ9!_dcceqr}q3o+q1=krUjUwRI${ zB%-k!DX;7r_r@|cIr_o6-^41F%i7#q20wi|I@554_N)FVc$vUa0;Gxzec;f2Ay9CA zF6As*7mPq`GYYr!;#;`WEXD3F!LnBD8`+oQGJF^BbhVouW*lp;k{_NNufN>fMXB$f ztE@a;5m`^6WAf;NTWTz1ZY@NLst-Q)zcQU0#d+e5d~N zM@k(f$7FMp*rdKWMu8`TNJ0)+B6dTjA(_k@u{Dm1u8zj_J0@E(Mi7O!3tw-_47BnJ z^N)kzjI+yC5jx@H%CRS|#@(lb=u^ku73z13S*G}BCeMv!M+Z*Ni8QBbsg$8dC=ut= z@Qxyu3&RL^(9_4}4@1ASlCQOxTcAk9?sdrPfhBbc%WeJG|Dhe`wS~L zK*<)#v?Y+e9F8tPZaZ5U zH|&<~CNT`>4V-T-`0!d|fn%bSgGHn*>JHhr=`;Y(Pe{eqpijCT&0xuijqwx&NnVQE z7spg|-*J~`4r_Y^N!&vrT?q>?!>>fC2===VxTtiL0xkGCXRjV$LE9^}oVB6xUMts% zhToiVu!Rs1m{KnG)m?qP&U>&EyHJ8Khxk8&b3}GcHQY!w!t|Rij?Uc_V%s`3BLKX z>JT(X(+Aqph&S3jGANrTHF9$41*$@_*w;h)bjbWuuZ_^N0f@tqHJoliVWY|J<4ibhWdS2xbl)crd$=CW7~R;rX2 zlsQOi6F+#N$JIlRc--3GT%ur9rsjKEf7-Yhs6jP5p6E!9cu45{?l{H%TsDs3N7)W~ zoptryhJwna4|*=`J=&zJs~OwI<~MJvt!7BP>W-QA8X%e@<<_ZKm#*CBE{7sGTeTBI z=kk^MxmQHaothy#8-vRTjqvtcT~u9(cYCJ_Z{F;V+tzs1)z_bX-(}|zH#GFqI7$c! zNOTAB8@HwjTMI8SB)Mv&cZjePziZOw`VyJ>cCjWC6@Hx#b<_4$Bw@hDbHOzD=InH? zNXC(TlBrAbHhJE#P5blHo^V314Yqc()BK5wl>VVK5GVqQ~1`LeQ9)DaL z>i1(4$g!!?iLkt@Z*s}Sax{=;%aAhu-XT5%`b;EKQqf0@N0y z+IJanTe;cyY91XM8`|XS@UKVcb%f$}xhq%qqEN54B0A4*y3({JU=bc2nJGx&=8sOf z-ocrsTIo)o_;cHdM}_2|u)SANVjI8C{5d3L^9HM7s7*Cbo)_S*COYG!rT zzCQ}>?y9+am?9)Q6Xv3()mc{y@tr>6)Lc42M+I~wo3dt3Rj(3B*@EnljTC8QOqh*S z0yo*7@$w!!PLwKNv*MNEsv~2$vXqwOl*rS@r~2DQSRY-}5ra(Qgor+%HVPO(a$A^I z)v&s(e7Qb5DGr6=8r-EVuEE{4xD+i~+^x7vplG1QDems>?r`(Gzx!VKH!~+QIdjf8dwBK$nU<&SJY_~KSupT_wb(90YXEPJQ3L==SP2eb|h~`;0J4znMS`|N1Q_8FjM8|Qi z`t~RGAJ_v`d+*qi&n}6>_kuh;G~|=s!}iysZLPN_ApzOA3DMgP?19OmAD>h)eQY=K zjb6?icc1~!uBhR#&Dp@)c~jM)G5=RZOf0CJ=xqY_!1IHyxJ6pZ_}S#!-O<{CxBrTA za+&_`*K|ymz1*{uyO%4m0im_m6ysfLGF^Ye&P#}+qMlw``|eCl(wxC#^IsLQD%C^F zMAeFuUwFEqvK80b_a7!)L6c;R5Q{kazg6thd6g<59~H0bz7Y4| zRydf-66wYaNXV4!!$ope&c)i0jZRRVCiAW)adV}ZylWS$&8#s zN9R`YvsFK+Ra_}rOaJ;FW>qk<1SyY43UL!N*YHK#t#S*Z&YZ0{+L!`VLESnLDjGB5 zG@lz3M42$Dda;qd1I@1>A^OP(!$(MBD2NlSu2GU+PA2dJGfa$Wb~B@EE%>_8yLB#}$*_>Lg5tx{p2_YnZ20-h;AqgPd)@r(JC22NlpXz>yyFE0?)ts;HSU`2w^i?kJ zc)zUsnxLcM$gg)-ql;odUJO{7mqrU*SrIwS+E0Z(p1hu=wXUFZpS#Ycm&B0J)Z5}d zk=+e9L$Bal_BxSaE&E%`n|>?o%+~flFU%c4e!Y1cq_64Jj&cKsZs<1FsCMSk9NLqg;W0PMsjGqA%>=$t++K*P(MYohzc)nTHLvM z_-jiF)fMv|*jmkO<J0kdDkasQZCQvJpG@ zAzgNj9G&}y2clR|^_At{;W~742iC}X8+2$uPf%h-bVZXwazg3 zA%ni`Hl^$W3mvny9H$6zkX2Otp%1gOz1*UD(-wst>_g$A*ZJZlTjKwr5?0`blXi96 z>u@#j^9PXG3_THRsb`_{V(HjyCE6tN+l$za(b}8p<>F_zE^l#JwYJ?w@?M#^CW~xy zyTfG!tE`Ck4}*q$7NGC!ifu;t&~Ir_3lSA zaPHnuoAvHSsctuYzZBtxI4Me{+b-lSRsXRyF>X)cz(nT5(1INZz032a0_K&~9yjL2 zc2h@{u~v{(2~u&T4kRxzMKe+Zhpc+RJ${F*ynIqYx`J4Jp!2rYZfZ#CX^D2S+_=C% z5SmuiP@SqF$*hss%hSs)=k^#y*3ABQBzF%sHZ95*P(|zj^_&V&wA4z~t5Yil+3byZ z7HTw6S|t;`)Qw#|o%*Pek=+hyyglFwT=Z=9LvS_A)+>zOMvdVL>i!J?rQU8@I0g!l zWv3hG7X877$}!(*jTbuFx<^jGt!VjPi;0$r7sUP07|pb5J9`b^?&I*Ih52wCqTRSd zzG!PRDvykq6k6*(ZH$N|6F1qVj`=^LF-=T}GA!!y2>TqpJ?FZ)c?@w@XbzayK)ThgVo}G+SQg(~MCdK@ z&AWzCFK|$Ton^>oS+qi6nT;)h5|a?oOkRG6q&Z^{HZ~D7f%<&w*?dHeEf&vC@qSS^ zDAr5Z2)UApjfHS2oacZu0|GtdTqM-;*R0%{lZQcy+W1kPIls@8{`Z_(69a~hgaIiO z7}V~z;U_RB(WSpGHU4~cPL~Wd&uNvDFWYJ->6Uy$%4^Wx8!7?CI9xVgg1J~{Y~lM_ z;frm-mYo#6o#RicsavsnBKxe~-rn0nYcB~)#W44dfwt9$+2=*7qq{~}!ygIZ+qZA% zx#1>Bd z;%h2CdPtO7L4*7sq1m-v%^N3M?fjcl{xPhviZ9BiSAtp zPD*G1_kE(u(dA92>R(Y9(6b`^S;?G`X$aNwV!i%F80SlNe}D}-@V5M;l}@@?g^p`o zDjy;>dn}@)w=Yi>=XpH$aNtu?({MMqYyY0p$T*$-D+`}Bg#JnBqaq9^D8&Y5zdb+S z82yAU`x)_qxaS|nWKNP^^0D7ae6^9cf8Q5qMgKmZ$a!nO>kQw1Q08!Yb(MmhH!#>| z(G2(nk&+x=x@P))XrYVevJrIWVtYS+Hdp8ZN5toTcE?;qegKJ(>cK z#|VD>+u-ecb4KM06=D#YcJY7SdUJ-Ofns@FJRrX$S|J~Y zxFr}Lgk_W0f0&QxZCBd=Yqmfrv+=U3I#)w-(!CKh;WT1jNbyN0AGm@Qhox46EaSag z&@Th8Qnkpts9GRY5N;<}rLs5Cee!HBecGw@Hd|c2u#R(Us7=Ty1a~x}mKFM2m@KDY zCpAzEpJWIDw#wlmM&e2}R-+*{WLs!nk_h$A{nh;3+Y@^^RO|J>lmvFCVZ0HkIrd3a9~-&!A$DC!;s<_;c*jb2i+ z{BB9BKY8r(z&lpCHW_3MAVfs{_^~bd=F!sT1YR=Pd$S`rV5xb`YV>sbt+L9ue6R6v zz{b}SYX`sAf99%3U7!)cN?iKfw~3D=QF%L>BqYl-+(-QGf8%)Rf0x;rg=%oJoq-X=?M)(26oCI9?b=Ws#6 z;us9EPK)Hz*RMjNdW7({yusImZx?4S$94Vuv`>yFmd&qU{Le$E6pdJS1?d9Lp7?AT z>H!jTf4L3|i`%Vq4^VO@bP-qUt*~}% z?U!Mx!_4?%A3P@6^nv?E!Q)StGB)&$Ca+@r)^`BG|S+$ms3xMi;ZqL#=RiwO0ROu)?6W|3fX7rDMR-S_`vy(^|8| z(^eboeW`|Suq;Nh?Z)EPbnc?NOnE|gWlBBpG4J2Ub6|oF@_wts)vEnrnsCE1H7~{A?ck9=+$WZf`rrAMZAYJsTrTPLTsy$e_Nb6a= zwQ;AYLNnU~+C$fa`OWc4$7>Z6kQCe*QYNWY%2kB`Hjsi}x3~vFwNr>%!H-_04v;YA zW1&P@q3`ZijMll|J*{P>s?tn@vOwRe5cX<*s=YWbTC)~h&EZztYFc#_Yws0l#Bj(Il7i{yYHvM)w&(;q z2)=fL6&7YN00|uLPPd5|U}o0&SR!`46|An?Js=@OiFu?uL+6+;c(~REZB)2xTNF@% zSG5qS{l@ywbZm$FXn%KR{EM#8pw5+z*MNO9`fGH-ReDE>gAOtjU6*<=W0Zq*Jl3ss zwO}TWm9ZE(#HN(6lzV=s?q>R~JJ_f@D)gmh!w6wFqDwvZt^I23&WwKTDaX@BW06lm zuBL9DQ}Xmdm0a#XaK$mZ0A7C{OaOC3TsQRmo7(U8I)!v_KXC`$05(gGr2d~xK#Q8d z?8N8JoWw?_Bd-j^@70gnJPz@6K7QF@-lF&2!#lxOFkCnGdIet5Wx8$Sdy$hAX>O5z zeyH{_A93z)eOU$1$=P*5g{eLwV14&!gZMk7>SOh12cr+u!@(?^RriU}Qa5dW+Gs@TM|a*8!sY$g zyb*!Q#e2n5-k1z!8yQ}0SY-MAAw-9DTbOYpmOmw=*eieaulqeMEw?TZQwEqvKFJ^O z@Kr<+EKE`RQ>4{^gRsbqkNCbs?630{-`tpJB=^kfj9neI1P1MCeHC0Y<7d9$6>^x` z%Fd&tIso~IzBtc$6gp2$acu>t^P;~Ynk-$=dlVgnh&Hf%_2@zZ3$cxwX!nB zm-9SMn6{^y1AKl%zMD53ng0LEV6Xv#hYz)|u&{^aJ<(K{c1}!ugbKwTB40g65)mk& z4LTf*!6fG$@Ps}YJRGP7Fn4r#=NqXq`aN$^r8bNTDvkDl^v<8|?KUVt)K1WU&J)hrBQ7j)tp6tkRXJ4Ja(7z;=nd_I!P`a$quO7 zJHT$Co!dOYyCh2fzLw$Vc)XgFpj+n{Por&7u7f}xRQARs5;3TJ z;!Mb!=dOkDfLOY{khwHuK2E@HaVei@rCu=rCX%}uxFHC3L|h#^P@w8_*jW=p#CLln zA3oqr;lhi(80C7x(dhA!6JD-0n%W!hpT{pOx{i6|PG}vVBpl5-##fQiwZ3)BZjU&6 zzohXF23IscZ)*}aGO@8aCwsHL`;=jki|YBZW4Pc|OJ-2z0etOY5T)5WfHCz%RY7sl zw-(hw1~Jzvy9qQ8O}K8E$@WVzu|o;jmZ{iX|5QUd=uUsL1-w+v@AD#;BKBq}sL@`N zXXgvs7embtMz4p>1~VPGYmZQemC+fjnZ|S`aDXc(CbkZE$}-yr+ab(HU+74tamrbX z^^g+NCZbA$g-sh$P)Ism_wrpsvHnofgM8}dctQbNc`;Jk6ON4g@J#>Xs%Ouwr>0-E z+TPin)lD1fsAKz4_Yn?geII=uWm?O3vti*%CDrhf`Joia$KEMp+2iq`WMD+>IR$-7 z^kLe2VX9V(a@@3wuVVw!l4yRm=CcOxP>br*6)RBHdJI!hGW=Fg=j)FD;|(cC&N~d; zPG)QL9;b_J*kX@q?dn3Mn6tc&tDBTfpQ}F+#vH>fc|wnih+zljT3L5d2`rR`{F!Fz z_|sdC4^{k<<6DDJ>Miz}e`c2dB2#+F)$VLCM?%I8dIQeYG3JemHg_{;6rnC^d$8BLq=0S1d>)%nVGx67Bw;cPsCpUBxtNL z>3X-qXjOr#HN@j%!>X1plYGV7g12rmEjrGP_4;5+GHdm8tjo)pvS3yACiiyczQe3_ z;%0+_P%EV-t`#er8f3qA@KXX6`h)iGfzZ0+Oc3+w>`0-pf!2;}067Vcpq-55vq>!F z*~VH!c$%9X_L5I^P_@!kdCU?LrdSaVI63;z$I6)IMU?h?1eenCC~i=h;M+se>C~}s z86;seKzDqmyf|+6c@G|2lsS|4=Bz=pTAMw$?NLFi<^A1B{Z+2f+al&AlgKV43YVk3 zR>R??_pPPN{?u*xf3`Uf6@c1;)m6(jA)OS=R(gWZ z;<&Zw=yh#NFfVhFwT9fsf6&cOYCR4ZY8dJShzFyH9t)?Zj{$3Er~gJfd~8E<3RBaC zu7+VI_IIA652O8N>TCXYAxc6=+-;&F)e~tXkrycX_%4e1E6hARIzQu+g0|K|??~qK zg{x8fuP6V_nU7@L*r;HOxk0ay$dB{s5QZA3`4p6Oc>^Wq!#N^Bq)-GpF7PdHuq%e( zRUUjyv@n3^TPUJ2W}rI&B!EDbKsw-Ri8ZU}FNcI1T2k&Hv=aymYv^wD({z=7sKBum{s=QVlN$f* zC(eoYc{;GJNx{!ioYb8IEV!{17D?4d?lG-q4Y!3mJiV6!=u(dsFgXeFDJSgz9ag!N z&9JK7k9-~Z)$|g>#%RjZB*WteFHy20dbPN+;B%zXG@!#((TSKM_4$;LEZU6dd;?Bx z=Ky`>`(H;;F%7UoY2k=$JUzmWirvSL4p}a|Di7lDaEN8S@~{NQW#XDvjHHB_M)r{h zY|}LzSO)hM{(nDMSAfrjwJ=;YmIuB6#aIg*RW?-Cr^JzdlF12p{YG;1W#{$jOv{|b zc--f#;|@GdUPyj@E%T4!zpucu##E>Mv9RX~op5*RKjCvn$=e+q6Ma)iGf1=}!l26( zeBkehbq*)Zd%KDA*{)}CREJv?@+=yz`9U;nU6NzPT6{L<|Kw-=JwJm~ilgH?7z@j- ziW*LaPd}h&*`wd@5GQ+oFV|Bub)Kt{cjP2z0&vot(Fo2pvL(mC2%`Yn9g^uy9{|ko zudce0smUxlKM5u^K2|sNbw)8C5x{>YB5`9xIQowKpb($y7vfKy#Xe z5mB^Mx-?HcdxsPf-FJC}Ll<9!eJ8t}BI z8gP!=9bRNK+Eq;)Yu8u6cQ5^SloWeAgoH!sqiC+sj5wvKzx333d+$N6u>*YR}RdvFn0RJx`*E?BW0Q z0)R+2LkK||MIYLMQkkZXuh6SDyuu2mTxQ;<9yTmHGvb>HFEQU|-^_tt?<&mQF z|5?M8iHwc?Vs!E8U7oR-7%xi5mZ9GXTUk}bS19dq%#xb#+6nMoL6CbpeD^$l4&YoZ z_`dfSO&Z!dS!X{Ab+=G7n8xwrxmP?cA%>)Ka%hx$X<4}(b2B?$Jv=U>BvNMIrG6#- zKr23SN`W|D{6~an&}?*1ju(fQSJ>9FT3~DwAWywm6yaa|f^5*wbM~s?1=g5-Mf|gP z?cw|2`~V)_9C1L3iNqgDfOw8qiSx@e8tAjBbrY};jD~|?XB=$?cX^5Y8-#EPIQtdp9u#ijvwcKV&|7dp{r*w>+d*8IoigeGcRc8 zc@hyY9-^CiwN};H<@`Sf%e!A>UQeNo$KyG|d~H-!25m1fCPBwLI`5w!t@ zvF!j(&WXdejsO+08?y(P`@i|iqcZa#f&K99PuA%_xdV5kYl-?Hq@hQ3UA%hM6vrLc zh~Gjcr13vEkCVi)yPCYs3{g4hRXa|T_1E9p^|nUaV)SMW`Bf{jl*2W_{bhuc0^ldu z_fJtB(fa-#t#AJD*`M*Tbp6R%+J{Zw)VSgnZh3<%>;wZ81#(2nd(`)=*&PaaV!e^~#6v&OqO zWjgAqFdu-*Uc0NgW#cfVs7LNDAZ_y;Qv{x@s!B~6BCE9RB15Ojn1nkcy~mg#ffKdq z*3ALYjz+p_f?58J%!-wajLf8<(xdp=RD+;kDjRVw-YDc}cZC{mYNvnqWAKmk1LdfK zH$CB^q7cN)dImq|cgW2osf(?L%ff4Hn2aB2e28=US@|k?T1SL9QeJgKGKq27A`Tmu?%sQz&jHs+vvI7 zKEWqn;z)S8NWC`=n;Vz#yWcOaeQ!ORM@CY0M_At>3%hW|5}8mXE_T%9{J;MrgWy5% zzN&NG=@oTl)7gB=JgzZ+r+6j2@aBzu?8it z=B;5$7b^<(7@(Gg#bDXZ&SY)a#pPk=c+Pxq|0_@@qGb-@wBFkBJWQfOTViBknTiqX z?(SAtJNz{w#*LGlnp*MiSLN8ZCBY;6^7)q`4}N4M>@Oq{{YUvRgAPSaA=B9XO8KY! z0cbVod)+?arfBF#ByxFZn^dc&8Ymz$ou*#@Z>mo3vO5^&iT1j0`H`YL0<7mWDUSQZ zpwE{-ME6YNL^MbFw=ml7$e%i3-ox84r|6X9W4oEHR`;W6o*xkr`+X??%Ks}6-r14O zxAG{@(p(XTE)4Whh!+1Pc!<{TG=T_GzI#XaZ~yqXg@}~&{lD$!=_!uVz2o|witQf! z4=j1{b%FOUUVk)Qt_50|pKKCT=X7C@p70&5ufQTU^C%QMdN{h|G% zK5Of__THBvH7|y&mY0({2kPp3E=uc)-_T`!#w*$U260HGppsp@+LN_7d~Vx~~^zHSvqhTI|v7Bq6c zG=5NQ+Eqt6v1?3}${*PPpwjmu=`AeJdwx2`SN?rFk^jo&0AjTR#e7jSEa|&F_-Vk! zMX!K#gO)58=nA}OW2ZsTSqA^hdkMCmdfv4i;O%R{i)f^HNgNE%{SzfMRv; z9KNnS-6|(A^;1>kHZ)K1@kpx(UwA#3oC*_G_U3KpOCm3^9A3{iuf0S-^ozX1-vvBN zmBhMrUJXQ_-|(RW_Qz6SIh6oLJw_%bd6lPH5qZBIV(L8NGwNAK6AMX{wFUu!Zzz*Z z2x2}oB;4%meTUiFYT9%$_D3o}=)He!<=Rj(W!g(d{{U~VXX>qC14YP%(3+`!n;MCg zatdnG;N2I*(Ymp;G)6)|7YKgI6K~Fip1z3r%EO#~)fg_NlNLv+>u%wd@divy6Qar# zD6#6)`m{w_Bf>PO(pcCC;$l%Os;?9O1DK6G$Nt$9FE_twP;+s&?fcM116Tlk?cQJi z@l?pnpv>Hzl7#&6^ZPET6~e>7z;ZBxdp{DA;@Y^?0aff1Mt|1B-`1rXoi$jY9rU6K zFBH$&iW?-JgxVk7+=j&!D@b_u$LZtDr07uV?RVP{K?Fq3VeVlplJPl1&I(hz)HA%! zwWuhC=|^DA7M96Hng{>!HNf6u44Bu*;@9lm?5un+>N90s=(GQ;Bo2yj1F8M=C_~SL zM1xp)Fiw@T?WN@;vOb3n{n5p&Wz>kSBt?$F6ramAY@P``w;%yvkXUdLo5JdGrf;+TDgLp$8N6lYL zdH^VB>UMF$0Y-eMQc&X$p0y#^kAx=Tj3BP7)tbP60Wc|+QNE_OPG(GdHo`yMH7SRu zh@04xfsJG8Yei1hB>7}5ZNNshc@4L!T*s3s2mfA4LwKgI4=jht8+J<}7ijY;)}J5- zd@uD@b;rxe`Rbr2h9H^P<1k^BrM-Jv>^Ys-v@GjB#67{vh8lO%#kpMX)5XHQ^ZId~ybK~Dz z2VJ0|;^lgM2y-eHu*Jlo-VRj-LA?-Lt^XlsVl7swELF`qh<+>DTw?k1JYG#4$Ziv4 zwetN@1}SIPrl-+vFuu=(E+Rq(hztn#-NNkp__zvgb6_lwx1d|MWoFb^X9y0@*pRde zGw499n?nPem0+L5Ysuw#Nn$Gls6I37u<$CLjM^bm(>R5Lm>rWY6wSV1aP@FGFeL>k zM)j7qlxs5cnMbG+{IvOwBoDI5GLgNM!cenxD~SomkirBjl@AZ}KI`^~F;Uv8N5gmW zDjP*zMAqG$n>Tfde)(HJ-}Gm#EYJuXN<*IL`4NxPIM+`4T_%%{CVZ>s&p!CAIBRpI z`365K?J9WCbp1K1wT`G|T)W95UZ}pQ+!$a~NjwxB$VSD^4YgYRVr^jRvU(t~Vc^_T^Sf@(B3MCrkP5 zS4VlaU>_7+IhKDDr42xHBHYZ7<5kdFz09EfBgnt_|K>KOL8@X;UzovNcVWgUqt1fp zcIFqk0c9XtN>!CpS`1!K`tUeX`pY3HvvB%PJmQ=(I_EE{k8=$r*$&N)9iXLA zdg5GchDR5~StZ4#vaU=6RQ1upk;ErTFOs||m-L9r*}D}ViC?%gJe@PiRp2HG-!9zYCOgQsVy-gr zVeK{0b3tZsWOy!j!p!_|rh+(&n|5ateJphpsZ7s(TGGghBQM@M98CR#8V9op0ch1| z%2QjEfLn^XgYs_y^&GXEn^n@73m*yhOH;5;ICTbNVEAKy=s;eNQ=m7n>lGdc{j;Eq zIH4x3&-V|FLfm-LM?BZh5jAQe>z;y0${3E*o z#)RN{GSuL$KzaSgzHm7wz-_`w^gsDm@aIhdWd*p#LAa1{4sw^|s#yDPxa-kPw4BiI z0|5C*%;fDfFe?00JfDhsLBL_~Rx@F13|?V~`8yToch=*k?19pap>z56AO37;&#&gK zZu}&`r{Qtho^Q>Z$Cf^z@BnH3Im(C2B*;T2lt^&1(*B8PCi|2obn8|4vZ|50`yf&n z^h-4I(RF`-wy*X0JM^W^qjhg(V@y%7(Ghy$jo9wCke}bx?1jYzO8aA3DirH% zv6l6A5{Ks7;P6+*-N@s%Q?GLp7)$RI4yQXB{Fk2>=o*GiUI~&41k&Ap<@<2sn=ba| z(@Qcjp2Cx$BmecwPr}S8SX3P=YR9`L64CqfPY)Kaz?t2ETyH5n+~pUO`;oHN5HnHw3sh#Qez=q3+Myedua`;mwHyriy z0QTx%QCMl#h{(^kk!^&zuBPJNLNKFIwr8OZ!U0JI0TMk<&I(KRM(-4AYjS%O)96B_ z<%V7$lUIyUZWzu}!M?h-4I_4E$?|(&^q%3@gckkdJ zfZCPKtq0dsUnL9rzWux{>5t&;_l1(PhoveT%>FwCl0d2I?>p@PH)ndKcT#0Nk1@8a zvr}|@sa-_FM>D@I=;H6mEB6?+48Cy&L)si`zQ&vc1qcIZ(2&N%3$)#YZ)!(+|!4PR+-iQJ@!3cExLd!Tn}2ucFTuijp?brO?|W@YRtj}i!d zJhSirx)rP28&&p!ifLc5uFg>bwqFpsq~W{hrjhVm1QmwmRgEmv9m(P6WPJGwMg9lp zeB>EVB=hnaMP@(AMGtsTZVtfOU&EH?`l63z%mtD(^1Xo62RN+OE6+3|7QdocAS*9J z0&)UYxe;khIyAIh>vAp(iXoN`%9zK>m`*GIw#k*OCIa2vE$IcRNmyG?pfiGcYpjko z>uM8#7jf*Mlhe||z5~>7K_O3|yP@x^y!j{dci}<>RaIHZMJow|Zs`$Gkr&Z_dT=!& zr1NT3d#5Kg*LTt#OMfXnd!InGBKI4UGvho+gP8w3Ha#|^(N1obrBNbhP9KqRBXde^fpQ*s| zi%?YQ>>LL%_5w|OQ~!DpTgNZMwl;@_6}b(&nre5Kf+(8PMF0HdoMho!#!&o6;+>3c z0;yTL(NJ&>QE(&*Qt(LH`ukx)oU3lX?guAB?EzB?G87zqIlhlZr#_EQz)C5LCGRr* zHp!q!8_zvdIGIjPfN*|R3Ds%+*NK*|`yNd!L=rvcUoANZ@S8~Pu3 z_=I1?C?i5<-PTc!;Nf%(yT?%%n==wCf-?59Z9vUoZg<%I)*Q&)gR>{-Mdk;#awRR{ z@PC2gVk@2n1BPk$PJmQ4~8mj-iP26Wdw1c5D2_w zk8lN;$|EX&VF!pG(Sq<-EH zI0DY`^!tBSy^bj=;Fcz@1@xxbgRMy84(-_jr z?4%)j))QOH?!A{Q?tkrn{C-xc9ba&?{~2m+PI3KbsQs*Ti~=D2(paUms;5Ierh3Fe z43}pf_5TVgVDM)9x2tVf=x0#($|K*;;_RBvM+HisW6p2a6S6y}ZD$^&=Mbk23B+RX z(k+k*`ub@5?Vu=idsfdenIYHr%TeDcF9U-t`|ow&!&aQwaT5fVKmYA&gl`8{MTmpu zd=XS`>XxvAlwe{^j(;pTZh2XMrs;$P)t4skaKSP+8J1Xzt5b1BIIvp-eLeh$bo+K# zQN!E?>#wG6ZexUWp%_Wz!d|uS{O>oo%!deOpmp!|2I`N)uk!y3z(h+j5$fyxK|BmA z&{$PPZjzS$pH7CXz;?sGRVnc3q`H3E3$e;NP5j{KWZcX4%mJz=>Z$aAQOd}@pNjB@^MJ3)3^?Cl|LmB03lm}wt| z=?&Hsi&nMz)%&fujt3kknU@vkeu~3am+-Q3Nd|jlFOf!36n0m_^@T*;B^iBG2Y0ZWMKL%Fws!&x-MM$ z`JbS!B&JtvjgGA`XtPefUwK?bVC4h-&1XB*hX+Jva$Qam9B&3~U`DoPqrk%Vz$Ftv z)<7PpOKmYW+vQD+Y9a)&aTCMN2;yC3w_2|O1fz&~{F%5Mdb1dm&HXo%+pntwOcE%8 z9Pu*BMA}w&stcJzc3hvQ#yWqdT69)-{nli-2u+82o{g&KioM<|uKI4#2S(jieKpq- zCGiKxl_7jAB_JJQ%tBu9i8^Phfz)zY5dIAsN5cDJt}Z`6Ys^t-pk;cwvB5mQh2p?e z;h?6(CssL<(hcarQ71s%r4r-UWHbX5oaNOG0`oRF7gu?V*IjiTLJ3UYDd}&9tnuZ4 zJPijt*TZkE8b?x0M^$iIb)p2Dprnv4GDrlk|C&$ND(ezK*ft|*`Xp3|TpD2~VV4M? z*JJ8`H$WtH5%ehpRJsl@n%OO#W{kwVlHDZwC@SHZ@v5D&&VU)%dv;5QvR*_N7)lc# zT7~L5f}F-kf<@wgMuD5x*H{4nv%#0j+cH$fxM$^+E%H94dW^2l62~S0_>~#oJB{L~ z^&H6{IYpglJ3ru5F7zQ4DQLf`X6vUwc%QqzPn8SXHc`hp&0{ygApn$XzYd7@4@kNui|svqQgjG2fbu?o2MDv3_c z+n$(ILq+PDe22iF91-q_1BCqSW#Gnw;tN&V+buQJ;@+g>O*^Ad+Qx@XvLXa%$SFUf zbub3Wh~oOG8|9ewcmG}?(rBvkWhif1>C_qjpX$vJ9{T*)#;RkZ<0;q>@On9X)><8l z_!J`4N%$c!LUt4B!{^29bi|Ykn+i`#{5JcpMJ0Tg$Q6Q&EyWeCeGfz@_+d{E^ial0 zD3*3@h@BruaBgaDJy0sG;ns_N2S1c8q|;)C7I||9%b|R~h(v||Yg;O% zEKS1#upjU>-PxYB{SEzVp2Xm*MgR=eg)_5}kZA4u!&MgIH(#SwX)}!!lB`%r+ z7M&!Cd4B9M@gs>wzz6dK^{}66WZRUJdA>lH3^D-fH0XFiAVWYAs&-iW;%>oR5GphH zOMH>Pq;m`K*hz^}d(8*&eI%m$LeuQr(ZcaK<(TcFx*?{=3a}PkgC#I2z(qJvY#iP0 zl>!4gp8Ti%kE}c(nYeE$81m_4=y!LzIN}MwDYRG*@X;o;Y9XXc01)8|Sfx?K-Ge`B z0Fo?V3_dSPWA0Pa7^;&gau+7I4j9;7=T&H?FtI^JJNDpU=E4}_l!LO0M~^M{iu))M z{PAvzY6J9V_Q_&)AmJ?dbPEzC5Or*db8>&W`OVptr@UQ6oDvn`Ur9}_Z=m1LzpDsh ziH0}Mx}2^tIzK9wiln!7FIo?9SxZB}lI2?K)JuZLxzWO8ff0LgKyqcfTAqjqK++O) z`F%sm?gDSVw$H$_q!R(D75B#7l!bj#96JRo1E$BCaplY!{t~bjbLD0R>sx@iarkc8 zS3`#2farA^(Kpnrf*~p~o*6bh`lEKVz4|(QHMx#4cinL;Mc##lMdv-+!JIt>Fwuh#l=P*Y#wK;Ii6sd#j1poI19mP z)=TNc%$}S4d-kFw#x@`!`q0dRc^oEH(Bxp@jrkU<&jF|5`%*! zYEg7@n#~vw=QuQkcHEBQ?o53%@w3IxARog#wMepHBcfxaUG5eul$^e$XaocQ{-yK= zuqL=6D1K^KY#8fc4JElFHX2Rs=|Sin8mHR2?Kz90uol`;MWFjwn{k#JC;Fhzi5f%d zsvW+;`TGRIx2kzY&V>~#8RjS$wx71qmKJpK!~aQg)^VOL6#RwG6qY_OS`@q|$la8R z<$Kw$@^OW_f@syUk&UrCEDz70yNwi1N?6f{EZybVxFNp>ASJ1W+RgZCPn~>BLvjLV z_Z}R6ELfR}wXQ-$;)k;TJ_I{-or1$#>RfE8=pJ0L5Ka#6;b4^YXlybL4VL%T&UK2! zyqODgZ4O}N5``H!ed$%!2CN~>ExdXtE{y+~b@e&c}%Lw~0pSz9$mL@kA zXu?P92ig6GelM)5r4|FY#P5(_RZA3;IzBs?%rqI769K`Qk}ABJvx5GZGBN^(IbsG# zJ>kr z+7t0z^}P?b;H>?yz~iXpGoh9~t46ZM7hT=rwC@8lQfkxIC0V7&WfvVEX zwVGiq=c-fqKF;S|^-MOF6?WFPYehap=Wt_+MhLrw`6wR;;ksAJcdFtA|J|VaBScDto|f2f)T$1*Y=Cw?-CCf8NJBF`5%ugQ zkAfC1lG{}TxbZ#n#K1)SuNkIU!F;4A zeMo1`?`N8J#g(fC4^Ne+Mp5wwFdfZPd^}I!y0-Ar3LFk;{|Rws)Y=R9l4Y5mN9Smo zDL6{l4>tOfoHrl!ycvI9iq9(5cRS+ue`aKkQ8AsAKOK#DUKdj=h_(20R$qi+k^Y)< zZjyX^calU7{#*FcKypS|2$PB9xC6dwo#gh?_YPr`;cxL{4J?q1xE3RMtH7tYGgLu| z(4EF0c1>pgbw-^tU5_`J>r0DONZnHYrv3AG@RLYhc)nIOf1%QWr?hdRF=mj$^PKV& z&($Ywo7xo9NoZkrfz;r?p%fj*jzV8%v(}FLf~%Q}mm4asS#Ef{NsQTy$6!44A6S9R ztANV*y1uWbshmoA>}?>MCUXS?c5$v5K<79%f@~yT7w7c>m|{^KZPt}8tz!ANVvrH= z=O#f~gq_HcwVBn}YPE@MFjcIQcnlcT1_+3#6vYfp;b)kAKNZhMGSguy(Muj!WI^|2 z6@=YHc4bUm&CtcqMxv-F%?9E>U%83>@|yi2y29Hv%%%p5RUyh4SxJP=zVZq|gegx= zDgtp@a`t^-p76$7Fg&J80nx=7e#!jzXS@Q!(*Cbg#Lwoe!vfxgq6^<7!hWH_iSx9% z5R{gFpp^|u^YxJq>Oe6!zH7ug#M`=iKhM-PLGFWLG43*d~IBar0q7pE5tp! z<2zWXo|(f@1yFNV$pPqplSN{Qk3+V*xy698og>x@-%KJHOv8Ki9?b`@{b+A`zBg`P z-RRzwr6x*CLitcAv5-sbCYg(FKURF5h2#XuQnZZL8PyYX8f$uf4VcVmwysg`avdm} zyxjVGPSA$Le+&_Kuczf2fA(9g#sU=JUIe+UCDD=MQRQieqKw~Du!@X5XVBC0+=qnY zSKHrn7MAbOh*G)n>`+>}S24BmVb zPDvP$`4iQ8uh|Zaud*fqeASGOPIi#(I%w$bTOoq_IhOVH9J-A5FVlPg%d5U4t+}qr zxQ0l2pk-6&Znn9TE|Fv5089(;7om=J{-TVC^3oNcZ@8G9=`CW)vp-0z0F#A*kR~%n zJHkmu8D3)dHX#E|8kXnGJW#k>o7-~%T4*Q9%IWy3L+Z}|P}_~p2>_uV64Dg(9atxZ zbpJOh%M7S^p!RY?9Fwx!xE^>UaNdK1!sGB;bHK3e#N0aNG>R@r!!>ZG`VDT3)Tl~7qvW??O)86~%nCp;@67>>|qK}T&;FVI{hH~-B zg>t=?KSPWaf#SVDid>8$wF3qLk|=AWE*@hfDq=iRZsXYIzXfTyI5;qSYv7S&I%3zC zWPOh!`5zpzaLxk~2?+`Ln%mD}*+1}C1|B!sA5YYnq^z^H>0!&JvI_0=UHxa>(8mQX z<=aS4um*aoJ~HwIb@_lv^OoS`}F@ncE@1zE^99{y>FZD7pEavpGPFU=$Q?wJ{|dm zX5Nk04Bd}A7g;hHw;^6 ze5MF442F+#aO-j(wAdPNM zR}wK4bgqF@Gve0*wjkU)&i>)k$f36y2ZG;s(U^a(CNRSNUa5f9`1{XcI693Un(rI7K z7>{J48Q>CA_?ZceO?xeyK=?L&+VJ^L;pVOI6WSrVf&0UtbY~RD#CyPxQ|ju&Rrh%i zAQ#{0xK3N&{aV5OZvD1|vm}oTHt9npWOqqeahfmFdc2zZ?of8Gvi`X@vp?X}_g`XF z=6KARJb1sSSksJQto8t#XU#l*?*f&a`_NvhioGQOUBg{XU}V`mRp7%Qw!1=C)OAMl ztnnrks40pSBc6DyaQah~ALSd24f$;Dx$LA6XUxcavmcbyu^$8>pD-^hk^mzu)j9Yh za{BK}IJCp=J|Kw$#FUK%o@Bw-OFS3XqAC3Uf&Ge!?o8K!Cc=4wQKfaOc)&n%-z`Gc zRvqh*=ZEWA(8N)l;MX4Iri<|Jf9~JD(wD%w=pkxoy&UX5#sG3)oVrvndd;25o?+?b zE{pQ$7kK5<{Yg?Bp@qY32+!^&@&uO9Dt0yceLuP~lt#%H^}C3gbI~18)d zEGc^oLZ^dj6ugoMO_`Wp{{@r+LV$yHn}7n~dgf#Zz7tU-hYwczYexOZst+iv{XISf zroa@HMM+7}Wm@a<3$H>9)?vN6V_42F|02y_Yc=JoriWON<5<+cfTUHtxN4hq16+>w z^{RF2e7h&7EQhz?gydxbT6OC@l{`cDFNLEBM*z?vS&QRWDj$!1nRT&IY+=zN4hN!9 z_6>2r89c7M#^}f2pkQG|ucNr9>f(HXkX-<`V|=MXL6Dkydhn9+lZPZDc>+LU2H4_c zgzUp8x(+^Z``uwauDc88?LpBM`iuMu%46g2MzX(45oi>lVPP*tdC?qjgpaV!G>O7iJ24Z2usUfIjvpr$_Y4yq#>jIig(w>s5 zCrPRE3-OEN?Ap?EPITpV5qBoIpx2f@e$mlrUG;(39l=Y5?^RlOcC3@76BFvUFIyus znABXs>v7O&=nGbKfVXpu6OfB?90@u_lYJ`{;AGsQHgazPxc9fRa~M-EfUiC9kFXh0 z5^Z4*S!gJl4EXZ`is<{a3(G$QS5}OYvkGDevfMai%?viZoBCh2Zd(~6AseQ1A)D>jzk5E1f;2%$1rr4K;h zjNiw<<9i4j7mTZK_KGSGYieS0;@7n(iM&m9JmD*E5OA>!|H?Ckvc~sO)U>rm691S< zb5YCPOOkH?+qEywMI zQY<=2OARl-#i(tjA1A@5y;V8}1s7yoz~J}#hE;KJQ`?zteZ&c=HK$L#Y(ar^`+6Bv zREHcKr^nx(Ea0Gn0<}B7?Y&Z&bfmvx^&T_5#{=-KMV}y@rebQ;u}j6iI}nI?oxOaN z(}G^-rO$uQ8WvtChRRv{f==!`*xujVd+&{X8D;z5KxpEUhyrUHM%K*3Nq}owA5U5a zOdaFY%|HlfG4V=5+H^{pOv?>+nu>-=)I6ci9EN=?{wf>*>;OV!iY6G)Q|kXK7>$rh ztw26j7Lb8Uxh$M90`~ZV-babPAXYgFJ4DbMqfP}L2^!~67E0knMP{cnmN$wGKzlr3 zM3ER>#=nq^(bQG0a#$QwFdv|x<7e0%TvQdi7{VltYm4mlFEyi~rIjSzhJ{NJv3XH^ zp9&Px3bcaUtWQ>&E;?SHl?c7=Rx=ZllNl#Q87o?ILGlZyJz+TN>%Py|$;DEutc7RC z4eRy5>6n~Qa-g-#(L&D9Me~^vSkVFfcFptjFM!Hl8_Ayv+OMG%1)&BuGZ;@(rtBxE zF~Pak@7!l}EuEjATYA;sMrioJcqB1=dS>&C2+`KL)+DK%_W1aCyl$)jB6qtuys%qR zXA#QE@DVZCZ1HvoHj=_^99qCXMP4%?d4w@DvqdZ&PpYd1)Y8r5`{vfu8Q#G0O!r;F zHip#nff-|j>x1_nU15{`DI$u(^WlnJ#yR9_sxS60i(3I@f|Ls(r|c-hmKfHaCN|OV z)Q2^6CO?yoW|my}_INSEThOqWhCiC`5JMQa*v`+rH1o-V4~WZKR26yMi`AWl*dGfD z2G&oSB~MyjDV@u)jf7rXEvD$J1UrAw?|%u4j*h<^6IA<%bgn197g`qc*J!(d`G6G! zEXZ*Ffd>txUtodLa$R+Z|GWj0WTexGhhS9OSXTJZ*F?cHY{PqsFSh~HBw5o*^jRk! zyE4W4D53;uI;Eey&Pm7OAV+Eg#@$exyvkPLB`SM*PW%We!12-h!UP0X(|Bh@A#7TO z1RhCJycAdMOHMQVEwW1EQ zhCgIb%Dw93l=Etn1aFb?9!98@0VJ5@>O;eDqLRpco+LjWs7S-#9br;XMMaMYaz>(` zrE)+gF~+>~<-CY;#<%#O1#mw$FF(x8E4>l>P1}R02-%;$k56JIzuO9N4-Rm)fbgWh z08rF9=VZyQRFrjT%X$~%2uSF<)*yG?r;Cp}D355ousGvmVqnJ9^Oeql#b6=l71NYnUlBMWYAu~ zsxuRtfiKP9zb)$NV^AM&Lux^Vs_UvJ9dO^MmoxrRJ9FhUDdO2lyW9kXrN~WJwx9-P9@6`IAQ%x(;#?sC*yzqNE3e6iOx`gR1tN?%i zZ^AK*$7c;6pXGlfBx;zqSn49!gr0)I4I+BR-niH z^ZQqV#i?=rTc(~v3C66gJp-?R%gfDa@vkq8EJ@w{I&)YzODhIZ*ri(_d$dJY9Ybkr z(drfrsBJNq3B|o$o*Ni=1h-5f({u z6Tsq3kpr7dYBt?^3KGn z(%qW?MD6}5E2BSL4>QzVVhJTzIi2bN@ppaXBitAH-8ru}>*{?TmgJsRLN3 z2!qMpAK*mr;7#42H9r9Fixr2Hh@db4;=>LytICsmztPFd8!X8_+8dC!sPw-HOw2?j z{m7IcclLAf&mV6rR+j;}T<~s+?V36ozR(cSmKwW`smSkLF^PK^0NS|#P7@2MpTM62 z&K|{hTHOmh32>WiWD#7KT#5T3^Shtl^${ben#YlB{_4cm?Gnl#%=(+?xQOi_rW~Xq zq&JPx$V#>+1Sd65hG*wVKoJRqN19YjXaD{3^-^hOKJZz{TgnpFYjp8ZePwk&3#7UK zW|NaIb&r~A6ql3b&5QRBx)1N~WsW$d@$6fc~Fi`6g zU@S5->qxy2IXjp#w&-1F{{tl%@fPEF`mE+yW}ECs2@B_Kho^fBZ`jjfi5F;$)YJ4V z_oQr&+FIC&`91vtp#@D%M{xTl&=31!iuajhE&i47qpV+?knZwH?F-(Bs&PA2e1eJw z@ak$O*aeYyJa#k;LbH5-@kJuL0cfRncY;s3F-Dq$K@Kdmb#_T)8ZL}8dJGyo`i}74 zKB?^iEOTzxIlys^*VkClWp&eMNyh%a)|Fs|AFW&xk|-H&^%+*}HWFGKtkD5(i$M?B zz^>kip&US>`l@R+Up|ZI1JnMz*Ptd^w+YH7WJAG*NYL|WeeL(}CL|4#Mr2Q@`}eEQ3&qFDvxY(Sf; zS{$}LXCHGA0jPepXalvoh;GNtfd5Ti&8iBabpLS7WKGNO+smuVU%b|R14GzvNCHQG zf=H80g6ovQsq9v|7Q|{9Rjli@Kinwud;!(^ym9&f+UIptrN2imQA5X(+tTP!-KW_a z;LENs|7benQ$ql&D0{m-g31#_&0#)Cu2QMhF1sg)lA009XMA4dcbs2cpyKDUpbx(Q z9f;Zf^dJE*%drr>HKC}41gARX;+`w^1V?6x&-Sj;KW2ysd;-6fd8m@VMTPL?H)))#QA&soLcChZ>fKCjD zA}|tm%2Grb%L0MG=G89W$C6?&G?ncgA}VH=Bqad57aXVsmFknixbU_c5nN$WRu!XG zR~GU1L3mPDh||=2H(W)&wN0M`F*_Jz&-4{u%hZ1pNO2{?sw06&!3y%=?1D8hM@%iUDqUY--k=&L5g-+I9;00eHy*o?9VFM;POvmX)C?ku0OXK^NJy_`gMN;L@Dk)g@@@$nfTyCstM)>@McJQJgWgdn+uD;VpBQFP+= z1`(o5a~ABw2=K%OVQYU=)^F>e?wk?tl+}v)3cTojNJW#Z73IPWm_$J5(gd~2`>OdM zkHO{t_F4WqG|O8%udEt$(5!qYW1}7l_#npBs`W`!=1eY+;4#eUFKyaWvSZgQ|+n_$m^%VPaIKUu1 zZk2*O!weT!#MCE&&9~xQRNsAAvrK9BY-}tvN(IO!LcZ#3{h0wXs|#*O8w=WTy08kX zV*DdkG@7%<&8xp32WK39r2^`ou8Q*TyNX1D?A)74*snSJL;e)|-D)(QCD z(Ega|eCO_!lk1LX%Xq&Ka)lv3GIa49Woa=0Dxqft1r=LI%yBRjRbl^($3Z#JtFc*` zpN9Cd_$Pt&2M0igx!7)6hl{3#fr*TDc7zgg?BejnY?U2%LqOt{*uuS!T+w++I?uw( zb&vsVnTfDtC)nflP9)g0Y|VS^SkRr{A~X1VK|b##_z}QBhh*as^j*lC8F^AFTUScU^R_0 zd9;PZa+0_7-(45YMy7@=mb)JVk%Vy(W;r&yJBZELP)cQ`uqIEc>))2teA?yx?^r8^ zh=+mm3`R@JsVD9sddr)#C~9X6H6jRnMZTl9dWRH zqL=%QJtLYOM+e3()1H1wdxS*^pXE81+?Sa%_U83H%ZkONIsI6Tt10dKVqwk8^EbrH zWY#83+!j+b&n3~((IieIA0J$|qhRT0US1j8F419BRl0-kOrc74!ikAM{wY1>S%lxJ zPQgjdxX^O>W~dZp^(}#<5p*gFdtcIp1f@$G4CTc+@VAzL4bBVMys(U=>XH4^j*#~@ zq<-OSIMILf$EQd>>&-23|EPwcwQQbmYgT0tB zP~HQ$fc0(^U{MBNi%E-9j2}tz7soIR`>i%#80|W&ZI&^cVLICUpEJA!(Z=Q3WdBP^ zO?8IL0rGqHh0IKta(U?czR%uM{KXc0;u7zt)yX%6WP=e!uQvU|shm0FzXb|gv&11zTho|9f&Fxn05 zGB3{%eP5)NjNSDj; zYuYSrtfvwGAOowS$y`;l;dQ~oLReGY)$P}v8&xBT(a+WP#_~^ap+skE zQ2-gb5pEH&u0oN=mrRdSi-*OmdSk?k-qUpDkq%8|0_bN^RSg5i9RT*u=R`RG!K;7g zLZIf?etCWhX$?c{I9#!-3VQC+`LZQ2q_jRDJ(d#p!+0TKe0zk|a6 zTb>Wl1!dIvI*v;8`JIFxKZLx9njMXu-1Gx%)G#E_wfq~G#G0A~{ch^Cl;HqY+IXv9@G;}X7V7RU=}800mv3+l!&t$RDIJsS`Whig}9P~eER zRYPRb&zc^msa2Qp^X$Ddi>cNf-3Y^12LxV{((gE90EyC}UOjQ$B&4?rgEM}c_Kj}) z5u$%-uT?dc(XdoJM>BezRpB<`=-8$DWsGAQT3d2OV1z${HX;HUHG#3Kg&b)=;m8N(^7D*!$MOgu&6JL0+|Nziwq-&!SeM(MEV0mx z6Nb3XlFw6`{@>DZNH7Ad3|OX=07b1X{Ik1z&~NQ(4M&^CWmEkgwo%39`EjAjD8t`J ziX5Uz@S;gktJFa@y zq&BZlI412hx6Hq;*5Ce&ZxzgCn9b$KQ9m!wUttsJH_gk-%lAFjWv!7mra#qwwbA)d zqYa5L?F%yDue&OGX%%zVH{;d^m<#us>z6_rUBimw z_m|a`|Ne42TkqH9^nLtPCBA<3mrrwPUjAeu#r07BNd#&{&76Uvhi3*Qb6uvXG_xBT z<NQCsI(Riz=<-=S;Ax9XVP7(Fqu^F97e*N|GO5P2Xr1vQC zk^g<zONM^}t!}sYc<#>8_QP7THkg1Rz)q>2_T1+#8X2iv@rCgg%@3uEVMTsqQ=N2A z!Hux(O6pL;v~-s_3$gmYKT)+obnTjOKMLeC*apM>lDzYe7k&~l(y_$0au<8 zZdH=sTqQa+w2TwuYG$0%{=&w`C0l0HG99Ho|DPM8Cg|-Lk7iVcTdgW!arY7xg@)PY zSE+uRq7AvnAKAr9hnf|aVdsobyO0@%^{(%)TDcf{Jlg_<9F-kQW^6?;98q>0a0g_O zde~8oi=Ua(^7UPy*D561AO^R;$0zf5g%Qk#HC;#!>7|^;7n1;*_Hz}KLUDYmNOhSs z)Gp=?f`pjOcg2c&ra4PoxQXwQa)N)eL0yrc=P`6pg8@|uESxTGA#4g(ig?9rauKFG zJy8m5D03zxfc`Mj&EE#`x^+Vtbw8PcjA0Ltq!1uzOuu!fQ>h*yWs_~p_Us0K7p7$0 z=(fonBP=3fy*`zBsAXWIzoZeV*J+GPR@%3w3gV&}$-{sUvk_~j1OY~V^Bl^(pWz)7 z@BK_&pR$pMP|5bLfNsHl@PmY)2RziRtGo@%M#Z4;5GQh7e*&}^A@GBFewdL)WLDi; z5&;m;r7x|kujF4kfY4jz4v)Z4iBFh_%Z~TnV^fGCn*j^*j(nscOkM>L8e2A$izr=| z*56VBw;G@C7i3<_1urvkMLX4ecq>>Oo^$FvNhgzw$crb}N&=G2E!Msv0-CtEf zL~qXk0%S+Jb6#xMtGfFp(oXcvy1nUs{?q7VSg2MIzN^VOU_h9tVa=0vVFh5a#7syP zdQUV~Oot2)2|$xhxYfi5NF)^B+>g6*9Z7goKL>d);`qm9KJdy3U(4wW;4oc55 zw$ZSRE851A8s>xZjHGFGi3vy&x6joOq=$YXU`>((unB(xptY7DcDy|gx38?#mtXsX zdIAKk7zmP4>|d_}XE^I+u(g^rOw(&f)CFrGCt+2oHvbdY{bSscn02qG?LnrxJ&sC;+1bi}ei-&UUp6tk4=0 zD+9uQhGkfahgc-vSW#00IVgD|n8eYvzR`hu%~e(4ZaxQ0OTa1$kpR-;6o=u5`}_L` zO3iHQw(J1X?dLj|W1W8u@-K7^6DjozH2u@l7qBw<5Db&K{zDv3rx5p#X!cw5XlAJq z{CDifkVl_*ced(Je%-b1a)|y0cVECf1-dE*dcMm|78 z_nl}!O0~X70144>!v4CQrww&VnB7)D@c}IPsbhjiTRnxcP9ait9sP`~PLkkF0HxK0 zhKW(eQ)UKTH=G6vm>N4Zs`Ur~fuz-g%goerLu6W{??m4HD9r39Yy}Ydb3(jQOqyM* z6cAf$8ZQiynn_s7aH?>m)Y_fo8S82!5Vd0b2aJAv68RPXJ~1h2@X)TcObdcYWq(|+ zTQQ#+u2HT-JuWDWvsi^1vyy{+iokN+vP%VSQV@Q%USMh=m$6Mx{{LS4o=PCSDql8P zY(kHBJ3ATQzZd=1(T<<67uT>L;aC#p-^Tfx&AA?iONaMuM@|iX)c1xR9eQ0~uftaI z=}*hILz)ylQU)A-v>v|5K~|1s3C(4;!&I1{(cat=%5)_~=h3G>v0m?XuIhdgl=_=< zhCXX7abaQq18uaS8 z8z9%=7|MW~5>zpb^l%g1&fEYk{K{+a)gd~oQsEuFl;133yFyQ6t$%1Pa)j8AyI(iJ z7DbkGnzLRh0WSb6Ts^~6p&<&#=PJt<4uJf$mTGy5-483izA=xW2S!$9$g9v6Iz_A< z$wG)ffCebir*VfG{2VtsfCxwqZe+74w*gQTY3Q)_;YX;$87;kkkN`7s<#py1ZGnQR zPAdVc239bI!}_31Pjm(O8!q4%^_CVHA~-M=&-+Sp5yg}agn{DWfJmYvtnfv|?K6c? zeC@OX5ea9AYc7oV6Gxzc2UeS9_kKi0ee*#{jAmDZB@z!nw%I&!dW3_~!KIyqw0{s- z7JH=3X`yZYUC0VhgS6m(GWcGS0z2sO32S8*NC9(o7S+zo=>n9B1MkN(r=S?Hb>9Z4 ztP5%xq^!sF8`7KPESs1Wmyj^U(JD4+o$oH8(ksf3vtnH?aXcD-00`LU{m#f(G2mP* zCJFoQA4isp+Fuy|+QX_kWg0PS+L^3nv}Le**Tw94P@d4b1;wBVk{7%Q^?eUxKfwtU_eqs!Vpm27*UHn7H;Qm?{O2iEJkiqrO#D>+l$-+K>RF$CJsV6)AGDr-9m6}qI zH&<*``)1xkT7|h>Eo1C%X4UrQ*Ph&`d~f@dHr}XXBhm;-e8#+l?RF|RX`FV0M;<_y zg-I>*`p;HjpJSM#Mud{h@SKQwN##Qt+>h|FH_yOx0?w^f~3n+mS zF`BMD`!ZjpE?Qe#6*=eQFDs+BSdYs zZM_z}jyarx<{NwEB4}RgGTw4~?J{p!*wehvnHmsGf&Vfe>RDJ?E`<_H z*bMiWb0>(6L%@Xn0vAqd=6iv2gc?beMZe%ru(6R-oq7W=u0{%+Eo?YJ^8SM6He68z zXu$@u5m~~W6vxH|TmFT=p=QC{3zKS|Zusx9@WcXost5F}|8=Y^3W<+OqriMV6cXHM z_AG0dr;~9NdG&EzUq4OgSbfHP$G{XP+3`#XOKpGpzP2C3uP&r<`@*F}%oTMW5>AiD z-Zg5$6YW$H+cwM9b!OMa#6XJ5%l&Lv4B*E;W=BGD+qzax`Zz|Y{+F>%$fAGieUT-m z?&8BO=Z2McAr0b8>8Mq8zI_tf^oR=>E(`F&er)23%}&^6M^ z2VhDeJq^L&+y9pLW<-=Mp;noYR*;gAMK}yjlIh`zn%DQ$RphmJA9vV19w@y&msYbb z9-&l5LwBPgOG2O~o;@W^?)!nI<06=dZ@uCL?&Wun;&Q`j%y4jUTUS*ljY*LLR{utDxuQ7Q_A5m940M_LlpF7{0Z844BZ z&QE2vVN`3&AZuQI2>S(SLZ*tyPZox|+}QJ#KRCFNIh}*{^{E~Pcy8$$F%v|;d_$x1r|xo^L9@_*-pt(huBhd; zvMBeeEs&Yp)A-JOm&*?#$ik(H^%Dwr4m$Q~X!;Dt`{XTvM`3Pa>M0d2`+UETu!RfA zMJ_T#vFPW zd)lX&eoV}|9(#jSe}@%*UWaIQ#KoxI*;~6VD2J6rCJ+-l#gPH&6yB9~V*a65(+YrA z6}i->VPOd>)n2-a*@vKt&1DGX0$0gVyYx@X7?ex(hyg>}g4X}P%Kv^T!oVA+1;Y^M zA?>udxUaL3*!$D*05T%Q2q=AtBD#Ur*g!hYzW?7Y+4_N<|8ymlxEBmupf*%7Sen=#`ZXqg}q5E3>fm3q3I0r-jCEp@ZxkVStwA0znG%5p1 z^%_*FW8BlkVh)y_gkoUX>>#_6uq80;2DVxhqZc+kEQAxXdO07LHX%;0NiZA`aKF{# zZsAPiM5;Hzmqp2%HB;i(^CLf2H)RX)5a{42DlANx;zG~{;{5K8jjdE5s3pcwwjfL& zNr;GGA{6qHS=R1Po2qs!5~Y(wSyyYr(L;14)FtN0?s#$DE+`w~Er*ZzOMi4^Y-(!6 zYz~Kgt)Nh^_Vtv+(z;TSVn?xJRa>rU`sGDG_=x)&(vg!DtGYNtaSy=S`5bVL56Elm z#3IDPrbZSu497O}%^F`LA}0*<+HfN$US_}b#3>hdHVP04K|5V|tJU{y&p{){V& zOOU;g_3q#E>ByI8U~DY$@%6kC<^WJYx80BFay%TJH`H6q%aPK+AqR9$G&&fWtUa9u zbuhPQHi(=wZ_|~qjkQ13S^sRk>05T|=QbMUR4;4M%FNzrsQgfHbvmzk(s8O-x5ms; z62rabCGGRF!;QzvZ8~EJkjGTr8S(ued$Q3vC8BwhC7;_PflV|KB072k4K;tA@lvSu zE%;XHD|K))9N!#Ey-}E zlz|W*#va~SKVG7N7edKdeVjgA!vhYXAAkLAxqzaQaf^1>?>0q~LxdNCcEJHCA2`@Xoly2BTi6l>t0u?(g4J0lWCfmddxz&Q zfYy@nnE;~-=J ziPUOWj_enrh}4e83c|K+97=3e@)paA4{M0@(B#&nS$eJM zhvn_=zk?W-XZ^z4tIQXpeK#YGI*+xU9-FX>;d9>~A2q~4IRYqYO|mw=m5#Rb@&c9t z)E9_{iaH$QXTq%I7bTCO(wVEinDjOR6RV^@&qiU4m+8}*w&CAA49scTzlkUk32OQ* zi#x{{T2aR-Gs|GL0Cv%*e4!4Vwbc#g%=4+oRuQMr6x7k`|g z&iYwv2IWF*`X;IDTwYt*Nbav&V}uGBk&_GcZQiB@o<1t|E5gEUAWw7y#2Gm4A7`-n zj{*2gTN{&7xWZX@x$41WV`lzIA-k)j(TJmZ=Iv~m!BOQS_wSdPI?EP)zicl7cl$sv z;PWlQ3Ge^eivH>70it+BX~X%l@qZFE^(P|_^(Gayv^?!~Y;A2de@qxO>a$NwOsPoA0(fM?kqN` z0H3)E-yv?gyDb&b>r}HfeUhe@?}3*oqMNd7-=7#r%LQn=1E8e zGSZ6)0VKe~OuAL7Q5p8NRiUfirXQ)*FlqVTPcc&@tOno22f&oqzsIpdq9>(miACXA z#=Z3LUz>2@oD|+`+0E&m4nF&KbRSz4aGRd|ch&(QDiovZNUa!A1yDU`q@Z7PCR7zy{28DvZAyPb{2+qrBORj%bG*=Jac;D+T*WWQep))Yp zK>#EHOAM45G8-GktDti)W>Im@0gtf94mf$9!*F(5OhA$j;QJOF$tUE<*gsf+^kbeN z%%1y`3Zol@7{Q)-r8qIF&6C^D6uB1s)hZ3f$TFL1s7c7{JjUL1Cf zhw4X`M#!&q_7MHb@`;PdNq&Pv%FMm$R`=BOhvjLmC>}N@Nu{9Dv)YaN@AMRd1pQn8 z3$NoH>*`CB%P|74&y++m4vV<|_basT6=5$q6kthWS_~$)k8Wo8`1tQ0_oOO&qDh@n zVBh5P(h^^WH#eE=(eD@;3tucerx|=tV^Y5vr@TuTmtjB7Y4)G?<$ngXww6$24@`dR zKp=J%O1x|%qkIJSrEkq=hwAw(=iMTY*&yN9f;p`S_~zS_Wh^DbFhh#r$@6}t7*c-M zO}%E~)1fVI3@R#u-jE}KfOwjnsK2T;q=1c5VC9>{fR9LMl6dOJ8q!`bixhF1&)uGXI*~}za>wl zf&W=RwoB1CbL`R)5T>8V6N)-m;6K5`&DM%K$^`MpHv~u|G4D526<}CPpaTSEzplV- zAwS>WhN;Ml-z>35AA6%Se6NZP8^9Ma7HGH)X~6WbwvExK#;Q9a4UV2$9gcm$g^R%u zk(hz@V{6J--F%8DawliVztnSd5U(6jS{^EWPY)ApHs(VJSNXN#sGewOrwnofyz()% zJby2N!7rCIZ6;$@|06Otfr_XuQvy?>onL zpNK3Fc#L!nnWMDReVDvpt3x=s+H&JF5S8TPmZOiE4*_47VlU##L|0QmH0jQkOc1XB}nenn*n-czeZ*Ao8QCw9T8^ZFJ53 zc%gg!-zJ7@1SBScVA$(U?)>DrBY60itrIL0CLI zJiOVsmYZTm!WE1IE~+f0`<3n(UhgSmOAll7Ys|(qoLI!^9APRhy3kNRj3YZ(yT=l3 zIN2z2TP(#S&N0|nWT7N-eaT7Mm# zrXLDOYS2VWxG+8XipE~;dUwzt{%vy|7fcH4X2V*w??%_ZHr}7exoGHkjs)aFkyx-q zI&m20&@iI~UuthPJ~Z96a>1`33A$r)cfhlZ&84kc&6Q4<^0@o$1bJ3{0(mnL^o3uq zq-M6?*MU(Le+ZgortR)%>L<6|r2O%C=LDj9y6j6kHD|RmN-}-a9~&BqU^O|yAmcEH zu6PVPmv^m@+qJGfbEV!s-&VI*DuaG4HB{*z6{|Rbu|jDeUCFm=x7n?)T_GQ!U$+7s zE<)B{4N5?vRLtBu-DQZMSVGN{ZZzDFCPU<$_H63)hu2IAqe_pm2@{VRe00O%r%#%P zC90U<)gM|OU}~s@7mrd)Ti&_Qhh;mnma$`1HPxPKR_hWr*EKKRyI+VLx&|f7Q$L4+ zq`DDAvks&@){MzAhjou3bAuWgrXc4~f8EE?NWVsTEs0E2+~N*fmHezNP-WwwV3h z%3^iwi)Pj(@kOjfKeg4dhirUZe8VhbIhjjaZE189vT@!j^=~)l{t8gn^ZBw9besGu z>$zch;MQy;K~0IbsP`~xuB*3LJ<=u~Caa`cG%Qy`FnIOa%^DvLJm;@He=rjslu^eH0hdhCG(eLnRxWrNE^1xO+*@bfp@Z0sbgYH znRwagq;(ohDBuPu(IEE<;}m5-sw*g+9*g?WaiPQgw=zfkPiBj)4cqd8f8VxoMJw5s z+{%nYgkA_KpK+yCfYH3(@t3li1fF9GVMYG_+nszlN1JlfZdpfdOG|EZ4f0V6++Y2r z;L-Z{!c1jbDbte~+<`BPax_XzG+3V*enNsd=M|kcZ&C`eUnF+@e2XGknMU z;&5H6ajRPFuh$0zN#Q)9;Rs{Gc%4}7_bV3!b3(whc0sNW>+KTOznqu95{Axk+yIs- z5qe>=@QGh<8dm+VHQx$*8CdLdej-BIl}ImOk1U*LNeSTyEv&8=QZB<5RNL8M?+b;0 zqwSJV#+*cJhB?ajt)gCUcDCu_<_X=g&J^fjJXb)G>@}*zL1m|grBcnJe=|KIG4540 zXA*tyXp;KbT<{kQgY6r6BT)&PciKcV9PV04o(l>!;Y7z4Dm5QR_0-<^&d5vJS**5J z*Vk&0y);5YFFb*Sj;LrZh|TN(^%U7l$Vq_6=1UcK5LTbxSpS zdAaQv9;DAY>XUrv2gX3Z;&U!L^|=ZgVd;=+GZ=g`vilF3Zd* zBfzGI>*-AC`f4rAym)#g3@~;ZtTy!3Pom|d*{X+DHzo>xN2@CMz^?6DV}t#l7;h-+ z<%*u$w#y%WDf?_0KOmRsZUh*~#5gsFk2=tN-bV})wW}Z5%ktHS)wLVyzMJ~MeoOwq ztdR$Kd}jTl`VkMf$G@U#OSOq}TBW`n?bQ;*)D^l04C|wrd7=`dw|)2HzHR&Mmo}38 zmZxLdOT${`yf+Kfe>SDFz6A(R2CuAJ*5{pX_XR8ByVnvfS+zMhP=3Tl02pALI4H5zB-+$KDMo{D`)2vZLMQVWfxUc=hw(+h7 z3iH7a*F@Ht)SCJZRWI!)%ST>0)Q{$;gZQP>OJC88m{6kNTJ794&xu^q48uAXk>=Sw_4^Vj!6e%KH5T}=dh!HR_+(AhTU z=i++XYJB~$HEg$%8*F)#mm|)#o@9S$5p8JTa~;VarA5~w(;LN^Wv-l*9A-XKh#gCJ ze9=9ct0?@+NhI>Q_;zkiGtp8b_f65H;)B;Y@{};O?uF`=PXI!_@{&R4$*C#rul;qK z02)i`E}~WL*(HLi%I4429C9ies@rXBX;JXNhUlZZ zz5GtLqagVBxr3^8zVc5K7MUpbfM!zDr!*9Zg}Y#D3T&2-1}D zESJg&)hg%by`P#pA@HcHAJ5Wj6jw_@;w?fpy?l;H#~giQgM2&J*?aA^*IxCv)XUi%#3gq~RTE-TXu~F_ zJhIIQp_$ZuaO|9Dik!)`YVt@IjND{!5hAgmg7 z34VYuu^2VV+E#I*wHuT#PQ&mBKawZFsH??mD}!e*@u!F(qF98~@Ibir-+bM^zi5Y%T9GJ{u| zk^ms>aL+7XKrO#=6>`R@|Lp)_jYr3)g}wy!vs}kdZa;r&dI|f8ht18{43QMyt*5!>~-jLJ`I~T0)@7PlB_J|hP4i(Vh^fr|tIsnL?k9}La+9H-Wjx7;!Ic!0bxecKcX%$KIr}@9Nx$ z#C+niYRsp2UwB{XpPGZ)HLj|+l<3*7qNjwM}Q4K0MMm3)DJPs zhdO<|i7TX(?!I^jK~{$uk>=RP#Qv0VrnT~59+(w-M~vD~z(@c>*m3!FQe+P&*`!F_ zU=nDQ^!Zb7MUi=HtUG6NWjb{VUN!^q^H-NgTU->bOQ|Fl#8a%H1D7Jr#u%0=!Z#^K*<1KI*K%4_Gjx}Sz9C7lH$b@KLB$7ae3{? z$)a+*lZ4Wjw!Cd8iYzfDrD*a&-n$n37(`Wwoba-k$4OgxgiqTAa-PG=WG~CezFr4! zLjqUy39QDb@gXAcAib#xQMo@DadlG8YvrY1;*fd}?z8#qm1Ie4GGP+8etu;M3FIW; zS|C)bw{PVN9S<$-Mq$pZRT?h%UpfxX*46U+_rTq@`19*rYs%gPTbH$H&AD5rq^_PK zeOWp}Ubfa5CU4})O=?{3?6*}{fnNYo^!yb8+nmSe)6+T)nCF^i!Z0e+E-2=vkV7+{ zz)zb|Ae%@!(Q|XHush}LXW8k<$5})^rYn8p?6RY`Je_>5E)H>6X^y+Jan761=Gq$i zt9iY@yd&qqbKWyC{3&GXVT;xX&uplf-`!i~7!nvv_!RY#)PV>7^K^iZ>`0tr;ItwF z%i0B@lBZ?YXKl^B7h?cdgY+`n?$>7JX=CM>TQ5~}lf))&2WU4I57tg>Nw(0(|B!_= zFLTcltDP1kQu3B0Eg#eN$_^w*;%r%+l=ajW@FOKNy>3tN&wh%&=t#?-w1y>ko|Ph+ zR@v|$wOqKyrKT>S8?rGTbtF?-|J*_wVDCdW6HPxTO#KS&*e*}T)?tR+Sv)r|_yN7Q zRncM5uy9_bTMqxc*M$^Dd_{hlO0B#UxyvrliAgf~)OtZm{945gB?nvRT?uW~)65Nt1EhrOr>oQ3%?$Q7LaR_@M#$sy_)vuC(ToY7@TJel;(?;u)#~@|n_%e^ zcvkns&!eH*uDQap;&G=U6)klY#=Y#vk_m-qt&^Ulr^_HS;i731lp z!ks|MHR~;kiVUF3vSndSO3;ed0AzL6PgX&}N-adi^1P54F;tSiX*t9FQB!wDnl3b`pcBm<%SY-RVTGDpd1( z_bqrAmX{@V>hq5%A(OCL+Q?fiT%X8i;umtS9ejP=rH4B-n1fO*r_G_aHY=2q{x;|$ zZVEB_C8GUozqhh}!9fbC*=MA1YZ7G_EgovQuc`1%iTWOKNqXMLB_G}Qc@ftcc^cNU zI;E-NMY*<_n^}@4-5!XkRZS>niuS;u+$LowHy2fXBV0Nqa!q)E+BCN!TOl2OPvSFZ zV

t{VY-s%dGyCFacgKCxqLtTZ%?S%GOZ1S+ev-`}QRxy#3P&=?$nD*EdaJdfZ5F z6E2;=58pCoIPfG*iz`p+K$A+7`?4akH`B4!eXR;v*@|4XAlfNqRnb>6RoE>*2L$+C zz4wI2{i<_JtNhEEJ~^h?q+|A?p3%yR=;#wY67ew#gGq5~R|&jicKzsWYnPQ!yI5uT zSts>=v8Np3f~Vvatgf}rr9wN$*8Djjg#E?3u{EjQf!t2^GOjk&FQ=@_dk6h4of;Oy zS(X_@hv$>YWW#v#e9m{e_54FH@jO67nc{P@M>eo3s@USP#=e%i)H(By4#DR@`I^gT z)`o_Lt?YN8m`WoE=xey1Ql(-10_$t|+SG<|a%5j0X>@+u+3dFI!N$1b<;kk`Qq5N} z2J40M_M5mse@I;#bww5;f78!Wvn?NriK|VLv)~qrOK_q++@NPkqXWy(CZY5l9W9k8Tw?BrcG|&D{KXJ> z$NQrk%cFxLZe%7cQUHoanNGFQ*;Y%wP&pr2$uNR%{u`vYyhWP*^njnVLa@Gfcg`EB zcLEdk!@eh|Z{HeX-Heidn}EeLaDMy-k-3>>xs4nM#%cg^-)XsMI#N4lpZl$SXIRPA zAg#iie73X;V+W#FdE^!tW^0`stOaoN&=Sq1O8}T46!iTzTd_KEeR>-@X==gVoM=}R(bDe?h8&}&U%ir>qAv9y}Mg>$2H~~#UU@Zj!mLx zHk=3qyDQ{M)rmG7zF(|U_I;jOE8*$-rgiCg)gfT{@tc!>&Kk7Ym=DF)G|yHyOSj@l z0qXJ`q!97`z$abjRW?fYWyNKj{Y(jrh4)Zhz5YhxoTU~g70oM7?lXDg$9zG8yMb8) zPdfv~&dfJllA$>4F$D!hFL*7avNr_UI*}Lm$P~qIfNg0ElfBc&qG&cJtXFlDbe;99 zR-M_#M>ub3e{Ewpc%-ka%ycw!mZ|?nkA~r~U$s82jVI-BRIh!@MH$vJ;atRhvhq(_ zQduaS9udAYxp0D-Rh%K(E@@mT9t|Kf+D=!(c3WJrjFNj(+b&PuHSdq) zAu}}2=U+baxNw4r^5aaMNVFta<>MNZ>(JMDZjqtl5iBr4Lhds^dv2gD< z*Io#?$p3i~PoFVbV?RW`k}a&O-Ef|3|8QAAs6FyZZxZVAOWL!l4%&SZUI|5&2yW>V2|H zzXudA3)%!{0sS}!KrE*N_P$G`TskpBk$iJ&6a)+k&agVM2OK>;#i^iC{SIF`wiWPYY#E)+QV_j2Nv>!%MrH_kKp*?;4};sO$jmbYi{n9Qo=cH@ zGnZEYSerROjQdjBpUmMBGTeV(a;7GuKLAaoPBiVU73k zcZOX6P8F7Lag>OvBg^Vu(@ws;lsnl#+RrSa&YZS;y?Q*@Ov?d{k1^SEO?->~Wn^Bi z-_n4aDLg-;DZTLQ096{<&KnBaW*P~eRkvvfu?V!(ab<=098SKGihRtz=cl<=yB-ix z7SmDl`P5f*N@s+dEF^J#)VybJN@;G|%-Yl!aQE_Aj!{HRE2QCzWiDZq0L>087a}xd zs+aSyoE73cP8e?#pk+F<9#CIu@=j)TqbB| z$5{&EIqu?6h_Os5?6uRJKA9~gb>G{CUBy#gSU_{~bNjNpV9Ragty@uEyj7rAjmRjn zPY>RM_!iy9Snos-u{prnP8(Ba2RsGm4%cFl(DBJ<9J>5^N71trZ74-I>mO}(UFfd1 ztq)U52R-X*jo`PZe^3g!$GGP0u#|coTUURF%#R0;^NdA+XqXEaV|h}-3RJn~HS<#E zER#9K0yR}0R38o9hU*PvbJ;2eT#_FR_PCyP!E`IUv$Um9}02-dsqTUle6s;Nzz&uToY3QMYP)a+*&r7%i}?RC!Nowsg!AYqGDA zG`Y&RMld?!@bGB#eKmxnCcCzhO}{#6a2L?$!QZHc-juWHyR76o4%2BgItgH#w(LXa zdl$rS>QN~hv>cfwgMWOx5I3`MJzR`TTbiorq(li$x-^f?xN4@R?7}2wR zRVP`-|29Sw4p~siHz1{CWrbktYcjIPPWe(h9N!ntHTTRe;g}ba7>yNN#w=(4+2|&f z{eC-xoigN(whZD%LE0^wjaa^?Z-8{P5Ocme)F}=1l7ZHDm){GYhGHsV5>L0Tr!cMa zaj@N^m{}A^k(;@1KN7bHvhi*7Zfbni;SXv&ft|5{GzPvT3ne%ekd(O+?s(D95u*hotzvVBh3yM*a=d)7 z-))NeI@DZq>fv_?t8pAp5ceEzUDtJ8zdG;;a=hHbPKjC||79E05m(Heu-%LWIaS&` zg)ikM9w2Mn%G~BA`@5lcwAzC~WYF}F9f?4Pk4Fs`htsL1!FSWj*tXfQ2Z8cnmeq8xGH;;G3RsJcD^55d!Y9w> z0z%I6oGXzpl4qlqRf4F*EQ5>VxQCPqFbJCFOu^>Z#?bfbb+fLi*rwR;EjqAaHj>xo zvNp@lHpE<9KqTN{J)l0v522iz(&|t!Z%NSe8nD-+*$xP(@#Jce(LdQnZs7}b=nJ5N z+C&7Mf0}KxG474U`)%0~HlO!dd-iiUf9AS!KW!MulOKzydqvK#rf|73I3piCKpzT5 zgRm{8H`&KqS63dtN&)wh-WNJ5C!VFLK8=iQyVduS_#+K`!v7D4is6q}@`El``^{D^ z;-mA818gvu;phzaFoj#SZ=23deHgXjBwAlz-%7?*JF{-(jeIV}E46y%xJ(>BE?z8< zC&4?Iy6MuU;K`Pty~AgTQPB_U0s5)<(Vl#?VotSYUY-J;tc>~U#% zZ(mRrlem)0o@t?Wf`zlW!PMKB!3em0chHG6k$TZJH9EKWZBKFV6L>`G4sADI#gL>|p~B5F6KTnB8I@dEF85QI zyn40e4HIavSU=6j#MATKIbnM-c{1PNDOVN6#5&ppGOqX*`d(c1Pb`4IFM3ziXT~9v zhi`-pgdBYB;lZ6@lv}pA6@hnb0?d@Ei=?1oaSUTHQtzZ@{WL#u6XFbKvyNFH#7K;&U zp5u$sOd%t7pqFx12e+r!icwq7m=9)&zf7yyMJbmD$El$zCk7xSS4%M3viWxd!F+sF zcIOTc_)zNW1p>SpNk6`74LXKIp`IN10cPspHap@*!h?pl+rFH6iYYk^bQV-ElZAM# zBb!frViQzP=-8f#d(m3x^oTl+aHb<(}x+aO{6ME`&V7A02 zG5C%2^{6htsT^){rZ|m3*$kn-2^s^3Po2KPR72hSaTIKL0Ux{hWUvmova)?Qx88Bo zb;bJd!zho_KrMUQ_yQzDn4eDxr+D>vS~O|i(y%Y*b259?$l@2~q=6rWgNQ!TftiGY z$sAVAG0u}t$7F%p{H>&e-L{4xPKm(wL(&vFFQkMh>24*KOiNoqCuUxd-4CEOtwYA_ z+v&@*n^=}&y3$nc-|{?;^4E>8Q>QL#)`9D!+j)2QZx zjQAgYQ9h%3}ijaE6hZ-Ix#>MGuFy|0 zs<)k~-_T`&OWB~|M~by+lAfz&t=*i^?D{0S6YJVnPHrv#aUJ`X8Z9&Oy$QgHy%Nq+ zh6kH6$s1-RVm140b&UXxZKmDqzGD_)k2wciuE?-{js&bgx#PNjXZ)R|RMD-FZwQik z9Yw&C;$EZ4F@H33bR_mQYoRfvS6Wn5A!?YSsq`8DwFSL)AN>_2kDBXvdy?1XX(rbB zprck;GphFNMMnru;@+U3p6jHCap(M4?-V19lgZ~~h0l}5vy`Gr%3`UQpt;ND@MAv7 zX<5@@ooBzdY`W*E0n~kGgno2Fe(%D!IoeD{K#$ccW}HSFaEzfjcBAb5@__Q?3c*p zNo4o$Ic@CwN!NP=N55B2&VeNC#cA8dmM(eyg+pB488siB{Hdi>_LmJArt)G4h;(zD zi%z1Ou8HD{V8x4)yJ#3wT80H?H=qmf4sMAp(ftqBlY3wEB*?hTyol?YMmrtY^a-lv zqyc(mTHj7eOk}FF%v9N)Ye|`X0NZ%Gnqi-iYS;3H$YLlV2@Ou_YT*2NQfKx=s*1&& z_LoMWidj2;FerZWR?i^MSvsiA8g?+~^i4qRaKcBUVFljAy@!e$VBI`jr6W#T6(F!G zL_0F$a*IVfn6j)in0^Pb&ZB}clA(;XqO5pyO8rb$dxrHzemNrq;@h|4T@xJyx2P!l zKNKQ_Ge-L*_ViNEh6E^_7YGrP^X=dZ9h+$tO-)+2s}*0worGCjp@Zf4>ZzNAT7~f&%@UGJL-5F~ZyAc5r(LM~39{H5)!w(=Z^|Dl9-;Ce~ zJRgqp!!+pI5(fPSI!vGJPgwDWOtms?=CxupEJz$L7@)KT-v%$Ns+&Kd@%vr5ADCr; zhdfX|86~tQFyKT!x_B?e3^7^*<7&WiQ(TH(1bS;T6YV?AiU-!XeSO}rx$+X+tC%|W z>e93SHgUznM+F>aW^c;Mh}WRwM@VBk)*7w>37;^UV#%)m+s@H+r7 z{5MpzS}|$h8C#|`5G>?$UK_f}cn5hueJ+|<$OuJ@^2b~2jR=|xTNeZO=_(s=WoT~oh6htC{v`?)f z;kJv4x1;=SqAfd|j-799pC-*%776>QIV?;`{iw!H6X_4EB)vS{(+fQ*+rIS?W;TL9;)kONXVg9q_ni^`% z)+|6#^+V6W7i9ZdSlP3u_Y%R$!n7=vCsK?$&~I<|Z04)Vb;>!?O*EcU20t0nM<;5o zQYpU$0Qb+4U+sDx#(+IVCS`AWchq2qxeBvZmGLa-H`)Z5n&rS02pF7;oSsh4Vd0dO zXx9{04Ooy>G?zVziJ6m#^Srl7O4gxHHFO7a3VFKfR<+s#^pxB8Om#IQr$LA&C6pvZ zYjDIh1YzzDG$ty~>Lio)rzR#aw>=W>6`ns_PgThwk^Q7s3mZtH#GO*OTilnM*{ms| z-J)6a=|f^qK6&)LzA*(BZX{|fORx{O%X%f*BjY8AE7uDz7B>LG1@XIZY7L+&`)Y{*OGC4-E<)gF0X9mqp2;s&}cu_n~C zkZ{9e;`HDpsmvsm&)IU*nLW|MC_YfYsQCja{IV%3xg7D-?U7*PIKopf+ZX=4p*34( zdgbKhhLGdMr4W4a&CeIis%bF3nY}kcu#&a($`UK-M}9&X;5OKgFT@t`EMWX?BLG?+;ls4>A~+fIa_6@7My!XqY) zwp!J>4~Ry}pESEFdP6qlWu502cYcTSWb4n@#Rs%09c5}FDEiy4rp<~$}m9m{S!Ks^8M3Uz?@?d!ik<>TC zlNd|19-JZCknyp`+`z*dzG0TXC#8*5eilu_WG>8Spl+>R@T0Flzi_uF?2|6M;76Xx z6$8A%{POY}QWOZQ&T_Y&)J&Yb2bpC{5*66~v{r;4 z7)Lfp{n&>XX|>Rbvb}k*C{P=i(8IIYYO?A3vdHZ5h>p<+7muD5>;fvz^}wgaE~tcY zJ~MLLQ2@g{hWA~>=+!3IFg_TY9I9M`0e*y6aj*1nLcI&x7B%N9cr>BzV%YL){b>f7 zEr4ff+9W$MiVGZIMr3u0FEiW4uo~D^Znh z+V`-Wb)-F>x^Qfh)#ZS+Bu7Sq6y&EZ~}S8rdOJc$cyf!W5yK-I)MopRgxt-z|~ zgDTgUd{G0IIt3kimI&({DK4^c+kQLKFpRkU3|*YJ0v>g9j$8T{v^oZLZk3N4;jxzw+8xiTRJ3exU%~D`K^P}lN&yw3G6#{~NdgV1$`T3)fP36xnTd{C&#UK&AO!@7)!33f+ zA+6e+x4C|;1XgUnm379%;RG`&lRhngQqJgksHKK+(1?i-Pw!UX+$TVdrJsv zNWzs88n1h>VVqP`*ms%7>pQn;-&Z?-nP)e2qcAHa%mNM_p@-GJm-&Zv^2V;+qHvJXh8XSNeE$M46aF!Brp|3mGI`isazYFhQ;Ilu3LXEGVbHCbc3*3x z8HvoNmixu_aqI~A_tB6v;wjH1(p0CHAg7YOyE-9k)3qJ&hoz{Bl_`->1Sln1`265N zxzNoCyYhf`{cxgnKE=m`obQj+1>onvZ1|yjXJk5=w{GDDu@^KrWQ~43J!>rXs+p%> zj>ezA6CJkyXry0YpSU_t^3KYr8aRfSsuHZeJOIT>x`NU4 zE+EwKsFl<{wP_@kxJWovjpX?Gy7mw@zr5anP&M#LarjO0oX!nirR^w!M#N)GymMT;M0wL_XFMK9ViKAXA zrIhfEuA;=brJsd4hX1r+JoxPanV=amR9n9i31%lyQCA7KPC(!zP06qQA=VhA8%4QR z<1=u%KJHmfswXWWv(K}qv-1l z0?^b*!&I-Byeh&78=0$R`Rd0Z{64l7kYg?bS!*!XBfROr+Rng7r#D@G0u&9mLTjO_ zt-4jL%+p4bI(|ZL1+~=lspm`dnACiclFj6TS@W96u}<0nid6QSoZKeWu6;YhMVRb? zHadJ8$0*lfxoT(TS#`d=S2w`-35ULx9XwQ1G07!2SP;&{1)nAPvc(3+?vX%7 zbq+WAUgSp_Yb>ypX_<N-4zF4~H;|FH=_FfUI*bS76*h^7gUhQ2-LqgpsUOR42+kf!lk}dt&&W|SRPB7p^2}8J6pDsOOlmV~=u5Y{8`O0JlQ(m-EY{&LERH9ik~$Sz)M%O5+$}~C zDV$B;1DkSUV3SkWFSQJ%j5BcazJ5PsZ)6Q= z=e|C`8h~LfrfJ~%iYI%^%5&D-tI@=(aI4B~@}Eoi$5_OYgdZJx6yBj)giD;82$q`h zsUyrKx8se3D^YGiogiL6{34^1Rh4ZJQ4urbRFML5%+wa48C_2yL05LAFjBF<6gv78 z{hxc2>4Z&t!dp{2sieYm;*p%z^kwWmkk$|;<^cj!7-{L$RzCEb9$;W$RCrbBaKSeH z$jHglH#_%?crN-$y z`ahN2Fk@QCKGY*f0L&MS)-4R`<;|%);{T7BYy;6ehKgw&g7fG zP!UVc4}X*k{2H{9CMGeK+WIa`Hz-1eg_eOuEiQgWaerd+wpI8IbQH6anjT9~*F&(2 zY0j{Z^Nm1a;J?I(@m?QxMYMr?V%RHK1WgHEzn*x~UxM*ZYW!ux{`DQ0oo!){6BqN= zgGnNKq_bn}sK zwM0ZD)mOfGIoAdw`@;24dWgNhlS9iOV|0c(x7PaXxoyWSHzwtuuH2w91!?y_4pCiNnW_UoYd}3TkLjd`M?- z(DKR6G98E8f?i~IZhM8jc5O3*j8fsuw=o@5QH)!Xk_BNZ>RzED;+~!w#xD0SdsVVv#|U!XA@Be3$g!`|fWRid%47^aS zXjQec;wfl(1}R7`BnblOBHk|WMjEc~vAYMQf&`zl1{}S&1>p4>KVo+n@Ye`X~hZ&nNsL1|#PyJV` zO(6(9LJwlK=m|fX)A#DwPn4;@w3S&m%`!T*|CXc%%- zc#?!s9Z-CHIYNbCqrY+V|L$XFlvp$7U9Fw;z+#0P$`x4UzjZi6<-zV8Ngk^UXDi@z;gejm+;2|IrqUmq`tCPg!gJ4v zq`vpR$8kfJ7{Gx5J=qNidBOD{sCAp0C!hK^hh#=0mNb1Mb(d&2AVRx_oBl8Ux&LBs z!3x(r%&Nr5t;x9WlV8mL@HfX(zjJKE40}OH%1y|`rCbb|3ZpM7ERA=0xsp~OrTRPS z1K_bg_P#UH^hzp!LNx;uSF2sgf-07;`OTOk3$wC@1_xl0=~QBv{qmRnw-;L`3Y|&1 zRe?Z~kdjnr*;YZLS8~}Fcks9N%vl5cylsBokjy?gqxa-L6*1l%~&K(E5T&gc-fc^LvAJ0)29*p+%n8e6wIwS;;i^;CHSU zG>k9TH5v;g5?SSe^C3Dneovni0~|cp!);2WH8ozlc78{loMHy#kPSWO{hGw6_20Vn zLU8~IDS1QLW|P$_?4KO-pWNqvd$=8P8(3a_ef_|XgJ6%rRQdKBzqLfX&^zGJ>r~^MTPkN zTQ**Uqr1*l)RyUQ9Pl5L8rMk~Eu}sTMIZ<6?CiwF;FTlNQ_~V+fklZm-M#k2wzhsI z@0fCV$=WP?d*TU;ezbvzLGwiA`|Fk4u%P+*w2ZCue@OG=soj`R=P_!jq&Dnk%SiW| z=%CpIAPUHu7VRM@|FF*qBbHJR0CRjc&%73V@5)i=&bU+3UdGTpAGjlrX2 zkPZ`(mX(j2+2od%c1+6ANr~LKp6nRLX1$uK%9DqQJnVSz^6sa1(b?{3&M0LMG5{XN z-d?%H{(VyfzKQJKvtOmS5PyTgI=DR}Vo9S$RSgl=lF#<4+PP`Vk#%!CASCXfnMER6 zPk8@vzko~TzuDl==nlSZ^RuYBx$4dAHx__?aO2YgiAUtWXNOq{!;=jhl@f8ucQ`K5 z7qj|0mcqtIsKk|kuqkVD)@yhCZ6ZeIvKTdM*&Y$X_g|2_*qVWxHaN7TLk#%?dz?1` zE(5}DfPdV^B~}$NX4|{jA1Ee9HJn6s^X$iKZ5b8AM*wcx-=!&FLd7b-!+vy^?;h`8 zPp1VX8un&+NzwRR>_wSd@1Yj9>`R~^iPeyVtfX#;)<@IC`a0TI!G^iX*W1U_rBXx^ zS~7u9aa74hCT46G*fy9Oo6pv`9H=O((dhrcZJL|OH_zMek#@_-pO}1b9aE{K&CG|Z z6ikw-mvi8l+Ez$aGxdh0=mpOmn^+py6*rzDku^K5233AzSVe}Dp{EDm;Dbsp{#XUr z0(;^p%4Jch=9zy_8A0wE{|7yWMNZ}Fnx?tk&C3A6Tch{h9~=h0mW7%HqcSp3&<@uY zHnWKTK>$Np4DT$iN%@%t?g@R@?4fn{|4WDtKV&Q}fbdMU7v|MI^JhGE^KeFVjsTfN zT-XyH4c1iIIFI-CIO)_ffZ&6Fdo5nYp%k(Pt(I8KR9vEk=a`0p>*a$7iyf}7tJyYs z1qAEFe0&1OPA*h3+ni)&if3w8YhHrlvT!QdEFjmXr8-1R-ZpK*EwZUQm!)UKM8kKG zb!UBtMW4*%4W5N`yNDpsjV5ufXJuLjKS+(I?XwTanD?s^q$MsPH?F0>4($SB{u_+j zzXv9kknkZhSqPW|o$?~;u}uV|Pi|Ja{o4|fY(wuAsF;WB6Xqv1SK1P8{EpRch^e?b)d$-~w1?Vfdd8k%J|$|cG&(?38~K#XMy z9d6jBVHdpLFP~p&f|wh(AxBSBX(uIR(^qD!AziS+iNxCP#YciO0)QJ;^XYI=O_z$Q z%DS22@QrNzKrh?g><_m9ez#C>Cmm$hZ_w{!v6^vi&?+oLF2EO>nmxe z>lJM*ot7X+vTZSSh8$OVCvr_$HF+dP{-5xtec2Yca;n})WuZA17MV7>~Al*6mmksJ{&CRmE=B4ks&hTGeu98)kWWo(j$lbc|>NFGA9kFOrLB7XWZt! z#>DwUyktsXGFLl{o-Tg9LEZFol7=C2?uMW7_6DYEDe+EC`TtCQ)_Tmf=ZdJa>Xo9THL5`dI1`46%g9kU1rXLzorC+ zh8MM;dLH%Qoo!`NRq&v@wsFf=J=4aEO?D|+ANnyH7j(0LAgnTkte57a=Ul7uZ{AD@SfE?8w? z&C^sTd1sSFd~f%D34N}q7qdRPDk+pMN zs#S&8Ts2O4>1c}lLCD*kdHzja#>688f*N0IF?QGul)lxRV_HF;x5r^{X3hKm*p2`H0{>)5F+Spg@}k&afwp57RD%Moi2fo00qqkm z`Ne$~-4|52vV2L#drigu)?K!rUqHebpIh{hnLYj7(ZoVHeN7m}h213L-ayJyNJ^wu z=v;D}xW2H{Et0eh_{Gy&!wA{p^WA-7>*ep!*rw~jR)xj(o4oU!w)?$uaijDru=S>+ zSVEkk?Ef)eF(d|1L@Ve4Kq{aU7y$KVV8lOc?#!yYs%mPzPJ_Y>NO-A}nh*eLehm+l zR?|3!{foR{|90#07W(TR!rNyDNCu!Qy|>}xYsC<}MXjWw!kl=TD$?dwUSR780wpFS zKx747^rM+IOBhlEi^v{>q_{BrGT^i^b{cic5}Vx3tvp+ho$L zQdfENhL(kkYf*q?7%CnGW3vwqpI|6VhQDalx zWt)479{K`wt$@vn8wQ#UoH%=EQTg}OdN?T8^lPfVz*EMi^oLrtH9sqV%|1$15`--N zqR`TqBjtPHovaIhi#FJ9DDk_#NC%1_-=#so|J=q`*vA*XS^%h>HvsMlK-(DfrtnzP z_Reg@XN+&&4X zPLhGS7FspX&MMfw7Mo# zWBg`mcV8Gmx3mJwH$j^p9`jdJSKeEg9($#h#^73YspvU{DAB{$$?)4vW~MvbQ)+gIrO%E^?x#JUvt`&Wi_e21Im{* zj%JnadHv7;qHjJHwZkT;tQt{PERN99(0)=w#vRiekX&u2f8)(YyU2r#Wdeh!IfJo- zH+X9n*FhSVgMgsTNnc&BL2|t(@DMQ#yyNR)SvntgP(E6+cZr*Uke&-JjR;JF8dZ2AqVHsoBgVs;WjRkGxR#rL=}#vq z*p;|~?CiQxEAolg_b)-fc^frNb9Jyg{`sBLWka=LIZk$;+HjkG$s_O=ON*c6lm{T~jsJU-;=d#oguiSYJ$CN=?8{ZnIP z2LO;G6S2O#QD#;rs&1YgXmhCWfrp3Ow7YP!${c9a>-`hR*J5jVzVx1J8E9jUD`)0A z@4bhkMTJiNi^ry38O}9(>;g!Uy{{;JmeDP&tgUljMN@E^_TWtd(x`f8cDZ0*X)0wZ zgu;(CW|i{l_*F5&z`%gRJk13%(GZu|abHj_-S>1IUNS}A!3N-rVdAf>uGU$J2ujTX zptN91w$L>IlsBORS5)Zf`|H%a8|cHt75=F}&+%y=KMtMRe$0-Xyu8M}TS(Jx0qzRJ zktoKjZc3#8_dr|`i_z1o<8IMD0QFH+L(jV4a@+4phh9Eq%=iHH!8{Ge1JswmGzT-w zXuCMnaf_;VMNPFkyUx^@XzB=L-tO)1>FIv<-c_}$oOTb| zv5!EZ|Esti$tYS!Rp+TzS>LU)JdEbbS7u}ulCAm&{r%sb65jWvPxtt{m$&W?;lqY` zPnc~1?&l}|c6R)!sYDv;>cvFrdxPk_&+-+$tjWe%J_S)I`o{}iuWRISdNm>m(9e&9 z-rqARzBIiNo**u_wJExeFy@k+#ryuTLnR1xQ9f1+okk%MsFSFN=ilGG?USeBK_Ga$ z&o?;_@mlYvm7Wikp# zd5=UhWzqEW)3VmjvZZaYC)us$J|B`pUX^W_Qdfy|oh`|h543ESG+#4|T5oQGW;^GK zdxh;h$?C2vPZ4d){__IJ{)z9vy4~tadG=f1w%J>*CFxJ37y(XY#cG94@^E(+E?oVm zBuhieP=*dH95xN?t(_7^SXbj@d7Gp)vL0`4Az3=i;qb5r`v`@(qt4e!y^q^BZtuAD zTH%d%@*Zf|Sk*tJNsL}-#nYRrY(aJ1a{c6?N_>;Db7d+1mAHJmn;{lIbW@0d^_NGolyn7RzNaI;hH zcK+D$+4X8}Z`22R82{B5C zCaMpXh58_`Y+Sg@%S*g)6fcik?C78U3A%b{0Y>iEb{BvCWILMm^O0$i z3V+KuZF;19VSR(OBcWGo*jz6`R+OC`J7>Q@GZW2jd~*_ihWtE2jk!WSgimz*gcyHt zD_WLqm6gRfX6gyT$5;3v@Fn{f&rilwyhgXzn(t0dPSX1APqtWs7Kq533B-yE&{|{~ zNDOeeFeuR9k+RS3cbD?7Hu`INn=l>{Iy#^*z7jCcoT)+K`f+mAAe*JQ9`R0k-Kyr! zTZ$;g#bJFJ?qAsc;UD~Q-0#G8>{OA&wDkc5jSDJ?KAdv#@Y|dIT657 z4reeAyw%QEIyMQSa(2Q`jn2n8E%iAfys(r8pXo&5u;j+C6=w@*RsNXg5ii;B$u#lX z9=0oCVI?px1QMI|uo%@Cz~WegKpkFlgB~xM)$nL7(`^RFl)jyfYYAjn#H~tIaix0B zG-!jOPP^EcR1Vb(|Nc(@JWtsmH6(6$7zd3Is=!RK!2JcuV6>ciyQOgWQec;HDjbhF zkPCkC4^TI!fxsgvICVZJX3hWo(0+ZAP%4AqUoC()axIV>zrpTnJq<*2x&8*I&no^PlVuLSL*$eeLLPEc9dRy zTUlNnjRdX(A!#L+_)_R-3P<Yd^5sD;44>jNzWzURn!Q=_ri3N9~67YDFJpe*E^NTeLr(EX^W!1!liGp8l^1mBF0ISO| z@BHG!K%9r6B<8x!5KM~l6Tv0Dc5h)a!7pVx*q|EFLe9r`kI^`FoJFwz-mZ0Q=-3dE zyLH&VhH(qO1!S+J37tO}1o3l%>?iDL=;)?aTRr%@t}WkJet>=kR>xhQuji-DVuZhF zXsci?BR;bpUSDh$O)7tI*zMNUB<@R>ImwL?DM{iE`tf_dOfOeXsxDR?5%_uhrUCMy zIrXharVQA2jwPPl>&{5P>W^L*Bhg8qsELLK%Jah#)5CU6BbC_LBZapNnPBbK?d8}P zHd<=xgiQBSyeP4mLO0c>%jopL0Pa57%C0V|_bui`qnTXB$36{LvZwFfPu1b{EwSPt zVv_PHWjT?2SY2Ip8BB?D>D~FRF0sT{RS>X6pRymwDbC~1b^8t#f0F%6S9FYh!1U1n zJwR&oa6k@mcetoCoF9@Gq1I`6lM~Brz)4*j_V$A4+>`v}E*tKlhsW(nVT|Z=MuCV^ z*2>$`o*pxo(4^oG-;JE&_9?0`X)j6Wl-D~71R2u%t@Z0aHz-mqHoJ*>b?pQo2|cw? zx=a?K+F~iFt@_NC45h?&Z>LR_d6sY|Y0$=OiIttBpjO9z{8OHTnh7T&g-79R1rJuG zJJE7{P>3}OS2nkF!kl)I@>Zq0M)Hp~UfH#o#E%Ugp|38k&Pz=4Sso;lqOe!JSQp5F z+wN-{V0WYY=-lJQG&)AF`Z>S@>|@oXiZ{;jooi4&*6}Va+gfW(>XQKlk_H%SgVd2< zP36LlNZGnVH9}5Y1;(#fsL*%l*Rp~-`8%CRp&j$x`o@}zcsJe3g(klbvvN9mrk4IX z{7H^0Fq)ow)x-B`E0-;)BRieuboP^$e(()sc33IwDnlwFFe+zlRG2@WNFcUazze6s z250KudQf5%)%`}KwYogdtQfD-3YloLrXuUo!*OG#81Z6R7348bEvUjkzF90 zFnbxTYZ!8NsmPindm1{wmF$CHNPGTTz%*!X+eqf2EM70DHCiB&;GJc569 z#GOnjve8O025CY;;<{|0RSX@>VZ#tH>_d~EhuPYZ5KsSxGypE;6CHDe;~2fj4AdQA zKZ~_!KsF@vs9XwEFb4yfC|E;K=O}TN9=E4a75_bH*}%NK-|@3ymFa;N*K3&3T!{-?{xfCO5IaK4Sicb-VdJEb8uI{Z&lQc8| zESm1`-`8J`392r+)d#!`XQCiHNL<}JkiRSV?@P(9_k`h?w!l-d;CdinkjeqM7s-Uq zzCwYG92?fXX6#qScVq~umyLUwIN^@q5%9toh0l{XE8t82H2^Kqx9tj;LkgJ7fB84L z9GHS-R}y@$n(fy_Saa2}v5<5+`sXGr8KD094BsR^l>c*46;wEtjDhSdpE`zOD&O%X z`?j9IjIWc30|*dN>)8@`!MDbe(q&`M_sbQ5{u2s1V*6A13EJ;d_r_gGZ00{lRDVIF zBN_F)C&B>X(x^tTYLS*V?<$;H4gKc#NZyZG^?21J{&osJ)lbvUPcrttbA-?TAxB^w zfi>nC;0@fX+3|YTJ*M`imd1kG;A6e){E;9X7)`5e!0|cYS1Mi4m z;$G;!E?i~_US}bM?vQ^f2X~_lKjPHE(e!yf;S${-2C-N> zg?P>Z`Y9!mstqNfYLKG>_PzJzb)v;Kr%h3$661lEk?zPgm=3}37>*WVi%Kz-{`6iJ z89NRPs)C8-57JJ)+rlGal2c6bwA)EquAfnA`|RTs!m06<-JP2%tVpOLg{d(r2r(Wm zZfF#MwISIGaHdHl31LE#;zk#AXQAK=D8JB#&naA1N{K%_;kai`u!1W=74K*S?necM zZOcqeKN!i-TF`2%dE?hSiA6b^_TDGg=F`q0kM?ROCK*r;iR;~n;O!hgsp&}nX1p0+ z8rDqdM%Vh^1Fb>{6QZkb-8~6Yim!A?qP)jJDTf_;Mc>ItJj)nKPPVGylj1EJtJv>6 zqSHS^@PBQ=-}jpy*3bQNH%y*q23{MHuT z`hPF#22uy5-NV%ZH_+stFQF#!6`d^uUA9CkG{&d+?0_}PCvr)2j6*3PeukJ;zdmwI z_|^chr^AL*Eh6evKQbqL2pkuAjJ!Fn;*;i<{sB0BV)t$?dR*;OKG40p22Z`sSj+1a zH)PuH)B|CB{=dtbAZ26fwtVF<^f;;W7jv1@vqF}&1--{gfuhm9(z|;OHmRcUB2EnZ z+;l*1#jxv8 z9JOq9uC#IoTM?Exqhu=3i2u_#p+Pe=Q+Bgd=;iK{P(iBy*hejX9Yvw<~Tnm)|mvdamW-;^K0m&L9v-ky(Fq zu!8&LC~t2DB{m{F{N(*!Rz;K<$BXR{M{W*6iPS%RNCz|wA|_eE$OwyL{k!q33u}y?2=Rzex41N zNuf7rwEel_4W9=tLd_XJ->RC`-s+#F0u2f{y!bty;yx2c+b#S`t+!jFR4x7a@0VtP zL!+#8ALj9IB4=S?NzC-V;2>wy!wJ2DcRgKJ2bnvfbrP?BJ@R_Cv1^Y+#>Z2uFo7ME zu-_+XO~r+k%qqM!l+EPN@{vZw1WpeM(QljQAurBwR1pel{7II(8jJ}xBQ|=bsMV_O z-f?P+92COhmUK|+7I^NJq9O0Bq1@r_k%K6_<0iZHJSg^ZcDJ?|Z zv0w{{mR6lk6p=QpSnJmrAKs~eL@#23^m_(Q_h9&Vt5`OlC%CXdW}(ofZWQIRaNu*{ zN>Mx8;(s6Pp(U8#+i!9ty_HPk%k}0tzJ;=#}C6Kb1 z)MB$K;+94oc}qJZg>EK&h!8WjP%Kzu?h1)do67d#@RjUsN;s3vhO@iNCpV(r`di3R z7JAOQT$GRY5!D>qn;h-S@cr=O&Y2^aWP;NAXOhv{yIB|}Uj2lKZTC+UFP!m$flLqU zW26$TGG%AhqQsBcu7L>D_bSq9rj~Zz&0G=nw0If{A~mAJOpF2(5${9pC-&cL%rpl* z`$02}g=MmK~OlMSR8-7Pt}f=#?L0e1<`y*kt!lM@L;JjyY9ej_;#6AR!LGOtcmJSQ%pOvl-At{C6eW_+`w_FjB6=B0PJz`;jxHA?o<<{ZP@l2G%5V74|$ z*vBzrpp7~|^ktVvuG^JJ8=YzIdvKEH_|)A4-2lEIv+N6mri8D_x*AB_Bqwc1*wHXl`kg>X+pA$`oO`FKk^A#vGi)&%+d zyJ!9H3igq9%n=&;|DMm*RB-I_j@tuRi&bVJp|&s~1%ZKZSccfB-Pasa7CjKIjIWj1 z%Rd1Zg2lShf=!L@oTw-$)?0m1q)D{e=CH-ED!OsA5m;kGoT*AW(bZ~fe=fJ=VR-n4 zAOg}M_#Tgj6T(^FHmRKAS(VJ6noOgeR)U0fMo9<%Qd2UoFJ0dlO>@{ZGcmgP$}Igxg~(NY{L5YK;Ri>qZur$q9ad$z*f4 zKhnr-tqqN2wY%D%RLL#KbROdm9Qdu)laK3g^ht5G!Y|oIl@IH zQDe6j)JB9cw?XQM-aZ(=5O#~{X4$*!)uhkMec{0E&UfP}yM~qBN;FrA zf64*_oB?$uFc8C>aJl6H$>hAXwBDe3D^+jTtY3OnG<*PYcuQa_C2JFqb zKhCjme33|{AD(!PCVm_K08G$D+7fd_` zYY|yCD$AArz2sp`2N04kgfeVuOb-bKK9oUk`$H^-z*tG z*yGvzD#`k7Qi~x2l?}Gebnp8 z7M(jD6dwN{3Pl;4nl##p#^O!U`t8Qyw@|Edcb6n%zA5<`?ZODh1E_w4?xufb&H%+`-(Q6v1obrlv|I zs#xgVD=DCC2^sm%HQ?U-Eb9GMRrek`6c45Wh?|wv`=pDLX6jy0e{D?5#B_h(zEBkHN; zp5I&={1^kN*>!O5)k^!JN=Jt!?lsupidHJ@DCqfHw5h3sNhiIhF&u^t>D-$U2hvm3 zr7>ybrelFkL$4F!FOeXKbLCKx^p+LIUn)@AipA&y^XMvv`>E1WwLgIcX+?G-?9S$N zTNZ(#LyZ~zGmH+i#3IDtV|8qCW%v|EbtK`dS3uylWlV#*7wSlvX<$q(r)H9x_{D`| zZnncw%TE5=1M`PzyL4>>m5K_5O;t|68PoC1y90*nk3@28(P6oi$Rk2mMegJ$`4#I{ zJgn`JnXfy9qbu<$(n@O8R^v}fGjz+}Gl^!?$`5}>dbS=z+YjE)&bfShjxqn4@{Y|; z@g(hjs*q%A|AjUL-d!#ePTt>VI#tS?|AKB$zt5b^qdovxE}?DN-nFDyUW%V~=ZdJ| zac3=op(b=^os=+CM^g`dx4@4BcYEtsLc(w6JBWC>yQ>AZR};r*_zKJP2UN(YGAsm{ z1`A}B@tb+M&p360+U_Wz6`ubHz3(bDD`v3UG`)A8N?z(~@@E4F-w8S!tA2P*W;)Ks zYEo~yiuCpvPLz+8?iXEiIy6+E(5u^@vY((>n`tK)!;s)=>N3v4C~#~HA$6QFZOY)! z!ot;WR|W{B5s8kDC+1Xn@}^MR>G(ZYDIO`~WZW4>Gqx%c`Ubr7!I3b!D5YmYUr7mV1t9UcZKi0jy!3p= zzEIe8QZbYIS5C0Vvv86@xQ$&VrLTaLO7-t=3`yUhP}|ZCuucJ?5Q;$k$&C?xNdee0 z8-LgYZcsr15Mi0ox~_$q53|l`F@!6=-N`3UEGHWye3N2mWtl1?qbUPd4-nNlQZX+8 zTf849OO6Fcmx?j(1dtWer4?-@Sh*PFLUONw0xLieD+O9aFXC7ifVLJm&sgUpg%Ww#r+&CuvJVQV(&7}; zQ*#pw)UfGbPS3B!VkI7j3l*&oE}C`-Z$7Rb=8jLYBfck7*#xt8rb4R=*kvKFM^)1S zVZ~HmkNRt?(Q@_qh&l#I5iAhjNzn@X@hR#NmU=gh6@}C>G z_+Gap_AQiDz)K*kUnH_W?YAF(3C0XaiSWh>caBm%jB|ykO0|RWyu?VoH^b=n0RXdv zAoYFn$7aJS)1ZP9xN1()Vnd>gXW!CVO3C0*H_jI3pFmpN2r?|S=hc}iXY2nB@gL#D zJbU@@hTQ)mwGFG^6iM{=ovH7jyhF~HB0JzO_r@Ejus0f>{Se7PTYQm*lk`+YQm-%1 z*S*|_B7GM74Ipc3e*V;m&39+F{F;TZG3K!O(>KjJ#|os2*d7vQvb75ZR}nc;|-}ux8#$ z*#V6tcNf)fe+dLRQa<2%rS&b##v;KvORS+tE`^|z&<#{>icvp@xV!N0h1^>cSr6)+ zr%->tER^H@a;)35?vL7IAhko3UN?_1T!|)p<#_> ztIk+pX@6WHPN7k%!__|OerW}3$&Q*K6BE;yqHvnaqMs7k#aIlCY`H?t$Yg`VdH$S7 zu7=dEw_%?pp)>oQ#v&67r~Z!DH&|k82^kqB_rGsXchWvZ#AkzMO09TxI+v(+8-a&f zqMim4yAICLHPY3UDrS5u{xME8OP-d$tPK%$r=ucMiO(PJd*Z|oO>*450RGo28_aOd zp26u8(JzgDkXY`G>CQYdE1f}G!6e%J#5yNtfcMa3Ed7JDM)rqP?9RjqIg~E5>?_WK zuz0Mi*n)}GZvm`O+d4mEYa##CY|XHXXE=TUBaIyCpBiwXNyT%eg4^g56woTV|HUy0 zZ^vo|6UEOMG310Y*qtS>!kWh6M=uuZH^TV4Y$}0%CV1#l&#NdqMV>oS7O!2F13Gj8 zk(fzF`;VVxwf`@XOv&r;bpbeJMqQ9o3#2RM&z9z4rJqNz4&!D$0+cZ2kW`t^pj2+}ihk6QfUU0l(yXb!DAd+I=U zyNpmio%3ksF9Ic(uIuE2DhUm8W*WRCc4Q>G8=4rXF-(#0%mjb8w=e5N2=~ZCD!)z@ zTBJ7{ciXEjNZ*7Es?q6uFWKZe6>0NVf|E%6bz`ZtjB~5&ru=qP!{Zu|trxpRCRi*8 z(vANZT&mQ?d^m5F5NN6i{;Kv)=)K!Dq`&>6j4E49$u+XguF8f%|5b0C&K_MGNP#@_ z^GtaRuk!2M!*c#@RvVL)T7jM``}a3l&zLwA(SkG}d9;Sg_hYV?HBrs^+=Nj9W*;?ZBte`7Jj#O2l&4xhsk z(YlN-w?bCNkff~HX3WTqz6GB1i!~|-sZG)9r)AkQ$37{m3Pv%9nHApS;f=rl2<5)TnEA$o30`MIx7E{6FfgN<{y&_7P!=j$&~3%_yF=|ttA`sa43>gK zqOsKY-zd&HXiE((~!SFw10Nbc(60K3H|rve`D2>aL*iUs*uZ$`!P z(v?bt+VT+eLDo*pLmb;52R|d_I@meO=cQ3s3c=B~I~d(Gj%*0|2CW1QkZ}mIS-lEyO?agTTHYH_jDaC9M66qHy^q9xCZp#Q zYG4{@EP&7=B0_|95%U6XKu6cJ;Z{kk7{vxe>3XtQ_i*gG8UlgO0RQO}c9xd&56I@` zQ|lm7`45Gfp@6L#b31BQFRB*I|aXf@ioJnw7|h&p{a}$YA$g_4zjh~nL46K5x?6K^ROTkMt~QM z95wev2AOh<@d~W+XkgCRrc5$cN7SlI9(W7y>I2nk{gR`1y&!NoM7}`#xP5V#^DIWwH!?tyzTqHp!$V#N7a{(mzM_ zpS-~_!?}FneN=HOf0Im5p3!e(0VYJ6cMQ~n?s`QWCZABRFZ4e*N)P{aat6t=#x4G@ z|0#s>1E}qT78A*yLVo7kU)2T}GEmo4x-Lq%?n`>~dJUg*bw)b;yz0EH1jYTJAwqfb zii(BHEotk%e97tQvNrTAexF8K6CMcCuBS@gEEV0~z?iYcf1$QUCi^71vBkDL@&icN@D5)}Dq zSlFxWvVyF1O$(pPBxu%ZNDscy|CSl}s}O5r+kmUUpMSvbucYC`oitLc=g+R0)@h!B z!>{G^1eY2=HJBLB7|O0T4{g$`teR46SayvSo1XGZ6B(Yeyn>}!jDb9b<5DU25YG%T-A0ov({l zvObN2pD}i#uUO~>8m1)`hKTq!4vvb*DD@!Qo8YHK9{P5;m)a;=pW`jvBZjJ8w{b87 z$UW@A*OAD_!4NI{?IcMHIX_-?$8| z8I!|y6I1FR8qZ(92rZ&Qd=&+fe{LCUX+NK_*!)R)(Mr*mzqHzpD;^LSYMNv=?Pa?_ zb*g!cv$#WepLKg)^Tg5YXtW09R@$=K_VnE=ZP5=6XXWV{`n?y!xC82RYV4ogL-Vu; zFRBEVlh@t~)saHPHbJF+CtJbj;D>J-Bs!2PZ4M4Do2^S_dcHNv?!fFTe~qSyFxlSx z>*o1jwk9kb7|z&C?^P=k@KMC)u@cF>K19urB>Cj)PuDkSO&h~r58HJ&?dJIfHln0C z+F;*{3I=MqhybXG#8j#9NQZ-|o@oE=`TU1N^Oi(eI-Q?9f%b|1W3TLpTV*0x_J zak12V`c-57Uv4$2TKjDE)%-YZJN9-fZl^m(utW4-_|=v6d@2)kI4M;tnzq?tv!IaA zit%J^ctkIi?L1P%w1#>_Y`%_RQyBgUa_M+IcT3aB#xuKw_N)?T;u z@Pl{FQ2n_W4EYlA^Es&5P6a5amo+F z0Y6uw&8$o-mt`_nrbqQY?Y40;{l?C@#mYH<*xX^P+u ziQ5Mn7#PStYkxITf&v7KqcdfCT+Kw{%Wye_!D}C7 zqd)VlmA+$}Z128DJ;PA8aUhg^oQ&!I(`KqFU)*NrJDs_Td=^adnOzHal`Bu&Q5E~g zy6?|-IDxt8nPBF>J?j5Rj9)ThC5V1S$cVPGJPzw(wrg#zd{K@yE}r$uF)wx(+k;)| zL|Y06zwFY>Ioiz7Ft0^pUGl`0Z}+l%l8s4P;0IA?J`k2KeKGh{0RswU=cPP}SA2sN z?(eYLr>ibtEEYzvWoz-Td_v6)4pfG`g?|M-Z|u|B4YRqm_11}5t23u$YXG#5$n*_7 zN>wSLNxWMw?imD2f#w$h3M{TdyDV_Z#Cyiv?+yeLs(^JiYXr_q;%$7p>mmlQFL{B+pF zd38^kq-yUaiQawa{{`-uMdxLAq@>+3V(VW91VYGN*Tiol}6qUNSP@=hrL^A8bF2$%SQR^)5 zN^JN>Z#@1+q&=&GK1@j0ub)jMt>jLR(F~$=Gw!24r<%^-eE)4|=?XI`&k|`CTsyjw zH5;uf&zNnfh;m3OoAcbPvA{3P=rr>i_uFSxl+(2!iSYv!6UlEHccCJiI5WAdIH9J4 z)ZDSl*-bsyUwKh!+j%%}7aMTkzgV-rX^xzY4!@zmG0(q%q2u}8`3_XBi#Na=IjAs7 zJs_Ak8`a`fbSH+5cPhk^=wa^#M@> zCsdZ7xk0^eN|f=k@H(;46n3XdfqUKZ)afhIY|dF{J&nSCI2KK1Sn0!G?vI zWCwR1^!9z=-NeBITlXYM?^(GOTFumf+^Tscg^)neBS zU26$_x1o8w{q^~;%{g4Go8!#id*TFNL5dzn7jO?&w#Mg;_Mx;+K|+X|(L(eM7Y1hb z-%p1iXLr=i5)`U#X)|nTFW)M8X@&V?b=Ia6qB%tn3vLVb$HONFbUL2qpBt}E#*~_s z7n5|PZoP+{+5{xD`x$(`UB}la-nGAIT|YFMdt0!dc-OKiQ%r_K0&J1^!L>rK!;V8- za^7__x)sQ<#$JKa%xkk(60!ER*?{tcQKz7%2C$vm zdyY|qRGRkpc77|7S<&xJ2zK}6-O!`+M=`Goo(K?;kGZl0BX$j@{l;v&$pmVGOu#on zgSwwZET8gcOPm6X>zAH{gB%`P^!P`Mf*#z}8TKaAU)&^p3{L(+;@CH`k|()eJc2;kKAW|bzYMO9HudGhVN$KMGs@aM^~0~h(yP*dY~ry?l` zta;u3U|HS3Kap}#h}Buo&KSVT+6a7H55Tl__eCYm&qjeuA_aYmCKqNp?7bFCm1i2w z{>*U6$Cc;D2{RxWN{Y@BLnbH_`UhE?Mk*&TXZ0_dQ;Ucqp(})-hln~;L@{Qa!X0n3 z0TtEjr5`ZW3Gf5itU_kzK7ibv>Ss&4ZW%PAtboOqNEh_)BuQc<9c%iG4Sd%3H0%nh zssy)xHSiF|U+;KVToO9)ZK^(Sf4j1VX+)gIaHUxGsl`zjG?5Fr%<{YlyCL1+s|;Ym zTa4mn2j#4%M0wCxAl{z+YwaGo?d14iFQKKg%%a6{!Yq4v@w4jtOxv&i~Osz~VPZ@EYw z_6erbT*=7D2(*6I15h&$Bn7Fd^ZLSK-~$e-{9s{wLfLqfuzu)+jwCNa34O|M!iGF=^$w4LK-WN64X z(bmEkj{XeTOR+WkC>zubO|q@SPc9{f@`3rMal7|14Ixt-6?)&y5VAfbxBhTejYimbW^~GQbMXAc3;-?SOq<|h=P%6)I6(k!Wo4XU3+5=6Bi{8(*RWHY`}cy` z#h`^MGhWt*zG@jnY}GXp;g8zzz1a$)qjT6bdwk^VZwWLaiPz z6A1|+LylAIi|v<_TAn_P9&9(dHnC@fAztkrB^FbOFljx8^pP?FI6Tsv&#-TabqW|Q zHnHSH90G#{V%*G&)OOFqqHrI{%T~KT=xN!N$SV|V9VpFkXqWy0)@?P}9`PihkzG@w ztJFHY;X4)UCWUlgACA9G`1*x45E5%2A$Jjm zPG4b(e@!_K)}c1lrmR@^wRHvS*livaGjIZvQmju|UQmx4?}g3p$l>qLbDcE?x%i!8EUfU@>EI zbfT{P(1T}2OX7q^{i>6wm5?sA;z==SSxzu6W`n@2eEtkAt`z%2cXp7vWn3j(M<(7U%R}=2X;3@t{naV|!#Ly2m@D^9S$u7jJ ztJQ=w!&%Kcfp~rlbOY&@s@7~%@)vN$|^R0zkb!lr)O7*bl+ zgMa)sk-mId>Y;}t`suPSL_hJ}`Yz#E9(61H!&e7EQZ}T+X&x7!-4dEos`4`uS~))O z(Ed-uJhsu6+MgY;dDMiV#vQv;T-qqjJESge@RSxs3UG)YB$O^q{}#}QY(;B* zkDw-zM`59jV==K70Cv&iJ;gnFD#(dEd#$1)s@w6HFAeIAn>QjWkG62~IMeeCRT6;D z8&mhbI#D)+7kSvL)+Q|Fszu6PWraOZ*NKehd9841+RMP7VV!&6*Q=#Y@Lo>%8P`Si z)Vg09MuvO`Yj4Bn4O_|>b&M;c`h)~eg_?tWi)Q=&W2%tlBicX<`U?3-86^sYMd;PF z7}dw@ZvW)#8?KO~fBR9fTuLZT6eR8`5EizrK)e!FjN~=qHVUL@cK3qb5@Pp`3rzwM$K6|~GJD9H19VJ-Kgu?TW->g3)k~E;s zY)CT0(n4GhTmnd-96n!9aJlErZ!1%i_qe<3qAU~sEqQL7pXbYefSJVO5bgX;I!*Q` za{R5S39u^H(L(^!crh5519${kD;A9bm(A=^9|y2Ez|Y*^mT@~|};8x+&AKZuN z&h%Y3hfg8XvkFN*Sjn_w?l7^$D@H^_;LvaZY>pib7IK_KjsQFrPDb~iNcn19y0Jf= z3K~QZPsnE}fmsqrc2^bpf_y$AgJGu$$svle1-RU=gAU!CQL0Plzqt!ta{cw?>{SXn zfnK#<1MH&3w5lITh$QuuUfc(k{!?*}8I8T+baq8RIJR7a14GD$A$;5~dZiS#`OUJa zv*kgo(Gr61ky0HpyZ4uS`bp4MBJvJhVIHTAvaz)r+>ldv8G%3n)YQ8WU^bK7grw^H_&I#=aKtsdMY5OMr zQ_FP_!XR}8a3G-dXcGwys(&82CMF7?B-_oNlb??ck&2BT`A`}qDb?P6w-FZvD+|27<%^9s)L#*z{L>}Om zr;(-&9(XIggn{IbiTjzUv294>PTJWp`B3V|T}6BtmnB_Y3YYV5fOqfu3vAGX+5+~7M#^Ag*T0ELFr!HE@4`eO1xpO&6@e|!41&c`3lCWPQxaf_=r2~g%+2t)hW=WP{?KmVjU%>8roRQc%4G`D;T%4 zT#3&=8qwZaT1w!A>VhM+6aRQ2Rz*Hn2~q29goR0~edWwIj}JRz1+)#8Z`-|T8qY5` zaL5Ows4&{lAn|@p26fUuD#XPu#ri3jMked&A{Hag4y38=(epBDQPOUuM3TNQJ~{pJ zMQZ;TExPmJq7Ls3l~PaCnW(s3y(nvOL+_$m~3dFkATq%JGxIP(M}6)NA}M zrb{zaRl)JsCa6;*?w+bfCP`GPz5~D=nY*IEY0PqazJ)1UBb`qkGl8cUhL*)Ozcfa2 zGum4Mjq*6?b4A!DmR#wfG-zL8B$*wPo_qkfA8TSYR^v(J2cq8!%GGMn^ z&i{q<3@0iljpj(}e-Nny9oPYo^*N?GIy!#okLL?pM|@~QeN=09wLp@C{%A`}^*cHY zhu+pq`idXi>wUKolIENVjMJ=0A`bh(L4kpUR9NCCFwY`rTa$n~;{EaPYxZ#|#c*x~ zkc)1=V^gR7uj&I93EY7tm(I>_R6QEpfmHuY(ALZe_gSnG%yrT-r2ki7vf$7!EN}LX;a8X zSt|dVt^KBnpg~_Pt0b@DdU7FIgx;&5w680(b#q+~=ya#{?0azC#Kwjrt&8(W?wp)l zKdbSpP{jBJpSlip-UwbCK2(pe96|NyBo(p!UlFJjhhh?s=Z?59_c-&3#HbpIJwCb` zL`6ll+32#jx!nC3{Kyp9Kt)accZZOBds)2fVm`u4?mcoA@=VpYQGxf(pJB(pyH5aG zXAMjpwug5qq%s%yJs>w9dvOuygI;=pNFm9m!323uwHyw5D~*kEYONtD98kDWD(*HO zHiOoembheOA#m?qZ@=1yhI(AiY%V~R9O1;QoUhe+C>qp^p^4=aeoJOXrBZ#jZ7(Y3 zo_?d&c@v;jdrO#PS+gd}yyY7UXF*d7jUxNvScS_|L=u#_k|crnB_})cWPqLtIKW!q zk&6S76?;Q87+%i;{3|tU&wdpZe(0xUGJ%I^&}|@LgWCJ=ss&@_d`OaG zdo)}DtlU`j6$&>%tpVJ(-ik=!jUW~Zqhf?5zTG>I3c=F~%FfUlGB03?t#ubF=4F7} zAUcmmp;gu4aI$(`K@rjEJ7JVpGJ|M0$qY>GP2Z@$okt~Y>4GUfmU@$v&*9FLqzzH| z!z28?BBnz491bTfg|Ej}o*W>S&G6`If2aDjXxnVov+t^T!e9;ls9>v96oS7#WnjlR zBvyqcTVlsz3Ix7g>P)YQR9SEy(IM!XuR>9=;tLw}dRXG!c_%DQ1HiI&B9CX0iZ#!t zSZ~Ff9tsVlk2S{ogrY^eP2mh5M9^P+g|c`SqrWVsCcfvik+v63Lj;N3W-Mih)y7KUc@aO0OdYbO|1Og$ z^WqZKaVw4+cpJZ`RaiwUXs67S9ai?TJ%Ft%Z+-KYjPwWo-Aj)Gp9QeSnWbL##Vi8I zo(yil#F9!|vFY8s8k?aKh*j_EPw_hJLFk8{mZKXYtP@O?yLq4(^e+k&YW~$W^P~}O zn#8QHXc|PKzmt)U(D%zT_|tIQ+NIJ?ZFo}5)fbxvhaB!aQOoADVX|wo0Mq;5y9AN8 z*10KAc@3jwOJsxd0Cv$)L zP8M4|SE~f&KZREzk{lihjXxxk+CPj1u7?6-pI5_-L=_s(fUbTh{^TnTZwYK{TqLfr z4sd^?pG!$evt|hWg%m_#qd_U_-O$hq7&dUzzf&3$3$j|QwYiB8H+z1(b(6c0largc z=p0Ye>HJG(%yrUyI~kQK_5oFhysbYD zEJR6=Yndc=oaVRPFuvK;#@JA;8-@y0r~uQTnS-ySi~6$Fe^kSS1KjqbZ)WY%9}U)M zIL?c@Cv^KrryogvFCPJa6Nv-FJkl$5u;Dn6*X#VrIeBfB{~$8>miwI-^@Suqc6h|p z#Mxp*4>};MY7yU;PW%Jxu-4)G=_Tj<58)A`R3m{tAdRXb>`RQYacV)a2ud*7rw7=7 z;T$k?#ZeURDrjvZ+mJ%P+B_^7J-q4Wfr?f9dJJGq%E`Kx)4mKe{^tb%CsH5mjXu;$ zI1It;Zb6($yE0Q;5;|=Dm!Fvd`!*W#i-bo+l=4p^c@X-Tv|+YS-esV{Zs2wnfmA?q3UaQ`4w48B4!StqfEEwK*P)obanGg@nvJd;I4eT(4TTD6u4K*p@M12#h& zA{P^_SNmpMDM}uZoSd8oak8)d&Q_Av3lp8BV)QBD5sG|Zd#ayz_q>a>_iW~P&!4>I&aFTaEQRve$FN>ke zfpm0#7Fds~GgZ*VenoHs`P`JA+l+ZvD7Bm;eRw5#BMXW(?P3j=8Pt;)M6l)ADRa>L za|?Zef{C3+6YD58!$GEKCZX&Hu33n06Vtjtvyjl_qGRNMrq46>5dTnOUX3~+2w!$; zrts5LBO**mo}Oi=N+U*)nb}=7@Xxs^C&#^fnzTuOz|;GFPDXlP|8G6|NRk<=p?(H% zm*GeSObnEchIq@#@$niLmUz@3*89dGnH5lIVa?L^Z3v)9F`g1Bc4HkWPBP)nc{{o+ z{5XH=%_4MvrQSnH(gXk5;OOf2AZ8g3Xry0~Zw6h2G(W6o{Xe44GOVh0>%!7qQqrY} zba!`mx5B28&P^jFEiK*M-QC?C(%qfk@_o-a-!Crs16*rAb3Jp;G46p*5zMbh#%$~- zsyg&B3(_t!y5IlI(y$)-(qt;?vjAMK)`Q15b3v4p7J6|k4VczETD zi1}mQbF&5fPuu+HdYGvo6??Ot74k#=ks#sh@Rw*@W3{QgGe_FSLz(iD^CyL<;B#q| zDM==pVoA%sAzEA~J32Mu?JXe|tv}*6&&g*qx){MxZkU)Tus! z5gQaIwnyMj{h^iF7D<5?vR2)z&^`zw?r4=6EN-+Rg+?kV@*Y!bHoWDOD}peT$Q?W}l;jTmVF%jaGZEz6(YxOUpTe#5y@2D6jp*7@9QKx zQHoA3B8sX@7-w&nFMQAMt^UZ+O?2$(q)c6kK$x9AO~)uF-&iA_v0r=m4$WRK?xmcD z2wgbALSx5(>S$7a%WE@@hq(ZTizSRGllUVF2AdvU8lJ@XC}2L#1WAaRNBz7ml3S8m zMV-OPkuv3YXl1H9I5_A!c!vr-h5koX95&(q6*h;FJ|CmF$!q=gX`VQu>^7*ZdM0pX z@|jFuQlqO5f5G;sL^-rQ>=Hy!M}&fV!Pw`%)eWV<#7e{(`(M0320LVxjgY~X+4J3kQ6xgZT1pDxB(CI5>r$>3 zNp#Lfyq@kyt7(s;l|~j%z+3!dgUI%|FOjGd6TKz7EU+@ks|8U^Ujue$%X+!ad@y6v zP+^Cin))Yw>$UQz7U4(ojbcerd`An3e-;UxKrM5#m&f@*0-noPAh8}h2Lx7FFaE8L zb^XTa!5t!>Wk8=fITQa%PagqWU9F+aS=$qRI3d@sj4)M=ZVwjnpl(>?4;#!pyObJb zy5@1;X9|?m*DqiYyLvBh^G&7UzrfC4zz$+D%u;QMY_j+ShxDp;F z(|fJTiKkTaqB)Vka-H6n9-qw*3W?|LqCkTJKM~#DQ6{r(CB(AtFX6BAJ8nw{SZEVlvPEFN^wUU61Q$AMy4>Ai+&tDre0#5i6IY3^ zKwpd($C6a=ONt)*I8-M-E?@1>JhgO`D`Zm-pd1}!DmkRs4P8`d;NLy%{%G-fUvJsj zlR-@>4EpuuQ?hg-*7iEPdI1ZDYUqLn=NpN7&*rV*!$7?pGR?E2A@i(|P{Gi;Q!sC2 zRhObH%cb!q+RV?W{P+u}Q0@m&!8=YNL24r>Dwh$kgZsLAw6M^?s?TFoo7Ku)OX<^K zY+u`|Zjg)BkA^dS3|~LNA2n;TiGI>C-p%nPs;YhCf~acDWFs^)jhX>%#I*(j&^=*M z&z(~YwuT0;i3gGM<-gxd%JgyXr#3ELYn;C_y|Cv8mnB;8nb|qcmU4q9e|&zB=vsb6 zW1?DlY|ehpf3bV*BVJRy+JDg~ z3{^)ks^MnEw$W-lY25wHvT?RG)hkT|3NI`l%TFF-f~sk>lA@e?0yt3uFZP>S->uPPZ**<27EyRiVS?x0FUX=_iBnA=X;n_;1#U!^QVr!xW+tiJI3> zoh!egU~e-Xw}+%3h&R^$hZ>oNgWxOt1|V~ODCp6$vCUF9hQ$W^yQ`5Ei^8@`ni_sY zLq=xZK8F$xS?l}|QEOUdz22tR?6GnLkUuQe35@z@UD2TlqC9hIEz|@qn?}-;v@ml) zz~Ybu(dOe-g*lmeN<0Fc8+(+=7GDhiq`tLP58(uK!T@G$k z0+Et;U_rF3URy)!j?puYu%AJbZ%m}^t zE^{D_g1t|5zdJ{z_DGrT3n~det#gLGBlF2|^*ALJ_ed&_hANNut4CKQ0H&*!AAP4K zU35ks+yjHFyTK|zIBGp8-EfOSz`ihwOF~jk1c!&?NxxM3U*niAg%3YMkIcxyS9-ak z`a_4ISET+!X4vj~Bv0}_(fbryk#t`l%os|!_b<$kllkdh+EMA(4uj%LQ1;ZwFOMC* zPAk zyN^3oDn)qmXI7CAsBbI_BM`IYr(rUo&K z?;SsYTph5yL2vTV8RDv44jJKJO`x?^>E**Aa;ZhgZ2L$7N{j+S>pfOX5Y9w=dz~Gr zzsKl2F{vwKC6uo=L(2v)zV`#@`Ys|BpFO$-M;*7@V=>F7Eqm5-E(W*wkoWQ2Q~NDB zB}JH_?HSg3tx67Qqr$7(M7zNZL67T|nUX<{b=zAd;dX|G?yb*nL%A0^Qsb}k(4Ee44$Vu@AeGutt4%1k3F;`x^9pC4BjcpQ|)yM zk$fs~{Bi5fgaB*&*~I{rePmB8T0C_(RgWZHM9Yk(vC@EkUdP_6mOD`ITw~x_hMVLM))@PPwW8FhHD0wh2TwZL!y$YBazL??yi0U(}Ro1YMQYo10 zp|io7JyE6|=4e1}WtNfRKuMG77;%~349k(9L=yvz>e|z>$Jy~C7RplQ-eo1+&x4PO zxg$pK7yd7FVbZA@qh3-ltgs{wX4N&j(Sy>6k%gR~`2MkokPwg}*VJaucEQfO^-Cj8;Ue@LUi5l2klbEZP~A0+;uV0!m9ZHapZD>;Afm5=CnjA zsc2IDQ**m}+W7iuP2FZ1^F#y{NQLR#CAJ@DESP5t#OFS@hrQQMZ>e)bCFCR}MEmFq zzxP=oO%{#+KEqo1M(;l|X#8M7KyqjfIJ3yft0~?`mq4CDilh9%FZ_s$i)+fNlbv%k znGN?>`YhatYJqCjkEy^bBoj|tsPa&4GCDOC`GLt#SMRMzt(bL|(il1f;UyuvaqZbd zpL1d{ODxn3X!)BcEHwV}+X%@>pGtaqME?Yzj6i&72Q1JcA|RZ(vQ&qDUJ2{sGrO>Z z2?IL4rdWFix~s`?fj3?uC!CjBC6Nv!DRM}JFSI2lWo!C)r0V&)9+0BE6;sQrdPW>(bJkL*p!z0%}@mD z5)!ZbOxvuk1z2jZ0^f~lsx;ud3713*cq-FtZW=*?`PllNR&}GiVG}XoA?h7ORR-2N z;1duzP$U0W2S|RWiQHvcrxK3?CEZI`63%8GQy*<4GGNB8l?liI$s3 z;DQc3P-jT#%EFz_n=(ivbjMG8a&z(qjp^$XKaY%6hS>?46b;{xfc{W-N{MBpsO4U2 zaTPF?6r>O>{kxI%DVM055VO|BpBpxD?*k~(Pmz@kTa(mLikwJyQ$dcY1UuDqr5jx zl%^!m_)X_Ew3b;S+x?Skjr4_au|Lk&7Hgsr1v6-9kcK*ix`Do6u|rVt(gKGvn5K=c zi>~K`&}C)RH^S1?gQFkcerZU)^M({7kYRC1Do~YI%d@w?x}z)~K)*DBjE2K>0d%ra z_C*Y;28y0{Oyz{5+Xdt-ak#OH2O)&&l-y*JvIV{2>-7M@NmH*-ys|KhG*HcRsLnmlClezpnxxbuFC`pZ6O^Bp=O71TNO7e@m)@$l)Sqo-saUBa(8jFvIr!{WALJ4l zg+eEGc=LB?V;(d;M}0?hs%(2uw}1hs;$#`z4EMX<|BiX0XB(2 zYAlY2hX+2EFKiL2YhOhHls~hQi0s*i)xWxcd;fs~ak=z$Gh*;TMn|p&X;(F1rqgsk z$W4Gx{GSKEPs|VizWRwmn|>{5JyYl-V@t{PHx{V7HaB>wh@~K5I3N6X%q)tK5z=u1~i%&SOM38UMmG;_uW9-Ed>a;*nf-V{tL@8 zrG->=Y9mef1(BLz+5rcXxK&^!{1E9>% zpUA^H^}S!5@BuQy+~-CM^gb)*0gOKD#B^Y9bY+E54%pF4>XbHVlbun8NZQ_B!D8f7 z=t?}m#-rmPu!GuJ{B)XrN`g$aG@M$I!ZnIZ=zms4H89#r7vdZFMob}x)U!bI@ zm{@PDQYj;Jl>&=?(3B2rmzSS5ja`>B` z+HB9>Vs`wVn2`2`NfpXWa0ZsDmOfdmMS;(YCzlj9iNCMpW~a1}WTCl` zX2sT^D2a>n28^532Y60dNP9Fx7(&Y41{U9fGD>)M-8u=%8*=@4n%tLG2y_66B;r;`$?s@3wcM3GL!RDY-U3$sV2nd z0`bLCw404|u-vjS%S@d)dd0*gQ7ql(JE9czpkj=Dw>AbR;$x9!^(3=Za-$d_#Fj^j zid#wI)w=TxMUtrm$S!m&rKM_oxnXo0X+u!zoa{*Fo%NuYpJR@KH}^@sVONi-MtwPE z$Usnt(kZG}3Y6yNS(-!gv>9b>DQ}{TH?xwNr81eX2TUBL&M=GG1jTT~L?pQCpc;Xw zB>2-a%Q&JPa@iRD@ds%yeKw+q)7arvdL}s*csPusF8QylmNB4?$UrMjb-^zWCXj8U zMIJ3}l#n5C0*re-LFZ1-VD6M3@CJuCmMgyM-Yncz!g2MZo-K6>SO;;xuMdb$L|TXD znwD0kw_B9`@S~N6X{iCH@f>rFGvDKtg~5NW6o-L=$?VotpFW8h|NQwg3t&)mf}p{s zY(0H*vdqV;>By34880hq<|fCVT1>&{(>mYe_grQ>Il;2U7t!4EnUB?|cFBGt+0M zNjxR7Kax?=(PT@&dNdk#HG<#saiY^7P7E*j7Ga8DKf0VqIv(@+CS{P)HQY3NP z#(3O{6o5x`VWj$`>-r}kFlAu_nJ%QsHUDTL(|=mV=jvv6G`W^_zdMXdb7K_|b+baR z*;z?h`PWwop;G4B?0<-EV}j5bBT!u^gmHh~@dAWqaUlq3!fPVZF?_NOR_R>!0Kw5e zfcZQN@Uz5h)SLsJk*QFIHZ!VwxRmnA^ln=e#XSem{?+wRmGaJ@7C-0rqy7w1{V(sM zS$bx;{;7F}LhnA3heZn30i2Rj#Yv%zj6i&^1n=hyiA+&wP- zBq`H`Wbs2nGZ!qy6)${0GJndA;bKuh*P*^dN{Tfidv=9>s4h|{P{c+LPz8&(+V zE4oF1#CFYiX|sMWL?`Iu>sEC*QOM|`PSDj)!#n`GX`@TV;NQ`DFqQ{h1Z+Dpe=-e@ z93E+cCN9z4?mHB`9q~tyOPlRsU%ny@iNj7V_$g(CE%r$m0g+mgfAZ@yLakg`TRJ&( zO*`Y4!GMz_d17HhR=5@9=K8^)*CYpbDFHveyJ5#HU#1d21%YTl2-L35P7QDc8Nq`r&sP7c@PWE;p}{ zQd<2-2 zoxy6F%bMHuio+QwG4lx2WmPYas@(=tS ze&BPk^H0gl3a^*P$*usTUjCF$^zdoykOHQ1xbZ8%^;L=yJi%{>+|Q-q&5<<;$O8W2 zn*k|0E+pL|nIVv(a1Ds^CIMHQf~)t%wIiPiOef|Uw&&Art_(x1Gman$Ku_EHKl2B**)HULKb zHdPh`tJ|fqby(PyZATi1O&V!*mbX94bzv18iANM5H-THKHjN~GKUkSxd`l`g@cQy3 z#vEms>HKGeF;52|D#dS?RFAzc5*~|1i2mR}2wy_h|0D59aMgZHh(__`zj{Y($a~KK z3+g@@QoC;}e=OwHaeQ8poPj@h9-rkI@MB*Cw9w!O{%afYKF6w+z7^qKv=`=Ju6+td z1M?n6n>LRJd%7=uhGmag0H0J$Ci2ctf&bx$?x==H?mjU0&na(z)!r5pKw^I1*YmIF zvE#t63bKHJ4eD)&)B`S=o`(zx^qjIR=PQ|ijLyE{BFHfAAu|#k z{>N)?5Kl!9veN8A8I@R(YD&+0HLhf8FGZ3DX{FZ_$WIRKoeyPbit5vIuH^kxXWsG( zgS5%7Y(VKjkTDiy1On}>sBighi22Ihlfd&6zw&P2tig+4`K`0`m6%GWK5r{_Eq%K8Yvv~PLJ;ywP-SOD z#pN91MfTD(5JwFNwq2f0{C-~QVazP?B1gO}QtZc%@G;ae+!U3s7`E;XeRYYi0EZ{V zx2Ox^Nm#;TikE$49ZIDff!`&e%Zf9=;u`%%UzF8D1afo*o0lrMe_K6t(w_Xnjewj1 zNF35{cNf$;CINC7+PAI{NXy<|c(`?$0;i`!q|6Hx=$X0>jX4}23U}I*DHrDb>5p)P z4CIbQ&Bu{*6trHb)bnYfgeR-?v{Xlm_@+D>uYyslD0_}gzKtE2k;1O>R#0YPW5vJ9 zj^N6zI@b8uKQz~TFG=%P5TRq92o=1K4qTsr!ecZ3Oz^r`(QmXR@9^y2%M2o}`U&km_$eV+a&`c2&xVtYhlSIq{k#il zlLdTh6`rz98=39UA3>Cz{Jkkey;S?tFP{ZRz(q3w42eq8+$0`m?fzT61R!1OeK4`T zz<+9h0XDNp09n^H%Q!DZmfjJ|M(Uq~{B)c%Y+L#?09*EYEwvuRay?V1aU1A-|K%|K&Gro(*exC8`g9FC=b?VM|$qae;~Y`^^v!dr&Xk@!Kr9X?NuYrs>}>}CwHbQ%+D{A)1Jr(d+?e@-Zvkk2 zG6!@_OwoUXb0*P*&2g>*@~0SKON#O7f_aq@aJIf^7%>(Uz5z?$B~ajx9}_^1PN}C$ zjsH8`{iEwKFZjI4C@yUYr^2m&h0y%)gaT=zCPkY2BI?hO8lg^y2;YHDme z#n4_h<3VCQy~%?`kfHhUqzh>*ra9k3XY5E<3}iAyN0%4&t4sW4JMkygxNa9e_{IQ^ zcjsLp>_64lcN*Fkc*qs&;l25G-F@x#hUQNhFh-RRFJtmTlgJ9 zS=wV~BM&tdZ9DL$p?`cZZN@-}4q<~H(n29TKtbiRl2o#D+Fc|b!C%6=t^WdnFc7|1 zSc}$P-=O9#NDnzE=_RQAo&>Y*cyHWG@;hNq55+{fS~U4!yLCyy)wPgBt!T^YR_<~< z@5jimV9G^6w@|=Y{tK~+#(WAXzB6$0=*+v49k(JBQ1x=B`|M+IzaWlq_; z5-8g*&rDvos@!{E;jyu$kR=&tvjGxhlGz5~^yZZGqnRgl@!AY}z$sTfSBxetRM(6L zF{@hfh~#x%3Z@LdtfQTYgl2$v5*uXN^A>-hH}JBIyv|{;qzs6xuu#Qg0q4TpH?U-O zN6ryfM%meV;KlF*Js4$7iu&?X5PQDMd|p)HZ>wr64R$^|A(91#`)JB4lEYOU}+I_YQwb8m43q1ru1 zRo|u-iJV!MDp%8ZMdTwwYq=j&^m*=Zhu=b7Otgv8m=hOw>0k3ong6Gt1Q_lM6)zLZxO?IZ`zyqxeaB==}0= zMLu)EDlPtIiHfN2qG9i>4yJOyk$Lxp{f4)Dq!dPgh^`__4L8dm9o=Z#$1S}%&^s|2 zah(*yooqg9lQB0pC+Esa+)NS?RnZZ75qNv9cD_$>7@L&*&I$hsk?Kuy&yH88)%_+5 z0h7|q?V3l^u%87smxlJ#zeAN|=SOTTmT#|3`%4~nWI-nIweB7~iCRSTpL%A-3@ykW zNWm^yX3LL+f`aYoXB`0OZhze2wJvhIWO~1AoB?FSqUoqxFuzr-fzYbRV4v_iVhUI% zUi6NyOiWChFT+~=QC`=^b}dkTf}oy_j0hLrf_Ghihug&(<#qNW?8*_+|7i(Dp&7pi zPC=x^?b%KsJ)0PXeY5-rS4Fd<8D(~3WDw>uiA&DS(dU-`8#>fd@Endal;YhFCI4T) zY5WZz=+J_jZkyiY)m8gKN+SbE zZ|SX1@1nA4-#A}aR`t)!6NK?IKSD>XK|?^~(!7*s0DNP3YIZC!TKED|obB>p_~4p$ zaz8AkpMF0mGh^N%9PCV$-8H{mff=e7b)6X!hSzq6?q-cl^IKT1l19hIMxI*6F`WM- z@b8Tyah!U%%FNka!bR5arKJ<4$*lg-!bat~7hE>aCt@!Y9*6M0y*fHRaZA0+2i!&0 zXWj;v8LD~)srHv4&fRC<5ypeQH$AW~o1XEtUUmMIJJf42F4Wt)5#RBYXr0fKO~Yzk z-7QBvFSInjj)*?826@V9*XJ*!E^#lF&c6Lk#027OKQnqh%CnnX7er~9%^uF)wvs$A z(6=AIZ$FD`@!URpS*bA;GKFiBa63ONP@(|WKzKLYpgxUzb1!dtY;Kvl!`Z5^Ytaw= zC_@J8Ex*ps&jvYDaJ$^qp$t&c9Q$M7Rnm?}#DE%&T3cIw)6f7^Fjkc*8g$6O%j(kS ziPh3>0uGm&2OCHjwEuE` z0s5I%2Q8) zFQ91Paz&bj0mG!DJd3B9dHjWguX*Y=Npr=zV?1TZy?MJ6Ca(iBj(42)Dx892B}GL% z6GzPaBUWjCbJd)G#CLFJRkPNkhqgCJSX+J7sybn2iGYUSI2`*%eFM+FjQ4AishPBw z{pcm;nUD&*F$TJ53`ud1_uJ5^<9?0uQ}-3k)?yCU^~C{H|L+I~7f>8ri|*C^`|+6= z^J%_Bd#WN~|2}IhQO7LPaOL>) z-#2f>`r6v2k!@Na(-Rg-?T-hR$!`P?gGQm&a-PMb*VYT>vc7Wk<7|u9YFu6k7|ylj z4i}H!SBRu7$A83b3C5jsk(CCei*5E?p4XqcYE$_>TBeb&8^C;2`X~BxibhdM34?gE z4Y~}~Y z(y1y7(%dy_1)dYuWL9%!%}C}IswlBmredlNkt3PoPR(#XdA^&OD8A2!t;#}#i2M&z z32nwKCL{2}MHr>-0&ReHstf!gF^#3lx)O?<9rQe;o?(d3mNnJw4dZ-pf3zEgud?cS zxBBP9kxE=koG+?uUf}UEn0Hdu^#~oOv4r}LwU6e$84Fn zIikLty5niX?r%%sKEBj-)u1sp#HQ6bvG4_~Yw*yQ{2p%-r+PWWzPZrqy+{ z2EcY=wO9rE>UC0n+nO&HK9AK?jO@d$K*OkY8?p!s*2ca1n?2brM|!9!M8v8KK+MQC z#OIm*hSc4kM)-Yoq@Q*YsmeOjhiRt@Ru7M!jqa+Q*SCa$86+V4Se#wncaV~0X=82h zt-_+{rVzsM8+)iKQKIN@@kP^XR#wEPnMpB)&@u_ru@v+2wnvKwbyZ5ORGV3I*njfs zGr$n3rj8^^5G8LfXWk-v@pg7H010YkJo?PX%~D51Cvbqrn?p?}h++V+Q=6TA7o6l*k z-v;;#Kr>v^!1Z4QT}c5V2@L}JQB<&#Jwew#sr6ReRHDbIUwwf|f&>(bLw`E?NGZQE z2FRG%lU(XoO_ub*C#R{<{21-M;_1CF3*F+?)Q@w zEr*Tw1h|1d!*bNR0-OGyiTCc%(<|pa!ML=##w1TYraiILK}qRcU3{qrKWI_v#~<~yhFE!&CD z-;&kYm()4tzVrIJ00q7S{rv>jk>7Z_<@)0oh%9RVz%;Fv#NY<$DV;^W4r2%OM?coj z-Epnul!L>)?pUL1P2tvIT#AJAd-ZssBi&`W_e=lle8T7@dvku8eHPKnD@6>V{JL8| zqgP0J^WKQ(^zE|C*}1;8SeoZ)`ya0Hf#|K0nv#zPmr&nw45|yMqJpPfAcsC~N2A57 zC9ZG989PpU70l*4JS?Z@RnyG%R<9o{GE3xef^fo}K&Id70 zd+QSZ5fVjft7M1f`=Ysbyu7>c%$AA*s{Li;B4u;dZ3-68w@lZ?dDCsHEt+h*oPW6O zuXbklG>M7h;j55aPSoVz@zo0Xv@URD;4u#U^xBQoZ3eUIapdb_WhGSyC!M<%)c@>Y zJGv#awHS>Rb~lY#Uq9{|2#_5yr5%pXiH45j_cZ!6?8b|Wt?RvU7v|TS$q^P^0yPWDII{f7O_mbu(D*&F@vovd*wM~@mW z&%j?dutiqywdH-KxNqI5%8|tZG$Qz!C3DE-{1IH9nuU#Wj1Xd019>jr0gK=LBg~gy7)mRtFXb(0Y3nr zRsy>uvXnQ+(}$Hkeq4Ne8cy?!*nN&z{KZeNby9Vn-mh2bTiN*v>ED&c?JuJBVBbR( zUxQ05NnH~bIoyhU$k;rl-8977`*CPBH&7VzzB4mW{PS96$C+pp_od-}qe@hpr{s?G zyo^al?yMMsO)1%5vc5eAX19_=pQ%KOAkF@HLIq(3O#&HKqC>G*AX&*e0sMr-Rkb^U zTVR;1S{--+z>e?5_j*Lo_*fk|Cr^YCFr7}PxMYPysfUX4tz7|VaXKTe|3BBsLg?$( z;*Qx!@8_+&Gh?UCj18q1Cl|Vmi0qjQA3$ExD4Pm%@SG1eE?i2>Sqf|;ERU#}S&ZY> zn{eY$n{1t?!Ymov)2m)}){~!i7$U~PcB0QgWvI)c+LyfJQFAoVe{Bllk9w{%_D;lw zfQD`FfI{Q7DsNlE6U=Ey4U?rlW7-f^rcZcb`0YTtmzfimR^XDWP>HemT_jmwb!HN6>MvG>FBNe z4Suop+JqOi9_nbClcB6oh>LD(=A>=YVIDD%WNJu?00c|EI-lkXd~a{LeLN?4wYd{8 zR(LgyS987PT_v%)MAg8h(>~s78ava5+4h?D|CTSe{Oo{}+W+eMr1#YY_-<{C`zkE9 z*{cVPR;y$4B%re|RFh!vpn|5%z1DZ{c5za_x7?oYN=?hr&GI?Cbid7^DVD~ts{&_$ zdTFB4NF%t!?|WL~Bb!UZp?t&b+>JFnmJSK)TrK~ajgIfAb0^ozcSWjY#l;T_F?Cu= z*5D1;$0h86i!IFjKr7M7I%=As{4VJuc3CpizNQp*uEX&0OS7Zraz~qq|m2G}2$8 z%+PXp(T~tE4P&Kv{H_)u;j}C0EmvK?P=G5P_MRx3yo~AMEDN*epC|+Zkc!8~4V&{q zEyE(s@S(76w5}s^5rNLhkheP;m6z@{o?7%MQ`)H6I70I6z-6O<|044EN31xQwA#Iz z3i;+p8%o2 zxnbXMA51qe+sZ><)(dVmyb(V<4;kz&_P=t@A3m>(s7hZ}9Us3?vlmhP?xXpe>)bJi zRM2^{C-COh3``eAY!$HvvV&qQa%#Ty{sex{?kto7=$)d-yxCfrPUa)lbG8-xB(H^| zww4winmTYE@Sy;e$O9R?C`#}zY#6TGy~${vsj|V4*u@R>J?VsV0*5uR_Erk`dlT5oK)+v4_X}0TJQSy76GBo*52Ix zzz^SkUR%xZ+3YI7Ukn$s@2Q|4H>uG6l9jdYco?4YPyX)&3k1kvf-TzbtCL)w!(x(Y znmI6Ta^TcBAj}Ob;tm>3<>7!vEK~^qN)ltr5l{ysI2^638#|KItd-pNlx>T~N+)ae ztCnUtbx<<0vjmCtNb;yHd|vC@U+C5{{mYD;Ue|wRUA>Y85mqV9QNqkQ&ntS!9GdF? ztr!JJ`})663&rlRR=l^s_iiR{F4~sQI#a{bh{cm@aHQ%j#H1+c7nNBfEgA zT4|^mKdt+>CW57Ng@LS{vx;v{}P7A{%UggiBYK zVBj_iB%6n$3+7mcudEP0t(cBgPRqX-*5G|HaC)hD^8zp5yn*Eg_;Yr!IdfoVid;^U zZ36D_1=i-hPZ+$v1(7&QKI0h={R~=wX4|#CAkBgm;J+$XUtV#FGk?=jt)45=`CT$O zFCqjeE(4o7@bXiQ*PE{i;?vg`DTNoWcSk&nuU59oxzi85W>I;pY}y}t6|Bnn)@!xi zul6^+j0r4z8@LW8jMhYYZhH$?SQo)y|9HwCX1GDsl(@fHQhw^KZLhQevv;nqUrX5F zDxb}>#vBWyZOrmXBSPv>XM_oTdE<46_4E7n3hJj-@#b2*Xh-%w6KJb*#7t~YhkoAQ zzyBy8SlD+rU03;Ah(3cf<4AtBlmBh6UgTW1h9}|0DEeiNW#*WvZ2-|T?Gv%?dDpKc z*9s}t^*7gdO7qCv)8e~s?*^!vA1`_*t!~d(oSY}dO_sl=!GK!e@V>a3ipf=vYAa&; znO42LDDfmLcRR3;J-#o`K!d$a)wD9=MVeq9U&!9vb8Y@}fPEXZM?=RD|5Zg|dl|{# zpzW@8&1xCa5@<5mvOw}p2_qp)Xc!R>yD=j7 zK~9Vn5DWJcN9v)-iKasIh6*aI&U$BPjMl|{p&5u-|3Q2+OOWSYC#yy&pJHb4a;UKt z(|i}aMj==uJFtbpdQvyq2{Pg1^w zIB1J8dc(-g5I!KOI4C+D?Vy9N>s^?>u78=ehxJ0k>x0Y>Ox+^IKXN=VcjXj)$cv zaP7pR6DBkq$D`8dh+&!4<_=rDeo@K0HerhYdm_;#$uh1=#=ab4>m;GZJ&-=iR7#rd z=WY4|^`nlLOkZI)I$Mss)9a$H-d?JUzL{WwAyr)2eE#7% znT1d3fradv-lT&h41&bo$>!!J@v6YScK)eR0U6j)?z0G}Tg~&|UM3A;f329?P1%GD zB?i_IS@Aon<~*f(s@2fLB;|3xS$%Ikbd*Yh%$5~t8ar?& z(Y#a1e%c;-a}N`Khi-F{>lR9-gkH^2QpeqNE?{#`1G+ez9i z=Vf6_VWE1wbz{7@sHC=(4Z1D@k8j9iWMMJlIt(RSJh#6458a~puGrs)_CXsG72CJ~u+v^lcj>2F^?F{}nZ-Ug>#-dk5j=Y&8j)Naiy)%A zpZz&I;2x$t0~({BdJeN_C;a1qH3Lu~jtnI;%g<)b@>~zVLh+0e>7UGXN%Vp9fmd{) z3<8Eh>7t9lT@WFp9!zY~Zl0;e5*P8i%1=A@dg2Qt0?eye!85f~&4W@LZ6YSGF`jfsMBz zpxc1-G4~0(NXPE)c4-}!Bo&0=S9>zj-e6FV>=vG;>%7a7N zX!;L*o>wRH3UmtWTssX+0gJceSI+fG#0xPchuLM|#n+47z^#YSnEb^(zC?4&p_}S> zx834;_QK5;m&j^^lopYxlYQ3QQHZ|52nXAsU^`?jhn_?#QRn;<~;_A%)N?de3#JdV1IKAK}cZ zH;xZ$Bl+X$kfZdM<5I1rM2Av?R~fY=Pwmy?_mxs3IkPdKB)Gqi^cWH;zO3?hQ(grD zOIZmbM##l%{8_b|4MaBa^vXSd(^=M6{5+)5_Dw_2NzJv~ z@Dq&I-R?79x$QfYnwq-Bl!sK`%}-)(?B==;@0PgPfio27*U<%9gR-|aT8K-{kElFe z$Q#FdG!k&4%Q+T)MAhgg7@El#V|FYprfo$eRTI|&c`F8?Cl5zWkSw><9wqXD>xdji zn8?5-_@*>6Y1|+1s6iRe?D*7a$8eDFR4!|&54l-sN$sgvTL%t+J?rUkLs#g--Za;6foDwJUrS$?mL0=%lv z3uw^j`vku1-hnxm+3MrYIaiW(cgp2pPaW`^%y@LH(3e-;Ar^uiEXR) z0!#IU;o|r_?3M*N8T-o<3YJ^6asjW?uR6=B>2pp6RjI=?$LCT!%fI`$b(Azf)$#2{ za<3`OdY^XFqosOx)Kg+iKg+I;t`!y4EbsBA#~cCMt1ppS>x4cXul?Rr-_2!IQx?0H5lXpCHnn^8h$ip* z(zoB=DJSnOnq#@fmE4!Gk5zM=)aq60d97e2AK(Qv(d;}hJ*`hW*Svg=`(dR#L^>Nq zt|;2CkLQegN#6bU%JT-lZ{ooX#W-Wgp%?D#q$1|+&M0?~>hoL&Dj#;= z&nD&qlzCb2nEeK($fSt=Hk=!n6AxAidd>*mL(Ggbq3)qzz`(WD?AC?w*~$s(rz;5g z?{X3TI@zbJ9$PYdr0|gdbqA36AwY;O&8Ipqg;+lRv7K0y0E*Tx$ioyNZ#Y8Rj;NLP zGM-#{>a2ItJ5dXQ3ts@#A;QewTHhX<@#9>RheN*|T6GY$V@O7+jUYtVF*egD; zh^fpyG66n_A66ifQOK2zUjcv&+IR9gej>;xS=y@Rv9(@(Eqzl3hJwn3gxSR*{IiF) z+-@vcrdcS|+Z07(@RP?hZxod!ixM%2_~XS@Ox~iz9o`lMHXE5ts2{Z|q64#ayHxM( z8qu(@=aBucXeHw}m)pP*k!80EiK@#=Pnu&=H207pdE$)#f=sTYm@C4+M~sYnqFO3S;GU_3CU3mxm@Qr>kpXK+&PPVHE>XY{vmeM zy!{d*jPrZn^Z!_T3#cgjynk3}>6Y%4Qc}7*q*EHCyW2sfWC$gs8|fa9F6r(VLXqz7 zcrWzc-TT?S_y6p(zQ=PoI5S-Hi*Lv0%V!(&Zf*C)w#inV+3rlAu&E$Ruo4q=-9;_& zait1b@}&OAfyTGl1fNLshnz#qMUaa^Vgb*Rqa)r7&MsKrV;#0?eL+k4w3XC2*v~Q3 zJLD<$Y~D{(VSc2ZZc8|qS{*XD?|rjT^-3Msw|#LHbou^T`}q3PsVlKJ-{K<<>1mK! zSo_)!LkBJB789;W-hu(2a6qpdq*lYL|4S$Fz#TU#37@1AbMlL2L%UqFNUy>b#ijZl&F zX1GI>8BG;s6L4znXMM2ss5WxLZd>wPR4e^rum>x-DHn^P)k|>;4IIHNr38yf6`y8p zsoVjEvvB2|9)6PDf!@l7!DsI}G%@=QZh9)CQ@t!!yPX>Itv{M~;>GGJY4+DNx41J9 zo1PRae%H2TH%*kry>KG@XlP4)6jnsRKb0FBacHZeNA@s&3##;MQGli8O&#?;zn{;Q zqq*LQGBCtjypR1K8%J_wD>K?4D$L(%P~kVdLhd`PD!jKk(+fpRT?!i^>FnXZ^k|O0 z#dkqq=fm_r^{ByK34iWdhHZlwf+}*6Ud4-2BifGkU_9?~Id6jr*6N1{AYn999oyF)O&!pdX)g&Hai8bSg&^XZ4C|8!NNc$K~yAVtj>JJDPT# z-qC7qwu-Z9vQ`wt4f+u3sa}<w1qfM09i#cAD>Q{k|X+ zNZs4qBIyorrvQpbQ~oDiERp+H*2O`<%#MX)>0jhxq=&?SGVpZ?i@UmP+}&Ea1xwRrI9#&P%sUlm4giTbvVZ%iva zDQ#Q=Axv=$S^)$95Z`sc#voFxEkA@!w+1FFrqQZ2tY>nzX$7Q(jGgs&9&E%4S>sT^ zmx-}`>7d#6XBz$cNB%^&fALxh3^EO1e7}hMqH?kEs9|QZO9{k-94=?k6J{PHlIJ>E zOX~*S_xpL+Kc95N7?mFz?UX0nqx1NG2!omOqUVz0YL{wVT}&3hF(E)iOif*UuPOxu zIqv^CMes43mOynZTS2&A0!MYb}^~3`{*W=CKpGEjOEWQiTOp zWur^ilyx=R_<(MdGAc&IoZxYP^`x)AzpO1Vc|pDXk7GwA0DToIWJl=NET;sdT?`!i zxig_$uuIFf{L+O@i!ClOKy~7Bug9jM_>y65EY^8EjYu)75&m&Dpzn0)#MPHar|7tF z-n8kF=;UbzBW^XyNK|1JXtXEI-A6{=BC$FOWjB3>imew`NJnGr=ys+Fb7I zQ&z@a=yh8^2>3z+BYijVbA#cC&D7a1&vN2o312V>ET5&3N<0ABu|*}}ROYTumQjKg zi{s+!XKq8PZ=@>WVGYuoG8mh{<=UFQpY9h(p${|jXpzP3WFQw^fC0(2Sj5G}Vhz23 zo<8YlYSOzx0I;*4r27a1+%q{jY0pw@H#xcR{S0JDS(%S(S}h^621l(0yL$W7kw0|k41g8=DK>9*dF9dS1!`4gRZb0$|*s@HLh`+si zLkVQ!1P-f%i(r}vR506lzC`=Z^%lF!2w2A`UDO6?*Rp5UCj<;CRSWcDGMShav|`|N zz^?;GaMg=5hqT=BL1lVBdMf_5+j~MQdj~_76;t z9b#bW&{VafY)qx&9bcF!lZkQ@fm&IVcUuRytci-|_b^IMzI9UF2~kB^I+Bms)t=N1 zHN4Vq5guhMr$#5I^%I=E{AK&n8Yd2O8O2yzE`tZ#Ux916&n-vvopi-$K z1b;B$^CXZ8PScl6UxYJR$g(#Ujo{*hyj753(wvxfH|^^t8FP>}S})F5m+)Lc{-dK&Ye<-*|BwWWy#+kjBIEGRvTDQi$Gi_og(-ry8TJK>1!~Ac6N58iGmXYf$Beenvho| z{z2LgK&i-iS}oRl^VM}Ftv<=eWH9ZeC#kFhzJN?whrj0aFX52^h`s!96lM(8|9%T) zEbv4`dbX{jTnDM|Pax`>jeGIJ7M5b~h|XP7 z-z#`ZJ^&pfGh8JE8lK$X;N1+8tq_JHU)ONMg9aYu9h}r{dKVr_UH2}hXEIZM?26o1 zK%Ys{OWpvkO{5gwbyv5p;>qoN*0y(+;5oHf^no!l%>1MEWDUJ3Tz^=}hh=rmdCY6n z0FL-yNdG7isjEx=Mepp>y~}YyfYE16QiQnR6tCh8WTQ4Bb>Q< zn?Tf3&-9+B0O1!m$*osj*ICf;tXdc*i=s>e2APCtjj#k6iDLGNG`?>_$}yzNVi0`2w?XGjT)O9{-x%UNfSxp zF(`bgXHz&inNzB2O{594De8CqNtKDQKkHz&jPG!p83w8;(kjk%0JCa zvxvp7+1J6uY9=}fW)BFf5TntgjWCfpYpP~c_xeS3%ozYBBceke=~y1ejBs--`4D^)q+shvp=` zeFLZ8GUgO_MIAV)9e@pjgm5iw_R744117k*KTc#|qy(!@Ao~vtMCiz>lyp>B`U=KG zuv`VU7-0|7YGoPvY!E4kN|N3R-`}~JH)2~I0uyt0`E>&c^@XyBuEIalywN#wHY$}I z%?6QC%yY2ue{K!@mBBzT4U;h2up9Um82nl00WSXMFZ&ZS{mb3{#brKvOF_l(7q9;x z7HPDO{FWj!A_9Gk{4a?8ulDfoUJFVUL89vI?tXeh%LMnBR?V2?Z({OKeDUWi{(#sBjBhq&5|VcmD%w+|C(k0!=*hvhhtZR zM{#p?MQv&{e*c^6!T~A3qtK$zgmq#mRD}}$s;BwicJuG3gg_mju30mXSWhQffuO1B z@2!mj2{^J6d_e7hUy$tbk?;N9WJ|Mtv&QWU{C3}uK6NKF6DyUg^=b+>PO$a*3FAwB$?P4vK-cx;+z;} zzF7MI{@DSRA~L?*&&Rcv>)F!&mXJe|xF@_;F_p=TlG2gzhTmg}mT$PzG&m|Irx^_C zmX5nbdH|I0@0=YrlBfjHI?>Y@0)_02pUKJpL@E8X@*zmR-|0i~p1>egFnMx)ujYNx z;(xumrvd;^ph}F`Xa%YNs2}X|`Ri}}PxS@CCzymDc1*N>Mf1Ynk|ZMOJojP=4(B8& z@>dPffBQHQ}>#`M4c4JLct(t_JP z{)$nX0hu7ofUBwg0kz`i-`OFM$!U2E2$j$z*>B332=~dL|9*L>{vc0GtXAr@W7$*jAusb+CQzr1fhVS3mrT_aI2%kj+LKt+)lq;OxxbVza z|JK8TN&!bi4xc&ONxu>s&5-VtifXgh2Ij7Pd(vH^0^yrlvN5Y z2qJ&yHUUdj4={XlkO@@rGu6isPVLLx{_Fc3HiRK@p#&V3T_ZJ@E1L+W%9&77LL#77@x^X3UsE>HN!>~Q;8DZ) z_?yDzHL{s?JvQt+Y}gQlb?!=?|N10;>Vz_Qm;`+e49Pw^1boRKK)~VwtF{AZ?E%dG5?z*H3>LzG~UWwzRUV1mf?L<8#)<#XIdbYco)T zM`m3WMR^ocVeg$;m^do6+{!QkmMw$8?2wXHm(;Zak@4c%96Osr(+gvYsDuP#crRW} z)ntp>nRy{4QUs!HDj-!M52_2ID=e`)JklzJ)OgtTDH_ke5uu=NXYLx(%aQcbj7l@D zx*&u@1S|eIHhX`3M#M;FRS-zW9w%)*D9Uz@ds;~|^sgBJDw96*CMd47YgLazLb4vZx6K-}ED(IOv0;F)Nxrq!gQek;os;e5RTBPD1 z2T9Gq+Kx?=00I6?7*ew9+2L_(dCeje(&wln^JX=d+7!ZU(9Q_f^6NRA}_SPKOH^-VoJhPU2Iw4EuiCMrd{5uac4$@3YIgy-cRB(BK!_!%f4j)&=; zE-R{-wcbhs0BO`Pr=Ni4l0SioHB2Pm)#_hC(z~&q6D%y~6{6;7YOGPVUzE$^uqMP!_wpSvmMn1c+q+%N(MXcrs%#+Kw>r|2L%>huSlUhlP% zN;(AWpIsY}X&6W#qC;05Q8yt^URzGg>gw%?T6xb!ZII{n;0R!Hr-@99`Wel5{u(O8yGZ3;21;# zP&hqdtMgiI4ea|nBN-`Q=QU%rVd@$tAa+FPEFMAF-{x7^`d^`E!1k9=Jbeu}d+kxx zWSV))dpw`DM{%DGQr)=*2hnm?Doq;U zPk?9Zana>sE3Zjx!bzmy%nN7(<9{g)K)kyo1>%xIjMW1(+JcSDOC$fmmGW0@w zpc#L_r)4+o$fD170D|*5pc_5Wy)1S${-g~5)jy)w1e-9(*xH&pq!^gP?Tw>LzD!5L z-WTMX(rGv1MrsfB-!qjt#-3s8P7T{yKggH5zD)hZ*(7jGRJWlTe$P~wQt1V`t;9y9 z4lS$Aip~{k3v$~@Xz7!bwBJbcgHe4nAmD`u^^BYmMW;gqXjj4G#;+_e2{2)h4~O?G zW3T77_vbk%xWmB&RWO%m*;3PWtYZ!UK>d~&ccy5)xb1ToBvctt^{IQIgDpBV*XL`N zAd=>cDUh$w1hTuhGU{v1;6z>BcEK+Ey*vi`V4JIj#EPHcYmqaUli~r*#Zg-gMYqZ7 z+a~8T`D0t_AoI5^n?>OYNy^haL%mfyg~WpI>+a}m?6$5VZYtO-ndzDOq?Yk?jhSmK zF#F&AO~z)cP~gKOONxqnlXIbmbmlnuwP!wo#}s7WGw?BK72YYHaL^7GF0^(iEGK?- zGkVLrM#=9rG-lV_gQ(5SSL+&+}e@235}Vy zO$eDpOcQDeauMs`K+PO;K%9Z{Bt2+y_LOI;xT-S_-)1wIB6Ci=I(B(kN9k2KMdpI< zwD#W$4ytv5b3~QoqHT(V3D2}@us1N$*`cbx%y-Z+-*Ltu*-SPRm3%^2?(SpSQRvJmo2ruwAo`Qm+YGi zD(sCVli&<9u)Ht>xK|jt>f9kVZ+TSBNuqU26B&2eVO=|a2G;y1Z`Z-=PFhf^Hij

UQCz%#1 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 { - const { core } = useApmPluginContext(); - const isMultiSignalEnabled = core.uiSettings.get(apmEnableMultiSignal, false); +export function ServiceInventory() { + const { isEntityManagerEnabled, isEnablementPending } = useEntityManagerEnablementContext(); const { query: { serviceGroup }, } = useApmParams('/services'); - return isMultiSignalEnabled && isEmpty(serviceGroup) ? ( + if (isEnablementPending) { + return ( + } + title={ +

+ {i18n.translate('xpack.apm.loadingService', { + defaultMessage: 'Loading services', + })} +

+ } + /> + ); + } + + return isEntityManagerEnabled && isEmpty(serviceGroup) ? ( ) : ( ); -}; +} diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/apm_route_config.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/apm_route_config.tsx index 4fe5f5f583f1b..05d6b5f227e39 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/apm_route_config.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/apm_route_config.tsx @@ -101,6 +101,7 @@ const apmRoutes = { environmentFilter={false} showServiceGroupSaveButton={false} showServiceGroupsNav + showEnablementCallout selectedNavButton="serviceGroups" > diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/index.tsx index b331027a79d0f..02d73e7df75bc 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/app_root/index.tsx @@ -42,6 +42,7 @@ import { RedirectWithDefaultEnvironment } from './redirect_with_default_environm import { RedirectWithOffset } from './redirect_with_offset'; import { ScrollToTopOnPathChange } from './scroll_to_top_on_path_change'; import { UpdateExecutionContextOnRouteChange } from './update_execution_context_on_route_change'; +import { EntityManagerEnablementContextProvider } from '../../../context/entity_manager_context/entity_manager_context'; const storage = new Storage(localStorage); @@ -83,15 +84,17 @@ export function ApmAppRoot({ - - - - - - - - - + + + + + + + + + + + diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template.tsx index afe1de2490e07..36ab11d45851a 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/apm_main_template.tsx @@ -23,6 +23,7 @@ import { ServiceGroupsButtonGroup } from '../../app/service_groups/service_group import { ApmEnvironmentFilter } from '../../shared/environment_filter'; import { getNoDataConfig } from './no_data_config'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; +import { EntityEnablement } from '../../shared/entity_enablement'; // Paths that must skip the no data screen const bypassNoDataScreenPaths = ['/settings', '/diagnostics']; @@ -45,6 +46,7 @@ export function ApmMainTemplate({ environmentFilter = true, showServiceGroupSaveButton = false, showServiceGroupsNav = false, + showEnablementCallout = false, environmentFilterInTemplate = true, selectedNavButton, ...pageTemplateProps @@ -55,6 +57,7 @@ export function ApmMainTemplate({ environmentFilter?: boolean; showServiceGroupSaveButton?: boolean; showServiceGroupsNav?: boolean; + showEnablementCallout?: boolean; selectedNavButton?: 'serviceGroups' | 'allServices'; } & KibanaPageTemplateProps & Pick) { @@ -126,6 +129,7 @@ export function ApmMainTemplate({ const pageHeaderTitle = ( {pageHeader?.pageTitle ?? pageTitle} + @@ -152,10 +156,14 @@ export function ApmMainTemplate({ rightSideItems, ...pageHeader, pageTitle: pageHeaderTitle, - children: - showServiceGroupsNav && selectedNavButton ? ( - - ) : null, + children: ( + + {showEnablementCallout && selectedNavButton === 'allServices' && } + {showServiceGroupsNav && selectedNavButton && ( + + )} + + ), }} {...pageTemplateProps} > diff --git a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx index b34de178192d2..1f5074f6b0c78 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/routing/templates/service_group_template.tsx @@ -137,6 +137,7 @@ export function ServiceGroupTemplate({ environmentFilter={environmentFilter} showServiceGroupSaveButton={!isAllServices} showServiceGroupsNav={isAllServices} + showEnablementCallout selectedNavButton={isAllServices ? 'allServices' : 'serviceGroups'} {...pageTemplateProps} > diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/feedback_modal.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/feedback_modal.tsx new file mode 100644 index 0000000000000..e44dc8ae3a72b --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/feedback_modal.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useContext } from 'react'; +import { i18n } from '@kbn/i18n'; +import { + useEuiTheme, + EuiButtonEmpty, + EuiConfirmModal, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiPanel, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { getSurveyFeedbackURL } from '@kbn/observability-shared-plugin/public'; +import { KibanaEnvironmentContext } from '../../../context/kibana_environment_context/kibana_environment_context'; +import { getPathForFeedback } from '../../../utils/get_path_for_feedback'; + +export function FeedbackModal({ + isFeedbackModalVisible = false, + onClose, +}: { + isFeedbackModalVisible?: boolean; + onClose: () => void; +}) { + const kibanaEnvironment = useContext(KibanaEnvironmentContext); + const { kibanaVersion, isCloudEnv, isServerlessEnv } = kibanaEnvironment; + const sanitizedPath = getPathForFeedback(window.location.pathname); + const { euiTheme } = useEuiTheme(); + + return ( + <> + {isFeedbackModalVisible && ( + + {i18n.translate('xpack.apm.eemFeedback.button.openSurvey', { + defaultMessage: 'Tell us what you think!', + })} + + } + defaultFocusedButton="confirm" + > + + + + + + + +

+ {i18n.translate('xpack.apm.eemFeedback.title', { + defaultMessage: 'Let us know what you think!', + })} +

+
+
+
+
+ + + +

+ {i18n.translate('xpack.apm.feedbackModal.body.thanks', { + defaultMessage: + "Thank you for trying our new experience. We'll be continuing to improve on this so please come back often.", + })} +

+
+
+
+ )} + + ); +} diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx new file mode 100644 index 0000000000000..e305743243a4b --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/index.tsx @@ -0,0 +1,169 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React, { useState } from 'react'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { ERROR_USER_NOT_AUTHORIZED } from '@kbn/entityManager-plugin/public'; +import useToggle from 'react-use/lib/useToggle'; +import { + EuiButtonIcon, + EuiFlexGroup, + EuiFlexItem, + EuiLink, + EuiLoadingSpinner, + EuiPopover, + EuiPopoverFooter, + EuiSkeletonText, + EuiText, + EuiTextColor, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { TechnicalPreviewBadge } from '../technical_preview_badge'; +import { ApmPluginStartDeps } from '../../../plugin'; +import { useEntityManagerEnablementContext } from '../../../context/entity_manager_context/use_entity_manager_enablement_context'; +import { FeedbackModal } from './feedback_modal'; +import { UnauthorisedModal } from './unauthorized_modal'; + +export function EntityEnablement() { + const [isFeedbackModalVisible, setsIsFeedbackModalVisible] = useState(false); + const [isUnauthorizedModalVisible, setsIsUnauthorizedModalVisible] = useState(false); + + const { + services: { entityManager }, + } = useKibana(); + + const { isEntityManagerEnabled, isEnablementPending, refetch } = + useEntityManagerEnablementContext(); + + const [isPopoverOpen, togglePopover] = useToggle(false); + const [isLoading, setIsLoading] = useToggle(false); + + const handleRestoreView = async () => { + setIsLoading(true); + try { + const response = await entityManager.entityClient.disableManagedEntityDiscovery(); + if (response.success) { + setIsLoading(false); + setsIsFeedbackModalVisible(true); + } + } catch (error) { + setIsLoading(false); + setsIsFeedbackModalVisible(true); + console.error(error); + } + }; + + const handleEnableblement = async () => { + setIsLoading(true); + try { + const response = await entityManager.entityClient.enableManagedEntityDiscovery(); + if (response.success) { + setIsLoading(false); + refetch(); + } + + if (response.reason === ERROR_USER_NOT_AUTHORIZED) { + setIsLoading(false); + setsIsUnauthorizedModalVisible(true); + } + } catch (error) { + setIsLoading(false); + console.error(error); + } + }; + + const handdleOnCloseFeedback = () => { + setsIsFeedbackModalVisible(false); + refetch(); + }; + + return isEnablementPending ? ( + + + + ) : ( + + + {isLoading ? : } + + + + {isEntityManagerEnabled + ? i18n.translate('xpack.apm.eemEnablement.enabled.', { + defaultMessage: 'Viewing our new experience', + }) + : i18n.translate('xpack.apm.eemEnablement.tryItButton.', { + defaultMessage: 'Try our new experience!', + })} + + + + + } + isOpen={isPopoverOpen} + closePopover={togglePopover} + anchorPosition="downLeft" + > +
+ +

+ {i18n.translate('xpack.apm.entityEnablement.content', { + defaultMessage: + 'Our new experience combines both APM-instrumented services with services detected from logs in a single service inventory.', + })} +

+
+
+ + + + {i18n.translate('xpack.apm.entityEnablement.footer', { + defaultMessage: 'Learn more', + })} + + + +
+
+ {isEntityManagerEnabled && ( + + + {i18n.translate('xpack.apm.eemEnablement.restoveClassicView.', { + defaultMessage: 'Restore classic view', + })} + + + )} + + setsIsUnauthorizedModalVisible(false)} + /> +
+ ); +} diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/unauthorized_modal.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/unauthorized_modal.tsx new file mode 100644 index 0000000000000..f728790f8c50f --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/entity_enablement/unauthorized_modal.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiButton, + EuiConfirmModal, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiImage, + EuiPanel, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { useKibanaUrl } from '../../../hooks/use_kibana_url'; + +export function UnauthorisedModal({ + isUnauthorizedModalVisible = false, + onClose, +}: { + isUnauthorizedModalVisible?: boolean; + onClose: () => void; +}) { + const servicesInventory = useKibanaUrl('/plugins/apm/assets/services_inventory.png'); + + return ( + <> + {isUnauthorizedModalVisible && ( + + {i18n.translate('xpack.apm.unauthorised.button.openSurvey', { + defaultMessage: 'OK', + })} + + } + defaultFocusedButton="confirm" + > + + + + + + + +

+ {i18n.translate('xpack.apm.unauthorised.title', { + defaultMessage: 'This feature is turned off', + })} +

+
+
+
+
+ + + +

+ {i18n.translate('xpack.apm.unauthorised.body', { + defaultMessage: + 'To see services detected from logs and APM-instrumented services in our new service inventory, please ask an administrator to visit this page and try our new experience. ', + })} +

+
+
+ + + + +
+ )} + + ); +} diff --git a/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx b/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx new file mode 100644 index 0000000000000..9fd41de01d8fe --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/entity_manager_context.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React, { createContext } from 'react'; +import { ENTITY_FETCH_STATUS, useEntityManager } from '../../hooks/use_entity_manager'; + +export interface EntityManagerEnablementContextValue { + isEntityManagerEnabled: boolean; + entityManagerEnablementStatus: ENTITY_FETCH_STATUS; + isEnablementPending: boolean; + refetch: () => void; +} + +export const EntityManagerEnablementContext = createContext( + {} as EntityManagerEnablementContextValue +); + +export function EntityManagerEnablementContextProvider({ + children, +}: { + children: React.ReactChild; +}) { + const { isEnabled, status, refetch } = useEntityManager(); + + return ( + + {children} + + ); +} diff --git a/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/use_entity_manager_enablement_context.ts b/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/use_entity_manager_enablement_context.ts new file mode 100644 index 0000000000000..83942af2e7715 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/context/entity_manager_context/use_entity_manager_enablement_context.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useContext } from 'react'; +import { EntityManagerEnablementContext } from './entity_manager_context'; + +export function useEntityManagerEnablementContext() { + return useContext(EntityManagerEnablementContext); +} diff --git a/x-pack/plugins/observability_solution/apm/public/hooks/use_entity_manager.ts b/x-pack/plugins/observability_solution/apm/public/hooks/use_entity_manager.ts new file mode 100644 index 0000000000000..554d58fe4cf10 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/hooks/use_entity_manager.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { useEffect, useMemo, useState } from 'react'; +import { ApmPluginStartDeps } from '../plugin'; + +export enum ENTITY_FETCH_STATUS { + LOADING = 'loading', + SUCCESS = 'success', + FAILURE = 'failure', + NOT_INITIATED = 'not_initiated', +} + +export function useEntityManager() { + const { + services: { entityManager }, + } = useKibana(); + const [counter, setCounter] = useState(0); + const [result, setResult] = useState({ + isEnabled: false, + status: ENTITY_FETCH_STATUS.NOT_INITIATED, + }); + + useEffect(() => { + async function isManagedEntityDiscoveryEnabled() { + setResult({ isEnabled: false, status: ENTITY_FETCH_STATUS.LOADING }); + + try { + const response = await entityManager.entityClient.isManagedEntityDiscoveryEnabled(); + setResult({ isEnabled: response?.enabled, status: ENTITY_FETCH_STATUS.SUCCESS }); + } catch (err) { + setResult({ isEnabled: false, status: ENTITY_FETCH_STATUS.FAILURE }); + + console.error(err); + } + } + + isManagedEntityDiscoveryEnabled(); + }, [entityManager, counter]); + + return useMemo(() => { + return { + ...result, + refetch: () => { + // this will invalidate the deps to `useEffect` and will result in a new request + setCounter((count) => count + 1); + }, + }; + }, [result]); +} diff --git a/x-pack/plugins/observability_solution/apm/public/plugin.ts b/x-pack/plugins/observability_solution/apm/public/plugin.ts index 087718436afa8..70a2176fdc595 100644 --- a/x-pack/plugins/observability_solution/apm/public/plugin.ts +++ b/x-pack/plugins/observability_solution/apm/public/plugin.ts @@ -19,6 +19,7 @@ import { PluginInitializerContext, SecurityServiceStart, } from '@kbn/core/public'; +import { EntityManagerPublicPluginSetup } from '@kbn/entityManager-plugin/public'; import type { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { DiscoverSetup, DiscoverStart } from '@kbn/discover-plugin/public'; @@ -105,6 +106,7 @@ export interface ApmPluginSetupDeps { uiActions: UiActionsSetup; profiling?: ProfilingPluginSetup; cloud?: CloudSetup; + entityManager: EntityManagerPublicPluginSetup; } export interface ApmServices { @@ -140,6 +142,7 @@ export interface ApmPluginStartDeps { dashboard: DashboardStart; metricsDataAccess: MetricsDataPluginStart; uiSettings: IUiSettingsClient; + entityManager: EntityManagerPublicPluginSetup; } const servicesTitle = i18n.translate('xpack.apm.navigation.servicesTitle', { diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts index 045d8bc251818..8b31141601d92 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients.ts @@ -14,7 +14,7 @@ import { } from '@elastic/elasticsearch/lib/api/types'; import { withApmSpan } from '../../../../utils/with_apm_span'; -const ENTITIES_INDEX_NAME = '.entities-observability.latest-*'; +const ENTITIES_INDEX_NAME = '.entities.v1.latest.builtin_services*'; export function cancelEsRequestOnAbort>( promise: T, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts index 97f8f8c253033..c3513417cc565 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/route.ts @@ -5,12 +5,10 @@ * 2.0. */ -import { apmEnableMultiSignal } from '@kbn/observability-plugin/common'; import { createEntitiesESClient } from '../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { hasHistoricalAgentData } from './has_historical_agent_data'; -import { hasEntitiesData } from './has_historical_entities_data'; const hasDataRoute = createApmServerRoute({ endpoint: 'GET /internal/apm/has_data', @@ -19,24 +17,14 @@ const hasDataRoute = createApmServerRoute({ const { context, request } = resources; const coreContext = await context.core; - const { - uiSettings: { client: uiSettingsClient }, - } = coreContext; - - const [apmEventClient, entitiesESClient, isApmEnableMultiSignal] = await Promise.all([ + const [apmEventClient] = await Promise.all([ getApmEventClient(resources), createEntitiesESClient({ request, esClient: coreContext.elasticsearch.client.asCurrentUser, }), - uiSettingsClient.get(apmEnableMultiSignal), ]); - if (isApmEnableMultiSignal) { - const hasData = await hasEntitiesData(entitiesESClient); - return { hasData }; - } - const hasData = await hasHistoricalAgentData(apmEventClient); return { hasData }; }, diff --git a/x-pack/plugins/observability_solution/apm/tsconfig.json b/x-pack/plugins/observability_solution/apm/tsconfig.json index 375283b72f6b6..fc7fccbded5dd 100644 --- a/x-pack/plugins/observability_solution/apm/tsconfig.json +++ b/x-pack/plugins/observability_solution/apm/tsconfig.json @@ -121,7 +121,8 @@ "@kbn/react-kibana-context-render", "@kbn/react-kibana-context-theme", "@kbn/test-jest-helpers", - "@kbn/security-plugin-types-common" + "@kbn/security-plugin-types-common", + "@kbn/entityManager-plugin" ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/observability_solution/entity_manager/public/index.ts b/x-pack/plugins/observability_solution/entity_manager/public/index.ts index e17edb959595d..e8b77529c2eac 100644 --- a/x-pack/plugins/observability_solution/entity_manager/public/index.ts +++ b/x-pack/plugins/observability_solution/entity_manager/public/index.ts @@ -18,3 +18,12 @@ export const plugin: PluginInitializer< export type { EntityManagerPublicPluginSetup, EntityManagerPublicPluginStart }; export type EntityManagerAppId = 'entityManager'; + +export { + ERROR_API_KEY_NOT_FOUND, + ERROR_API_KEY_NOT_VALID, + ERROR_USER_NOT_AUTHORIZED, + ERROR_API_KEY_SERVICE_DISABLED, + ERROR_PARTIAL_BUILTIN_INSTALLATION, + ERROR_DEFINITION_STOPPED, +} from '../common/errors'; From 0e6286738bf8e3f63c384ce1972ccf0fc63069c5 Mon Sep 17 00:00:00 2001 From: Rickyanto Ang Date: Wed, 10 Jul 2024 15:38:10 -0700 Subject: [PATCH 58/82] [Cloud Security] Added textarea secret fields for GCP JSON file (#187022) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Currently GCP Json Blob field might contain input variables that can be considered secrets, and we are not hiding it. As such user can see the value when previewing the integration after saving them. This PR makes it so that the JSON Blob field acts like a Password field once user save them as in they won't be able to see it when editing it (they can only replace but not edit) It also encrypt the content on Preview, preventing User from seeing it from the Preview. Screenshot 2024-06-26 at 1 45 54 PM https://github.com/elastic/kibana/assets/8703149/14552a09-e9ef-4411-8e2a-52d26e2452c7 TODO: - Add Follow up ticket to change the manifest file, We need to change gcp.credentials.json secret value from false to true in the manifest - When working on this issue, we realized that mocking Lazyloading component for jest seems to be problematic and we haven't been doing it correctly before, as such we are skipping all jest test that has lazy loading component in it and will address it on separate ticket ( we will need to decide on what would be the best way to proceed ) https://github.com/elastic/kibana/issues/187930 --- .../gcp_credential_form.tsx | 67 +++++++++++++++---- .../gcp_credentials_form_agentless.tsx | 3 +- .../policy_template_form.test.tsx | 46 +------------ .../fleet_extensions/policy_template_form.tsx | 1 + .../policy_template_selectors.tsx | 1 + .../plugins/fleet/common/types/models/epm.ts | 2 + .../package_policy_input_var_field.tsx | 3 +- .../add_cis_integration_form_page.ts | 6 ++ .../cspm/cis_integration_gcp.ts | 14 ++-- 9 files changed, 78 insertions(+), 65 deletions(-) diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx index b31f00c21c867..2b060778933d3 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credential_form.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useEffect, useRef } from 'react'; +import React, { Suspense, useEffect, useRef } from 'react'; import semverLt from 'semver/functions/lt'; import semverCoerce from 'semver/functions/coerce'; import semverValid from 'semver/functions/valid'; @@ -15,13 +15,13 @@ import { EuiForm, EuiFormRow, EuiHorizontalRule, + EuiLoadingSpinner, EuiSelect, EuiSpacer, EuiText, - EuiTextArea, EuiTitle, } from '@elastic/eui'; -import type { NewPackagePolicy } from '@kbn/fleet-plugin/public'; +import { LazyPackagePolicyInputVarField, type NewPackagePolicy } from '@kbn/fleet-plugin/public'; import { NewPackagePolicyInput, PackageInfo } from '@kbn/fleet-plugin/common'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; @@ -30,6 +30,7 @@ import { GcpCredentialsType } from '../../../../common/types_old'; import { CLOUDBEAT_GCP } from '../../../../common/constants'; import { CspRadioOption, RadioGroup } from '../csp_boxed_radio_group'; import { + findVariableDef, getCspmCloudShellDefaultValue, getPosturePolicy, NewPackagePolicyPostureInput, @@ -193,7 +194,10 @@ const credentialOptionsList = [ }, ]; -type GcpFields = Record; +type GcpFields = Record< + string, + { label: string; type?: 'password' | 'text'; value?: string; isSecret?: boolean } +>; interface GcpInputFields { fields: GcpFields; } @@ -222,7 +226,8 @@ export const gcpField: GcpInputFields = { label: i18n.translate('xpack.csp.findings.gcpIntegration.gcpInputText.credentialJSONText', { defaultMessage: 'JSON blob containing the credentials and key used to subscribe', }), - type: 'text', + type: 'password', + isSecret: true, }, 'gcp.credentials.type': { label: i18n.translate( @@ -263,6 +268,7 @@ export interface GcpFormProps { setIsValid: (isValid: boolean) => void; onChange: any; disabled: boolean; + isEditPage?: boolean; } export const getInputVarsFields = (input: NewPackagePolicyInput, fields: GcpFields) => @@ -367,6 +373,7 @@ export const GcpCredentialsForm = ({ setIsValid, onChange, disabled, + isEditPage, }: GcpFormProps) => { /* Create a subset of properties from GcpField to use for hiding value of credentials json and credentials file when user switch from Manual to Cloud Shell, we wanna keep Project and Organization ID */ const subsetOfGcpField = (({ ['gcp.credentials.file']: a, ['gcp.credentials.json']: b }) => ({ @@ -489,6 +496,8 @@ export const GcpCredentialsForm = ({ updatePolicy(getPosturePolicy(newPolicy, input.type, { [key]: { value } })) } isOrganization={isOrganization} + packageInfo={packageInfo} + isEditPage={isEditPage} /> )} @@ -504,11 +513,15 @@ export const GcpInputVarFields = ({ onChange, isOrganization, disabled, + packageInfo, + isEditPage, }: { fields: Array; onChange: (key: string, value: string) => void; isOrganization: boolean; disabled: boolean; + packageInfo: PackageInfo; + isEditPage?: boolean; }) => { const getFieldById = (id: keyof GcpInputFields['fields']) => { return fields.find((element) => element.id === id); @@ -581,15 +594,41 @@ export const GcpInputVarFields = ({ )} {credentialsTypeValue === credentialJSONValue && credentialJSONFields && ( - - onChange(credentialJSONFields.id, event.target.value)} - /> - +
+ + + }> + { + onChange(credentialJSONFields.id, value); + }} + errors={[]} + forceShowErrors={false} + isEditPage={isEditPage} + /> + + +
)}

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

diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx index ca25f3ea1469e..d246ea82689bb 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/gcp_credentials_form/gcp_credentials_form_agentless.tsx @@ -33,8 +33,8 @@ export const GcpCredentialsFormAgentless = ({ input, newPolicy, updatePolicy, - packageInfo, disabled, + packageInfo, }: GcpFormProps) => { const accountType = input.streams?.[0]?.vars?.['gcp.account_type']?.value; const isOrganization = accountType === ORGANIZATION_ACCOUNT; @@ -102,6 +102,7 @@ export const GcpCredentialsFormAgentless = ({ updatePolicy(getPosturePolicy(newPolicy, input.type, { [key]: { value } })) } isOrganization={isOrganization} + packageInfo={packageInfo} /> diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx index f3aafc11c9334..84abf584b5080 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.test.tsx @@ -1226,48 +1226,6 @@ describe('', () => { }); }); - it(`renders ${CLOUDBEAT_GCP} Credentials JSON fields`, () => { - let policy = getMockPolicyGCP(); - policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { - setup_access: { value: 'manual' }, - 'gcp.credentials.type': { value: 'credentials-json' }, - }); - - const { getByRole, getByLabelText } = render( - - ); - - expect(getByRole('option', { name: 'Credentials JSON', selected: true })).toBeInTheDocument(); - - expect( - getByLabelText('JSON blob containing the credentials and key used to subscribe') - ).toBeInTheDocument(); - }); - - it(`updates ${CLOUDBEAT_GCP} Credentials JSON fields`, () => { - let policy = getMockPolicyGCP(); - policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { - 'gcp.project_id': { value: 'a' }, - 'gcp.credentials.type': { value: 'credentials-json' }, - setup_access: { value: 'manual' }, - }); - - const { getByTestId } = render( - - ); - - userEvent.type(getByTestId(CIS_GCP_INPUT_FIELDS_TEST_SUBJECTS.CREDENTIALS_JSON), 'b'); - - policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { - 'gcp.credentials.json': { value: 'b' }, - }); - - expect(onChange).toHaveBeenCalledWith({ - isValid: true, - updatedPolicy: policy, - }); - }); - it(`${CLOUDBEAT_GCP} form do not displays upgrade message for supported versions and gcp organization option is enabled`, () => { let policy = getMockPolicyGCP(); policy = getPosturePolicy(policy, CLOUDBEAT_GCP, { @@ -1541,7 +1499,7 @@ describe('', () => { }); }); - it('should render setup technology selector for GCP for organisation account type', async () => { + it.skip('should render setup technology selector for GCP for organisation account type', async () => { const newPackagePolicy = getMockPolicyGCP(); const { getByTestId, queryByTestId, getByRole } = render( @@ -1593,7 +1551,7 @@ describe('', () => { }); }); - it('should render setup technology selector for GCP for single-account', async () => { + it.skip('should render setup technology selector for GCP for single-account', async () => { const newPackagePolicy = getMockPolicyGCP({ 'gcp.account_type': { value: GCP_SINGLE_ACCOUNT, type: 'text' }, }); diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx index a5096e5d29ef7..ab5ce05d7a54c 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_form.tsx @@ -779,6 +779,7 @@ export const CspPolicyTemplateForm = memo diff --git a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx index fd816d03fb507..ee76d40e1dcac 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/policy_template_selectors.tsx @@ -79,6 +79,7 @@ interface PolicyTemplateVarsFormProps { setIsValid: (isValid: boolean) => void; disabled: boolean; setupTechnology: SetupTechnology; + isEditPage?: boolean; } export const PolicyTemplateVarsForm = ({ diff --git a/x-pack/plugins/fleet/common/types/models/epm.ts b/x-pack/plugins/fleet/common/types/models/epm.ts index 06a8b979c8eb5..fda07095de95d 100644 --- a/x-pack/plugins/fleet/common/types/models/epm.ts +++ b/x-pack/plugins/fleet/common/types/models/epm.ts @@ -435,6 +435,7 @@ export enum RegistryVarsEntryKeys { os = 'os', secret = 'secret', hide_in_deployment_modes = 'hide_in_deployment_modes', + full_width = 'full_width', } // EPR types this as `[]map[string]interface{}` @@ -457,6 +458,7 @@ export interface RegistryVarsEntry { }; }; [RegistryVarsEntryKeys.hide_in_deployment_modes]?: string[]; + [RegistryVarsEntryKeys.full_width]?: boolean; } // Deprecated as part of the removing public references to saved object schemas diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx index 114d973f32541..af0b2dbce2ff1 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/package_policy_input_var_field.tsx @@ -185,7 +185,7 @@ function getInputComponent({ fieldTestSelector, setIsDirty, }: InputComponentProps) { - const { multi, type, options } = varDef; + const { multi, type, options, full_width: fullWidth } = varDef; if (multi) { return ( setIsDirty(true)} disabled={frozen} resize="vertical" + fullWidth={fullWidth} data-test-subj={`textAreaInput-${fieldTestSelector}`} /> ); diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts index bf555e7fe72e4..75ba76b067cc9 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/add_cis_integration_form_page.ts @@ -289,6 +289,11 @@ export function AddCisIntegrationFormPageProvider({ await nameField[0].type(uuidv4()); }; + const getSecretComponentReplaceButton = async (secretButtonSelector: string) => { + const secretComponentReplaceButton = await testSubjects.find(secretButtonSelector); + return secretComponentReplaceButton; + }; + return { cisAzure, cisAws, @@ -323,6 +328,7 @@ export function AddCisIntegrationFormPageProvider({ isOptionChecked, checkIntegrationPliAuthBlockExists, getReplaceSecretButton, + getSecretComponentReplaceButton, inputUniqueIntegrationName, }; } diff --git a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts index 6ce0c8fed5749..e8d1dcda1f430 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cspm/cis_integration_gcp.ts @@ -17,7 +17,7 @@ const PRJ_ID_TEST_ID = 'project_id_test_id'; const ORG_ID_TEST_ID = 'organization_id_test_id'; const CREDENTIALS_TYPE_TEST_ID = 'credentials_type_test_id'; const CREDENTIALS_FILE_TEST_ID = 'credentials_file_test_id'; -const CREDENTIALS_JSON_TEST_ID = 'credentials_json_test_id'; +const CREDENTIALS_JSON_TEST_ID = 'textAreaInput-credentials-json'; // eslint-disable-next-line import/no-default-export export default function (providerContext: FtrProviderContext) { @@ -170,9 +170,11 @@ export default function (providerContext: FtrProviderContext) { await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); + await cisIntegration.clickFirstElementOnIntegrationTable(); expect( - (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) === - credentialJsonName + (await cisIntegration.getSecretComponentReplaceButton( + 'button-replace-credentials-json' + )) !== undefined ).to.be(true); }); }); @@ -271,9 +273,11 @@ export default function (providerContext: FtrProviderContext) { await pageObjects.header.waitUntilLoadingHasFinished(); expect((await cisIntegration.getPostInstallModal()) !== undefined).to.be(true); await cisIntegration.navigateToIntegrationCspList(); + await cisIntegration.clickFirstElementOnIntegrationTable(); expect( - (await cisIntegration.getFieldValueInEditPage(CREDENTIALS_JSON_TEST_ID)) === - credentialJsonName + (await cisIntegration.getSecretComponentReplaceButton( + 'button-replace-credentials-json' + )) !== undefined ).to.be(true); }); it('Users are able to switch credentials_type from/to Credential File fields ', async () => { From 12eabcc7e227af7b9b1ef90156df9a68c448e78c Mon Sep 17 00:00:00 2001 From: Rickyanto Ang Date: Wed, 10 Jul 2024 18:23:13 -0700 Subject: [PATCH 59/82] [Cloud Security] Broken UI fix (#188041) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fix for line break tag showing up as text instead of actual line break Fix for Pipe symbol not showing properly **BEFORE** ![341360105-1705fa0f-fc9c-4068-b1bc-ae578d14b7c5](https://github.com/elastic/kibana/assets/8703149/05b5f568-70b4-44b2-9c2f-eb566d446f2a) Screenshot 2024-07-10 at 4 53 21 PM **AFTER** Screenshot 2024-07-10 at 3 34 03 PM Screenshot 2024-07-10 at 4 50 50 PM --- .../public/components/no_vulnerabilities_states.tsx | 5 ++++- .../public/pages/rules/rules_table_header.tsx | 9 +++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx b/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx index e2d453c078115..a2b1aa1d0d831 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/no_vulnerabilities_states.tsx @@ -74,8 +74,11 @@ const CnvmIntegrationNotInstalledEmptyPrompt = ({

, + }} />

} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx index 5aa8aae1dc590..83745e5f5d113 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx @@ -333,8 +333,13 @@ const CurrentPageOfTotal = ({ From 1394d75060cfa87d1d10d84efbab91a68c124001 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 11 Jul 2024 07:11:41 +0200 Subject: [PATCH 60/82] [api-docs] 2024-07-11 Daily api_docs build (#188046) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/765 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/assets_data_access.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/entity_manager.devdocs.json | 90 +++++++++++++++++++ api_docs/entity_manager.mdx | 4 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 14 +++ api_docs/fleet.mdx | 4 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/investigate.mdx | 4 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- .../kbn_content_management_user_profiles.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- .../kbn_core_test_helpers_model_versions.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_esql_ast.mdx | 2 +- api_docs/kbn_esql_utils.mdx | 2 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_grouping.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_index_management.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_recently_accessed.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- api_docs/kbn_security_plugin_types_public.mdx | 2 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_error_boundary.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_predicates.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.devdocs.json | 11 +++ api_docs/kbn_ui_shared_deps_src.mdx | 4 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_unsaved_changes_prompt.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod_helpers.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 14 +-- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.devdocs.json | 53 +---------- api_docs/search_playground.mdx | 4 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 707 files changed, 833 insertions(+), 763 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 4ab36f970a763..b6fffb4194b6b 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index ae76364c4ec72..6492dd6984167 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index f858eb52a31b0..8d2b1f6fef27c 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index b531df2cf8a7b..729b2feaf6311 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 7dc9cabc2a413..830bc1ebcdbe3 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index f5f06b8e74070..3e3688dce2c04 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 8f86fdb36cd2a..21b67dd6160cc 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index 6ba79a185aef3..3ea04a6401275 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 244eb9bae85c0..ecf938f654271 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 3ca9e70563e6f..a9ea60f5a4f42 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 97fda29eaa639..24d534fd65a08 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 7f35d571cec41..e322a93eaebd9 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 406b5aa2fda76..de9a785c6f3ed 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index b57f89c35c137..f502cdf61f118 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 3674bbfd1c5b3..1e031cba557ed 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 791d46b97f470..20c6b22cbb41b 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 158ee1ce6978f..ae517fc661661 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 4cf82bac4f4f4..847acbfa0de75 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 05af1aff6e9fb..0825074a8d879 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 2336fc498da8f..eb4b9b449e09b 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 23d9b1b0f3db5..ed3402a2c87db 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index a249305bca74b..f93ee1c9104b1 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 59e0235903c55..bf7dabe1a8958 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 734405a4a261b..8621e73a61b7a 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 7481ab2d2ab76..1b14f907dc075 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 9f5495e0c79d1..e3303471571cd 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 3c71d748fa9cd..234d0de08b169 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 70e71ee5aa5c4..174dfd5a5f487 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 8984de2773bb7..2d73601ae56a8 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index f78c44f596264..ea063ed0ddeeb 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 3e1e9f293c482..477ea83571529 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index db20d4edea797..10a355586b1b7 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 56cf47d4c4aa3..fb4dbd51a2442 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index fe5acec36e932..4dabd7b5e9c45 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 338694c6a2a55..a07ed2211d123 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 850dc5df41ba7..f1fb99dcd5ae9 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 995499eb7b72d..2cc94d7fa75f6 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index c4cec9086a33b..562287dd1cb42 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index a41a75aa111de..90f85106e8612 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 38b90b7b8cf23..053a1991eb618 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 5825686178960..231fe7f410a82 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 8dcfb6b5e7e6f..a8a4ee382dab3 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index a1059962f6c5a..fccf3d6b64831 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 3bc3433fb2d12..ba0258d8589df 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 452beb639c4d6..6ea23c886a0f7 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index fb85d36c29136..5b3f5a9f72c75 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 4ae1a33d050c8..0b4ee2c5256d1 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entity_manager.devdocs.json b/api_docs/entity_manager.devdocs.json index f8f2a8dde90aa..145b8f97ff63a 100644 --- a/api_docs/entity_manager.devdocs.json +++ b/api_docs/entity_manager.devdocs.json @@ -77,6 +77,96 @@ "deprecated": false, "trackAdoption": false, "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_API_KEY_NOT_FOUND", + "type": "string", + "tags": [], + "label": "ERROR_API_KEY_NOT_FOUND", + "description": [], + "signature": [ + "\"api_key_not_found\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_API_KEY_NOT_VALID", + "type": "string", + "tags": [], + "label": "ERROR_API_KEY_NOT_VALID", + "description": [], + "signature": [ + "\"api_key_not_valid\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_API_KEY_SERVICE_DISABLED", + "type": "string", + "tags": [], + "label": "ERROR_API_KEY_SERVICE_DISABLED", + "description": [], + "signature": [ + "\"api_key_service_disabled\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_DEFINITION_STOPPED", + "type": "string", + "tags": [], + "label": "ERROR_DEFINITION_STOPPED", + "description": [], + "signature": [ + "\"error_definition_stopped\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_PARTIAL_BUILTIN_INSTALLATION", + "type": "string", + "tags": [], + "label": "ERROR_PARTIAL_BUILTIN_INSTALLATION", + "description": [], + "signature": [ + "\"partial_builtin_installation\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "entityManager", + "id": "def-public.ERROR_USER_NOT_AUTHORIZED", + "type": "string", + "tags": [], + "label": "ERROR_USER_NOT_AUTHORIZED", + "description": [], + "signature": [ + "\"user_not_authorized\"" + ], + "path": "x-pack/plugins/observability_solution/entity_manager/common/errors.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 65803da229e88..359efb8f409c7 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 8 | 0 | 8 | 1 | +| 14 | 0 | 14 | 1 | ## Client diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 59bdc7a01f925..7e4c7ae8ed8e7 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 447a914e099b7..8d8b7f0c0b679 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index 7c87152fde9f7..ca621bfee4b02 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 8fb24e06e9416..7427bc363bf0e 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index c73d5f0e92f68..a65650e5685ce 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index bc1e9181691d2..0154024c4e5f2 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index cab6253f89206..2cd5df3e65687 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 95e5b3c81624b..61400637bd16c 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 58efbcc948417..1add6ebb11b99 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index a295c8a8243e7..a46147400ad60 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index cd4aef9931b14..5de5767ec431d 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 49ef48ead111d..5478834bbe46c 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 2ff72cba1fb0a..c513aec5c05f0 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 5bc7e3f71791b..9b335fd928ddc 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 9a13222ea8881..1bf57bb07c913 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index e66da6d59b9e5..663c37f0336cd 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index cb683edbaae50..883291f327bca 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 74c9fbe913ab7..7030d0e522164 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index baf2e18810dc4..b95138d54ab47 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 9ba2df560cd90..908c8f388039c 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index bcf331fcaea87..2c7741a342025 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 98d623a0718dc..b3e14b5434c3b 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 315f282888a62..0f2a1c1d4bd9c 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index f1f73851b4e03..98e8397418109 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 3e7c2f343df8a..3e073cfc2b353 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 2ce43154bd901..176485460c7db 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 319a8d826876e..0348766c93248 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index fec8ffac9edc5..b0da7aab43721 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -25871,6 +25871,20 @@ "path": "x-pack/plugins/fleet/common/types/models/epm.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.RegistryVarsEntry.RegistryVarsEntryKeys.full_width", + "type": "CompoundType", + "tags": [], + "label": "[RegistryVarsEntryKeys.full_width]", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/epm.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index dae9096e93491..e99b668273f28 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1348 | 5 | 1226 | 72 | +| 1349 | 5 | 1227 | 72 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 4deccbece2ccb..d8a4778b5dfb4 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 4ce7402a8af27..cd0a584abd942 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index c36206ccfa0db..12cd9e9a7fd41 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index 2a2aea8bbd167..a285787fe67ac 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index b94c808b00a1c..d5e4649658817 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 2b9c65a69a762..9e81464ca56ea 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index dd9cea8435c0c..20783144b93a1 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index 888aeb53975b9..bda1a481df694 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 19aeeacae8fb7..5f4f529bd6388 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index f854290a8e46d..6d0242e8a2069 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index bfed005615951..c47d63303a0a3 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 1297a4e4a49c3..7722afcb762e4 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; -Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) for questions regarding this plugin. +Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 4e19d3760cbe7..fc68672cf88f7 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index eed3dae813b41..7036d7e54f77e 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index f0fe73b3dc7c3..bbf1801c680f1 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 10ec613aaa584..95d4e6f07fcc3 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 3cb4e7842beb2..9e6677bd8b7ae 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 8b77837af86e9..684e0747d51b3 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index df854a85297b1..64bbc439d1091 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index f1fa88189271d..4b29160e5d927 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 0b00923d69f53..b7bbb6492201a 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 8258b4fb967f3..fd2b3675e12b8 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index 50d4f1bd7cede..77bdc915dbdc3 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index ce145ff3877d1..fd5677fce9f74 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 736cd4795a2ba..6896546ffb32a 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index 1f5b0b1a14c5d..1c052b7b6c4d2 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 607b5dc80ad40..52f46921b8a6c 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 1569c9f838b35..8c863c11ca3d9 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 40a798b29cb84..2e6cd4d8a33c6 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 2217f8afe67fa..bee339a7a5b96 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 2f6c745245849..412a59fff7245 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index e9d0d7b94a811..4802854b39e3e 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 57a414c2e6a96..d42e2b360aebd 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index cee6fda7b11f2..a4ccd68d6f248 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index aa375bc54d8ce..014436b53055d 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index dd2d4cc67ff9c..be98393f76557 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 8b9f911f3c2e4..1de24a4d18c68 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index ab062d7aacab6..3019f08b578a8 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 6c2278cc5c26c..8703f4965b812 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index b59a2000ddd5e..22576ae2eac24 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index dca01b8e5534e..d8250347da8aa 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index c7e7d48d42953..d42a537edf4b1 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 1735337e2d9a4..2929a1a2162c3 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index e7e3677c0f03c..48265e3c6f043 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index bd271acb335cc..e7f9b5fa5f2a6 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 6d9a8f8321992..d980134f35105 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 1c25a10314995..fe48d5fddc2ff 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 42a189cc36723..e6d2d81f5268b 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 12456f1ab6a0f..dc4eeb2fc1564 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 81633a93e69ba..91d2e4c2675af 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 6dec8394e0727..423028ccf543d 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index fd9ae186bc217..4668b77ab9918 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 1be41f9b757d7..9bc69d95bd8ef 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 704cbfbb1c73d..b78c1e5f21832 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index ebb114e7b287d..bdc5a7d428729 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index 9125238ffbf9a..726b4e50bbf78 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 5e93e81da185a..1a571a6235c67 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 74d8ac8a69aaa..376acad1aeca5 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 31198a58c5d29..20c4f81eaba5d 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index dd32608997acc..bca3557232102 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index e3918cdf78c32..9c0d4635cb73f 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 64817a1ced0bb..3176235db7c47 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index ba48c0d6d912b..7e294c2b0f0fe 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index d22cc4c43127d..988172664fa0a 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 2b815d6b94832..5e75403ef5b0c 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index 34fee76ee5c36..a871b9d73f3f3 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index ee76f51d569bf..50229a02dc606 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 5656d0d02eb52..c4659d860e4f0 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 1762ed09c72b9..367d7d2181417 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 2b4aa6e4593f4..cf6fd06bfc153 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index a34ef4d8ceb9e..9d8f9e0739bd5 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index e4580bbb89dcb..5c37132b4f79f 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 2d5ef1cbda0e9..3b74753424a7e 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index fa7602c4113c1..cbdf54801bf0d 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index aad00c5dd3247..2e61f3936e5f8 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 755cc577569bb..91c2525f2b051 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 8e66c47f78879..e18d28c3d1d69 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 5ae4c0b4a07ba..15df05f10bf00 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 493424c84b150..d2f73aae6c56a 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index e88d9096178e4..f67dd9ab55dae 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 8cbbd7d26095e..4d00542bb07f5 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 70ea4b5dc374a..475603132fb38 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index 078a23e6efa3f..5a3daa48a0991 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 3d9e1988958e3..a51c29a157dc7 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index aac7b29574900..a968a84ebedb8 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index 863b10f8b7b9d..be06b7f5c071f 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index ecbbc9243ae4e..a8469ab10bd6c 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index b71725ff3b2ae..ff47ac18f388d 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index dd01ec2331d2d..8f547d585c521 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 4edbb3c64da34..0d1f50c631c94 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 11b836687315c..588882107a59e 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index b92429db69761..72c2fd828595f 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index d5e1e17da2f2b..ad8707b012f6f 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 0a185cfe29232..beb2ee0960c03 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 7576650985823..8631921d2992d 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index bf18087d74d2c..c01a5ad288fc7 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index c615e730a495b..05a02d042fe8f 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 5e4434442a073..34c6ab10fa7b1 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 853b804f99a55..0714172c5b8de 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index acb40a74aa0fc..97ca9a1453d76 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index dd28589a8219c..7dd9526228567 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 468df05588325..5eca94f8a20cb 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 31c6d9abee8b9..99a59f4b23f87 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 61f74a13f0e68..e2e309d7bd0de 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index a99628a5feb28..bb23363db38e1 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 139c7d6f533ca..33b321249e0cc 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index b7f710f7e048d..fc956352f0656 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index a04dabf41596d..1ef300a06de87 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 7300d7f4befad..a33c5c4e26238 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index cd45ea1a09ee3..94084a3fe62d4 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 024a8076e810c..e66dbd0069486 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 3acd65471f5f3..a927c475362de 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 042a1ca06100d..20cb7e687ce02 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index a3731a178b671..064521832e249 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 0b7dbf9b8af59..45f97c1d78e79 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 10b55c9a7963e..39124862a3323 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 62df39457ebbf..95dfc7b0d171a 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index aa625c1430ef5..5ba46583dc125 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index c712c870c39ed..93983bf356095 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index e9702014d9cb4..01ca25c21e898 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index d472cafb7def1..0cad736e16410 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 301bf37a89c5a..5663ea45d0e3e 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index d677d7278ee77..a66883c9f2ebe 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index e751633cab599..a03d2453be975 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index fc96eb6839be2..6f7f444953b0e 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 8e56ceb6a2d67..a3d1fa4bc7086 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index c931520b056aa..614c3b9a7b7e2 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 9759c12e3d375..2d330ecb3f7b3 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 52194d1e3ba22..cfded8d56635f 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 35b2cca10f626..d7a3c9641cc07 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 2644102b52276..b06ad10414620 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index b2f26ad7f762a..c7b11d5a18cb9 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index e49c256c48da4..dd078b381f972 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 29622e5b8cfce..0f1a495092a62 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 80c612eed5595..aeb737f9486a5 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index c92d1b62d82f9..132a752867fed 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index b173cfa0a04ce..69b7fcfccb430 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 43c2679734327..2f90e1916554e 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 7da2b4413e8dc..20bc6881efb28 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 7ba907b57a4e0..84afe340bafaf 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index da470e8c5d703..09f38b1e9e14b 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 00fb9dd2ebcec..4e327029c6e75 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 42a0e8343c5f6..d913047ca8b58 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 910f2873610ad..aa313b06ce52e 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 8590695194b42..8f4f0db0e831b 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index d512ae1f0b003..5e3f3f033a40c 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 81edad85cffac..b40391cf960de 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index fefa72fd3b666..eae30f58c6863 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 9d6f8be46e00b..adb6933ac0b3e 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 2daf307ef4f4f..bd353e1fbb474 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 64a7b50c47608..ed05e8b871e13 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 46374089703e0..785347717a7b0 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 152930feda411..6703f92b23c37 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 12522b90f06f2..b36d927b144df 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 8c8c3b805224a..2098ce8ef277f 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index d232bafe0fa82..13d674307226e 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 3c30b302f76f9..a537901ed8762 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 5dc7556ad8bf9..5708b905aa3c1 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index a19c448fcc345..98308898b1c03 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index ad9a4f45df10d..62cf0ec701516 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 66c479cb3a4c2..996f481cda36f 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index dc6502ea5f1fe..78fdf2ecdf3a7 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 309d207ba9c51..9e5f4ecc16e7f 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index aea6137d6b2f6..04d4ac0d9b488 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 0138ec8685492..6fc8f8d6a7299 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 45e7b983181e7..4ea22f25705aa 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index fb8e18373612a..5a7b6ad659133 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 4c8f4bedf0b62..64ad58587ebfb 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 3b1283d55ff63..7ad29baf7ae44 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 63648a80c8df2..d8fbd475a2841 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 85402f60a8cd4..4ce95e2b3defe 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index bd24e8b6521de..650588837018d 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index dc8ed6970a5a3..82850711751d7 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 2be2c17cd383d..74f7284f16963 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 02238a9b75685..f145e5ae7c0cc 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index e22c55d5cbd2d..e3f63ec5585af 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index 1f9e3651952af..d66e01dbe82b9 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 1705bf294d5dd..8a1b41554edc3 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 71c5bd3827440..168d96ec1f10c 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index e778e345e2eef..bc7163705ce0f 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index cc080a849348a..2663aabf63307 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index f749372d27e69..14d437efbbeaa 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index e4e89e985e55a..8b33b1b5b0c49 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index 18ab4d127f094..4c80ed2214e6a 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index adefadd41522a..1d540f8f98d2b 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index bef401cec68d0..fd6aec4a47d93 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index aa02f2c204c33..666a471ecf3f7 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 365461b782a27..0c9a42112fec9 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 864cfb892c1e5..f3e5286b53133 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 0b0b7e49ce06a..8156b79846db7 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index d501f71665274..f6ff7e00daefa 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index 60a4bfc184ead..f13915cbc1a81 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 08455631e32c6..2372dd9eb3f88 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 0ee6a3841131f..4678c148eae5b 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index 6a08b94c80e04..4139bf1eae324 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 804cabb86c046..9c7ad2035ccb2 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index ae701990499af..209c495677293 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 70a3d735210f2..fb31caf120bb0 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 50fc2868a8114..3565faa7654ca 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 3ea24300b04bf..39250a7ba184f 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index c0c9aea180781..ae5a55848a0ae 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 8d92cb58d7dff..063abbf6f8ce1 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 790d150256c1d..2a96726373e10 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index 52ee66138de12..359518c3074b2 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 7a7f7d25c8c48..e6fbc69fc4b33 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 487a34b3ef4c9..f99f8627deeca 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index dee2943242a7f..c34d787a163f2 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index f2c36574705f3..65001a51b1d16 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 37914f9a0f76e..4142b15b2d9db 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 1494ef582037c..b0e6352eb09e9 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index f48fda3b2d940..07976f5268389 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 87b9a14ed0bd8..8403f8135adca 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 89df44e037de5..dcd06080ded9f 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 61cf393dc5b22..383884d29aa2e 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 3bd7e6978e429..c0a1d101ad8c1 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index ee4c1be113244..f4d7730da2efb 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 71e9fdb216c66..b6445e6ef9a56 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index 837180b140b68..158a04ff11bc2 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 651f8f3b04c40..a6833cfb987d6 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index e117c9b70b1b9..f878721b6fe12 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index cf88f775fb228..f2e6bc1e5f05d 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index 10dafaded4540..fe9361ab89076 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 2a3f26390cb3f..3231c90c05c5d 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index a9f16e272eec7..322cae4dfa77c 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 520109e83ebfd..efe307180e83a 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 88ea1fc2cdf9c..e55bf0b83222d 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index ebe45ba4fb7e9..ad5a069dc7c95 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 04f0ef9bb2949..bf9468e73fcf9 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 69cf0df1e043c..ff3adf35317d2 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index c5b4476e38917..b4d26872b24e0 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index c1465d219dd7b..9a8c74e3bd723 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 6408d98650279..2b03ad087184f 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index 1adaa5c99a61b..d01d7fe32e132 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 1fe60a7a662b7..4daf1d3c445ff 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index 5ae49ee44b2c7..cf52fa6c3a80e 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 5a572d6760ccb..b55dbe1104ec4 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 2ce275aabd524..8776bd84a8a67 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 9c77d0b2f7f14..37a08519c657c 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index c004445a6d6df..7f94ca1b6c62f 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index ead9a6580c1fc..690ee52302f83 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 5e49e88e15229..d9ff350331076 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index 85ca3b08993de..01616f8aa7939 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 3bcb897c161c4..9f109f9ac8e27 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 784d7b561bd15..c7b45bac65b78 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index e6a307fa8b646..a9b981ef63b99 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 8a8806d97c244..7632d8c3d8574 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 32002cd4fabaa..53f462a5820e4 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 1230f5cd39b94..45f26f34c0bc8 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 3d4837d7f869d..077cf495c42a0 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index fd9f605ebfa8f..9b9c2ec67217a 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 1bb36ed0a2d57..01e11369c69c6 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 17b6385fcb510..314ad13865b67 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index e12d1fb934996..53fd62dbd5207 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 1ae344ef56f12..adc46e7bed4bf 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 01cc6e54a6d09..80dc1d84a3bcb 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 378560e2f9dbb..6f8c66c500644 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index c790db3a17d38..1013d41512685 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 03b4b3317e082..817bd3ade599a 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 7bf4159ded7fe..a6e7f866d5c2a 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 9c93ea2205a55..992cd44203b59 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt.mdx b/api_docs/kbn_ebt.mdx index 499e44b7202ca..e3cc19e3f4e11 100644 --- a/api_docs/kbn_ebt.mdx +++ b/api_docs/kbn_ebt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt title: "@kbn/ebt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt'] --- import kbnEbtObj from './kbn_ebt.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 602bef774c217..3e947e8b7de85 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index b9ffb6f6e264f..422beff42fcd3 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index c2ce5f9f909ca..2f88ec0fca74b 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index bc572016322d8..036f02873ccbf 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index b75806470bb96..283289cb1b986 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index db23747c07d57..36eb8b77f0736 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 74e15499c98c8..ac0a3e9ec363e 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index e0bdec105a323..d5998673d4ca5 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index bb67567945bfc..e6942f63addd1 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 09fa30e666064..126af776fe859 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index bd52515236889..e7a83316f6d4a 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 996cdd292a3c2..adfe573c8adcc 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index c26af5141e0d2..6bf2b5c4ea9d9 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index d4ce11a10185b..13ea5e35682d5 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 6005c598f9798..d255b890eab4f 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 9e6436015f568..27926b3fe96e7 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 675787e44b485..55b7e6c390d51 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 7c31260958bbf..5e2858640bb2b 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 6c08526725b10..e0ddef62ed19a 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 7dd29ed4b3ee6..4d1d0c518eb9e 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 421592b70fbe8..cffc605081fb0 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_formatters.mdx b/api_docs/kbn_formatters.mdx index 1a6c7b6f84ffe..75cc32464a9f7 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index bbe87749889cf..31550c0a7938a 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 2a0ffa26fcef8..47ea9dbbba60d 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 774fe7fb04566..f8e68b2de7323 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 6e8b03b091596..3ae9dc5c41a5f 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index fdcf2f4d89afa..52db674e1c1e2 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index a495ad1c6d2e0..3bcd5481373e6 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 34e162a443d28..978f32edffee7 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 094412e8b5682..5f8a30051949f 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index c34e4c3ea3f07..07b644cf29279 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index 12426866b6e81..4ddb5f39a167c 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 8a5f9c1afce58..59c0fa084bb94 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index e08496320d2a2..983940f971052 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 9a5a1047820c9..0b0634528213b 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index b060a6760686e..db2d1f018e895 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index c47b58d8e3bf9..79d23033a0261 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index 85e08645d5779..5d986a50981ee 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 1e743744d845d..b32bb5f046cb7 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 8b4de71f7ddbe..94160bdf5b5ec 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 64123585efa90..bcb7b29b795dc 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index e4ab643d9af9d..08950ff96575b 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index b23b257e4101c..c2c9775d6e5ec 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index a3f7c87931519..fd83386622f4d 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index 9e177417e52a5..d4e627ee9dd44 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 5f427ab32ad72..af2d71e1aee9a 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index f5453b314c11a..7bcfb8ea1bbe4 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 1ea1f37beabe6..7909130f970f4 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 1b47ad998cf41..0b955032e9fbf 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 96583dd6dcac9..1eb0fcf84a30b 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index b7c542d83bb2f..3e173b1648910 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 5091928b66778..9b37a6f3f3321 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 12b7a262dd653..aa4f4e7e18a6f 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 77c4bac229828..c6a4aad1d15b5 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index a1dab6d429a7d..904ea66bf2050 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 1f3a24ca87355..f8a1f81958bca 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index 1718efdec3a87..25d4b9eb75a3e 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index db9cee8230a0d..7c5cd5e5013d2 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 8a805df3d3a39..407cd6aafef3c 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index db8386221e335..3e8320b04b23a 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 02363df9d634b..215fbb0415161 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 7aebba7095217..5b1b2807ab339 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 71eb1446f75b9..b9bf6cf2a7005 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 7c1e5e14dcc2a..0819d0bfbb7c8 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 45119a3317a4b..d7c65c76d482d 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index e048b8839f2a2..cdf448aa90e66 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 5002ea91da03f..cd588c4f68580 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 85b4d01c8731d..ca2e7179f046a 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index bfccdc8d37f70..a3ad4176a8a81 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index daf0cea9ed7a2..8ee3938cb02c0 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 1dc34236ad32e..d07f30cc90659 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 1e8a952d47927..2c2828919b7b8 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 363be1682f841..8b302035202b3 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index 632420bf2fad9..e4d590eed7f62 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 7cdc4e877f2cf..093530d03119f 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index da8839726a176..a3d030058419c 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 606ce4780c701..9cac3bf2ef225 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 0bbdd8a7357e6..436156f2347f8 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 730aebc4e4093..3db201316a013 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index ab23d4ca1a5c9..9b4b68d42407c 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 9091ae8ebd0d0..cd216d15d16f0 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index bf66b55a15af0..ea033faa0200f 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 527409b93aa1e..80762c216bf6c 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index ade93f4976d2d..bd8d0d600928d 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index e8b45372798be..1082fde885fc4 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 39db829036539..ed61af11d2d1a 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 569858f1cca62..18a95ece0efc5 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index c80056ab85de0..4df647011e94d 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index a5355d0238ee7..e96069e4faf31 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 06e09a80c911a..9d726ccce7d64 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 5f357c296b794..b4cea76738fd9 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index c0c8dd81f2209..994f6b4aae2eb 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 6b6707e0a21e9..672547666a301 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 0db0964faef93..88278dbc812c8 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 7ca46a3d4ede8..07ae4c27e45aa 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index c5fdd3a40296a..638c50fdb137f 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index b535d75a8af00..85062f7b2a077 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index c096003007485..bc6e8573c93e8 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index e35bff754e051..01805fd74a6ff 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 7f044e2b150b1..4af6c43f357c5 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index dfe0d2671b37c..0516477727aba 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index c245d9a606f1e..84247ae5afaff 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index aec8f452011b9..0d2ac208b7e6f 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 6d9e606ebd8eb..545592c9554b1 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 8a70b608998e2..c5fefaebc736f 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index eee329fa9599b..c60dba038b7cd 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index 1a08570e9a503..f133e2beda4cc 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 910dc86ec01c8..ca1145ef455dc 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_check.mdx b/api_docs/kbn_plugin_check.mdx index 71f2af8f818f9..6c54037c12a98 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 54fcf8a30cdc3..99c83018e5239 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 9e208e0540f25..de815490846ac 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 846d4679f21df..c1391988264a9 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 275699efbbedb..9a6a8ae21d312 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 3362789482740..09e6baea4b78c 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 5328846f12fe3..07d27c59202c7 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 6ef174063cebd..7b49a30a3d724 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 7ea167bd57b8e..46c0819bf7568 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 769ead4b28a35..739a94c2e424a 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index e87259ceaaf00..3326520edc59e 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 469defcaff4d3..31606dac7f3c0 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 4525093694536..7113b40106640 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index 9c7c73a5f7eb1..868356cefda9e 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index e10de0f6f3056..0c1a70db3e0bd 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index ecdd49ce284cb..21964aa57344b 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 9e448cd5df8d9..eb7ab9f741927 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 63f06084fc55a..d1085688553ef 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index fcd60fbf61417..1a0d8707d891f 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 1930243290861..0c17e23fa2c11 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index a7901d9ecdf41..da8a398b36802 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 8013b2c585286..1480f6658b029 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index a7e19c8f8815c..5b1446f671584 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 0311edc4a8554..164f7409fdf07 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index e6dce93a89500..9ec8ece7caf4a 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index a570271c52a7d..6661bc6008aaa 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index 48a3dd740958a..3a0ec5768f52b 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index d886a858f369e..0af88df1fc84b 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index cd5bd0462b403..d49952a3ec283 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index 9365b7b86b4f7..7e1216c8367c6 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index d52b51314d80e..dca1b1a9269cc 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index 86aa9a218ab13..fec364f156d12 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index 88a57b7b4635d..3ee0b47d3fe68 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index f8f10883aa806..d659bb58baa7e 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index 2a815b0d45a47..988491b2a2274 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 68054b59c5003..94444ebbcb5d2 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 418bb52e19f8c..9ccba988fe0bc 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 11286b6e453a1..6a5734a591024 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 21340cf60f9b9..4d54c20885721 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 96958af47e9eb..07fb03fc1dfb5 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 2e038b0b4f076..741c6454818d0 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index aeef4d14be70b..7c330dfcd2ecb 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index ad3f912e30ba8..9f80b84162264 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index 4b91e9d44176a..31a11cc8b570d 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 81fd7b1d386ea..c4fe5de6f8813 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 26ff8eb125c38..507efef4c33fc 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 398771a54e6eb..9de2544ada759 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index 8339f1657ea66..3c1d11c315a2f 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 67ea2e26e2732..9f2daaf952d3b 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index cbf7d1e0325c6..6698483b04855 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 2b9bf0f8a94c8..2d1b1c4829cdf 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 6fb35919dcbb7..3e7061f677932 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 6fccd11ffda47..dfbe39ed26008 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 22a52c912f52a..1c82c1fb5fab6 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 4061b2105608c..96abbad087170 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 94b036a30f18d..7e64d4df30fde 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 5b89ab28fc2de..2cc69fe03cf35 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 7627255900a2c..f5ddcbbdec00f 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index b03df41ad2bd0..0d015da9e8c91 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 4ecb54c33c025..c4d3ed200cb01 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 673d2bb6967b2..523d9999543fa 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index fa6b4d00e19d3..75effaccc574a 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index f686d368ed6e2..1e6a0aabed154 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 9be381985de48..4c8aae94e6133 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index ec4eee272f424..490c848990154 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 8f4665c8344a8..ae97799bc3aba 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 462ee376ae04d..faf11f193c183 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index efacc5115aead..342491854dedd 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 52c0b338efc78..55361e2a7237b 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 935ba90bb1416..1080ee46832bc 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 0bc1f725c5e35..bcb12e8d0cfa7 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 0f604c0b5d5af..3cc6dfa8ac1e9 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 77f52b193a9e4..6070497ba89f5 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index f5ec57b43def9..bfed07e3aee98 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index aa4b39ab8955f..5fb1689a44c0e 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index be90ae8a969f3..37268e7c5d084 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 9c26e99f4e3ac..dcf3b3e7304fa 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 28bc7f0f7e5c5..573c06ab10754 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 9617cb297fbbd..8da691192d30c 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index a8763cbf46030..32592b9530781 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index ed25b3fc9e73e..4b103166e9861 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 4424874cd02a6..0ae891156019a 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 5b673495bc8ae..400fabf3a166e 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 9884b2d1ce6dd..997ed2a4ff707 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 43f7f939640c6..a658f1ba95d35 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index d9a4e5f49d6fd..bd4c4f5703aa1 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index ea4cf0b64ae9e..43361f2463328 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index f5795800ff1fe..6ce92b6cf411a 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index bca4b029bd2d8..058ca848fa53a 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 878b30b25aae9..afabf5111ee83 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 35787edd06aa5..5e76afeaeafac 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index f50cb79d2e939..bb3b7effbf9c8 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index d5c4844146ddf..1b00907123e87 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index d643ac3730a45..aaa49e0082044 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index bd27c66bec82d..4cae17904f628 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index cb6953a271a92..d0f5305b3a0e3 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 82c14e1e5f4f5..2d7045010a304 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 4700851eda938..0ca47d74e2d82 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 47d635c6aedab..3c3351144621d 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 1ac01342d945d..f309286b16a73 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 62a4db0f57045..4bb82443adc55 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 3bee76770978d..e5ff02b811d69 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index d6d6eb0d2b608..38badc96b8e15 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index 6743c0370d028..e7642c35ca433 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index b82e0ad2249df..914449bc2a88a 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index d46cb4f512a15..52ef3c3592ba5 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index f6bf13ff3deea..0474b58e8bf76 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 2c280356ae080..40eef9e7e6769 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index cba88a3bc13b3..fddc72556aa1d 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index f47914382acfc..d6a56bb022bb8 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index a9ada0e17b0bc..d223d7704040f 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index b288e58eac4ca..34a962b8ecb3a 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 09eb7da739fd2..f1dc1b7bdca18 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index c39e05952056e..713cb9f1bc23d 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index edb04f116aedb..2e7305429d011 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index 5a0e6f853368a..f17a5d8e7f7d4 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index cefea5217586b..909854dc37fb6 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index cbb8e21ada263..9c97e78796c88 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index f66ce28c9d6f6..516e98c6ed266 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 6cdc1785c8984..d723cb532045d 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 32a43d0fb7092..4af82c552186c 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index 3cfe536931253..2a496ddbfa6d9 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index a0ef1f4ffc40c..f64585581fb59 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index eaaee1a53d074..572f4d38cd2b1 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 9f6a46ac3272d..531a7d9f3f299 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 4209b964ab11d..9d0d9644a0539 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 6e5c89a25a3cb..7e01852d0d379 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 4cb600291c5fb..153170ae15de1 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index f11108590ac7d..b8cbca02207f7 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 5099ea7eb0413..6c562a0c1b9a3 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 4f82466404486..b973f23ecc14e 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 8f2c2bcb8f442..282504963c042 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index a889d2a241ffb..a658d88790f29 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 91a3eecc08f45..95919e349f2e8 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index c3f6006e3fcad..5100c90c43a4d 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 5ca83bdf1a6ec..74dd99c686fe5 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index cddcb821d229e..86cbfe71989d6 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 990674c0960cc..48c59ca0bc025 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 90f571914c374..bb1e9dd0ff611 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index fe5a4f694bb40..a6f1a9ca28495 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.devdocs.json b/api_docs/kbn_ui_shared_deps_src.devdocs.json index cdcc1a191f022..d80ea1cd158c8 100644 --- a/api_docs/kbn_ui_shared_deps_src.devdocs.json +++ b/api_docs/kbn_ui_shared_deps_src.devdocs.json @@ -342,6 +342,17 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/ui-shared-deps-src", + "id": "def-common.externals.fastestlevenshtein", + "type": "string", + "tags": [], + "label": "'fastest-levenshtein'", + "description": [], + "path": "packages/kbn-ui-shared-deps-src/src/definitions.js", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/ui-shared-deps-src", "id": "def-common.externals.rxjs", diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 5de7a71863db8..d35d8cab4a032 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 56 | 0 | 47 | 0 | +| 57 | 0 | 48 | 0 | ## Common diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index b2aeefbd8b4ca..f110f52a44591 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 23f6481b3b6ba..0ba9e177c6af7 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 0ec1e020d9a49..d285fd99e8b66 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 5d9f33596721d..1c7b53d1945d5 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index ea1be4f0240a8..a4afc63d92d45 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index c9d96e19e8089..ec0570e3e2d31 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index ed43dfa3580b3..e19ce298d1d99 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index da98e9e683b05..6a2ef5267d5d6 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 0d23d9d6e3ddb..2be5b84d99b5d 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index c154ac78aff31..e21d08b1df36e 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 2760fb6498ffc..610b0552aaec8 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 2ffdc37c2f362..fdb610951ae99 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 6d48065cf5a6f..f15b60025e25c 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index bc8ac20863181..7d775c092d435 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index e20d7586b7661..f7c3bbfd7710d 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index e2b68abc0a324..d1ab58512efea 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index b211d3d85375e..9d52f95b68f65 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index edfac50200b65..2edf16ed37065 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 6879db37872f5..05bcd7119c127 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index cb0b3d58dda46..87a253ec3a36c 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 2f8b8605a7eb7..dfed4b921904a 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 5bc44e9854e70..5287fcc22423c 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 9ecd9d9bd5811..c63e0fec1868a 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index ca13a48f61e32..805961d08f569 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index 41ee754c5045d..ef7ea92166ec3 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 5e1b2229e8f72..2ffa82c931dd4 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index b09764d682764..b9cdbfba6e59b 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 586cf3c3419fe..a1f93ab35aae0 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index b5d4e58649f4a..d753ec97f3141 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index e58e039bb493f..88e95befdc61e 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index b3620ad031132..46d7c7405c2a7 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index e292b96e8f128..cea152f5e2b51 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index b852e1b255fbb..0b09dfea10e80 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index ea10715eade14..b2807f2a051a2 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index 3fcc0874fadf1..4909a1e634bc6 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 9ffc042d9afaf..fcba5a7a72a94 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index f9ea2f7a9b8ce..cb0a3d4ca3335 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index ddb54acf97fb0..ef2ba553deac4 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 1a23a284aa163..c0696a43adf04 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index dc1108ff5804e..2dd0b5b8da8e3 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index fa70830dd135c..c8b506954ee61 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 10d70f8c5ce85..18ae21442cfea 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 3a47267ac6556..94f0747e06a39 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 5c81008f885a3..a5734f975170e 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 6f2e347af77e6..80f7c77827d38 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 1c041f0f374c6..6c61de8b5b015 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 9b4fb87da6834..7492afaa416fd 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index d07ee8fefae24..6d3111a0ac489 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 8ddb05533db16..a566d206689c1 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index cd29c113f0837..1617fdc10a4c9 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index a9e589fb817c9..37f80c7e739e9 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 49918 | 239 | 38033 | 1897 | +| 49923 | 239 | 38040 | 1897 | ## Plugin Directory @@ -74,7 +74,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Entity manager plugin for entity assets (inventory, topology, etc) | 8 | 0 | 8 | 1 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Entity manager plugin for entity assets (inventory, topology, etc) | 14 | 0 | 14 | 1 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 99 | 3 | 97 | 3 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 10 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 2 | 0 | 2 | 0 | @@ -102,7 +102,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 84 | 0 | 84 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 3 | 0 | 3 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1348 | 5 | 1226 | 72 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1349 | 5 | 1227 | 72 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -120,7 +120,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 127 | 2 | 100 | 4 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Plugin implementing the Integration Assistant API and UI | 47 | 0 | 40 | 3 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides UI and APIs for the interactive setup mode. | 28 | 0 | 18 | 0 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 95 | 0 | 95 | 4 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 95 | 0 | 95 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 153 | 0 | 121 | 3 | | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -178,7 +178,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 18 | 0 | 10 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 10 | 0 | 6 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 8 | 0 | 8 | 1 | -| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 18 | 0 | 10 | 1 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 15 | 0 | 9 | 1 | | searchprofiler | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 438 | 0 | 222 | 1 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 191 | 0 | 121 | 37 | @@ -733,7 +733,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 39 | 0 | 25 | 1 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 86 | 0 | 86 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 0 | 28 | 0 | -| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 56 | 0 | 47 | 0 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 57 | 0 | 48 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 8 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 153 | 0 | 81 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 044039be72e2f..6020b7134ac6b 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 8a4f3cf4f1d1e..b44845d2bccf5 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 66b8099faa64b..af1b22b1f5a80 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 2d1fb75fa9ebc..bc8b55f94b14b 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 1332a6bbe1307..4c345e18a0347 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index aaf34bf8ec7ca..fc5f161857818 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index a85cd6355abed..a5cab8c2c7904 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 3c0bac39f60e8..d0778caa91448 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 469dd74c89171..fc469b1bdf9f4 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 46bf950d7cc7c..b4fcaecdbef71 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 27f188c099000..6ab7e6becdfb1 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index c59950e900de1..04f035cbea41b 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 4511c56481e6b..c4aba5bd77306 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index a4e7160e19728..492ce4fcb5e10 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index bfcdcd6c94b37..ee3b581ca164c 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 68ce1ae4d6022..2b108c8375985 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index d338a09e37e07..e5be4f65b96d0 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 379fd5ffceb98..0f622d71afe27 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index e4cd144d11b56..7fe0ca94d99a0 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 2e7befc9dd365..80170001eb1ad 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 3047177c85e7e..67d86174c1e37 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.devdocs.json b/api_docs/search_playground.devdocs.json index 0306aa3c5780a..9acc1abcd944f 100644 --- a/api_docs/search_playground.devdocs.json +++ b/api_docs/search_playground.devdocs.json @@ -40,9 +40,7 @@ "label": "PlaygroundProvider", "description": [], "signature": [ - "React.FunctionComponent<", - "PlaygroundProviderProps", - " & { children?: React.ReactNode; }>" + "React.FunctionComponent<{ children?: React.ReactNode; }>" ], "path": "x-pack/plugins/search_playground/public/types.ts", "deprecated": false, @@ -79,51 +77,6 @@ } ] }, - { - "parentPluginId": "searchPlayground", - "id": "def-public.SearchPlaygroundPluginStart.PlaygroundToolbar", - "type": "Function", - "tags": [], - "label": "PlaygroundToolbar", - "description": [], - "signature": [ - "React.FunctionComponent<{ children?: React.ReactNode; }>" - ], - "path": "x-pack/plugins/search_playground/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "searchPlayground", - "id": "def-public.SearchPlaygroundPluginStart.PlaygroundToolbar.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "P & { children?: React.ReactNode; }" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "searchPlayground", - "id": "def-public.SearchPlaygroundPluginStart.PlaygroundToolbar.$2", - "type": "Any", - "tags": [], - "label": "context", - "description": [], - "signature": [ - "any" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, { "parentPluginId": "searchPlayground", "id": "def-public.SearchPlaygroundPluginStart.Playground", @@ -132,7 +85,9 @@ "label": "Playground", "description": [], "signature": [ - "React.FunctionComponent<{ children?: React.ReactNode; }>" + "React.FunctionComponent<", + "AppProps", + " & { children?: React.ReactNode; }>" ], "path": "x-pack/plugins/search_playground/public/types.ts", "deprecated": false, diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index c75eeb689a0d5..193273e6d614e 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-ki | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 18 | 0 | 10 | 1 | +| 15 | 0 | 9 | 1 | ## Client diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 6fe96f7524444..ee72de420f716 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index b7b2be2be7482..b83ae20ff02b2 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index ebb118cace66d..de3bb64f52ced 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 9553b08dccff1..3242828d62e87 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 57a0aa2229dee..a0de5bcc4cf91 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index bff2ac08d57f2..e64f97973a9dc 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 7b7a7522bea8c..09f2c7edcf5da 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index c9f4cec316f79..f7b44f92491a4 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 1ff559bbbd72b..264403c94db1f 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index e70711708aece..f2cb7a913790a 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 145d3e958e819..530b22186bb50 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index ed9a8c5947272..a475fdea0ff3c 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 1293d7b86b30b..49ee40840fb95 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 087f7d8ac7cca..9ef3fb6e5248e 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 79ed70ae22e34..bcf328cc6ca79 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index a4b2e92dba152..af4a57ecedc3b 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 05150e6ac611e..4b678c60a7a40 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 0db1faf7d8cb4..38b3f69b9ca09 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 0e37f1419e164..cfbad9700d4d9 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index bccc09ec31398..5d3ce3746744c 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 42ae21461db92..638e5226e0a35 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 7570d1d8f7839..16ce978528dd6 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index d461dc87124a5..e041317a6070c 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 5fd2c4e8ccc02..c090c5755ab42 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index fce6bfd75d250..c68df9b322654 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 4fe43ee8c187e..95c4364f43a22 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 079600b222919..4f4a60ac31a60 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index d0be2830ce3ba..47438fb7a9b30 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 85e0450ad4b93..c0d5599e462e5 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index ff2be9d4589ca..d7c9168a273e7 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 411863237c373..e36131ead0d63 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 826632b661f6e..5a83dde70882d 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 2590939f79170..c1a224812e6f9 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index ed8c293707c3a..e66d2e7f0cf1b 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 82e9d4bb26494..ba1bfdeb89f5e 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index ef2b0c3150811..cec157b72cc1d 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 6fde86032473e..9478bfc37db41 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 05412076e4ccd..8d3505f45293d 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index f39474618a083..5fcdd9938c1be 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 9263d0a13bed5..bc6b238b14e3d 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index fcff5b44cd7b4..617429675c83a 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index f128139595729..aff385709f8b3 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 959b152aca56a..8165741192e1c 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index f45a58c6bfa54..d7212a6bd8a8f 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-07-10 +date: 2024-07-11 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 2958be7303f40cc055a983760a5a9f45b42386fe Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Thu, 11 Jul 2024 08:26:49 +0200 Subject: [PATCH 61/82] [Security Solution][Notes] - fix notes management page search crash (#187934) --- .../public/notes/components/search_row.tsx | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/security_solution/public/notes/components/search_row.tsx b/x-pack/plugins/security_solution/public/notes/components/search_row.tsx index 1e88a47b2e2d2..f2e86d324a54a 100644 --- a/x-pack/plugins/security_solution/public/notes/components/search_row.tsx +++ b/x-pack/plugins/security_solution/public/notes/components/search_row.tsx @@ -7,9 +7,9 @@ import { EuiFlexGroup, EuiFlexItem, EuiSearchBar } from '@elastic/eui'; import React, { useMemo, useCallback } from 'react'; -import { useDispatch, useSelector } from 'react-redux'; +import { useDispatch } from 'react-redux'; import styled from 'styled-components'; -import { userSearchedNotes, selectNotesTableSearch } from '..'; +import { userSearchedNotes } from '..'; const SearchRowContainer = styled.div` &:not(:last-child) { @@ -36,8 +36,6 @@ export const SearchRow = React.memo(() => { [] ); - const notesSearch = useSelector(selectNotesTableSearch); - const onQueryChange = useCallback( ({ queryText }) => { dispatch(userSearchedNotes(queryText.trim())); @@ -49,12 +47,7 @@ export const SearchRow = React.memo(() => { - + From cc7588c8cb9cc428e97df6b057a898fa7ceb5383 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Thu, 11 Jul 2024 08:27:30 +0200 Subject: [PATCH 62/82] [Security Solution][Alert details] - do not show Notes tab for Rule creation preview alerts (#187966) --- .../public/flyout/document_details/left/index.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx index 8facaef0885ca..f4a89cbc2b7bc 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/left/index.tsx @@ -32,7 +32,7 @@ export const LeftPanelNotesTab: LeftPanelPaths = 'notes'; export const LeftPanel: FC> = memo(({ path }) => { const { telemetry } = useKibana().services; const { openLeftPanel } = useExpandableFlyoutApi(); - const { eventId, indexName, scopeId, getFieldsData } = useDocumentDetailsContext(); + const { eventId, indexName, scopeId, getFieldsData, isPreview } = useDocumentDetailsContext(); const eventKind = getField(getFieldsData('event.kind')); const securitySolutionNotesEnabled = useIsExperimentalFeatureEnabled( 'securitySolutionNotesEnabled' @@ -43,11 +43,11 @@ export const LeftPanel: FC> = memo(({ path }) => { eventKind === EventKind.signal ? [tabs.insightsTab, tabs.investigationTab, tabs.responseTab] : [tabs.insightsTab]; - if (securitySolutionNotesEnabled) { + if (securitySolutionNotesEnabled && !isPreview) { tabList.push(tabs.notesTab); } return tabList; - }, [eventKind, securitySolutionNotesEnabled]); + }, [eventKind, isPreview, securitySolutionNotesEnabled]); const selectedTabId = useMemo(() => { const defaultTab = tabsDisplayed[0].id; From 27dc08bcc400a495622b21deb79fbf62c1a10d55 Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Thu, 11 Jul 2024 01:56:56 -0500 Subject: [PATCH 63/82] [ES|QL] Automatically encapsulate index names with special chars with quotes (#187899) ## Summary Addresses https://github.com/elastic/kibana/issues/186411. This PR introduces quoted index names when auto populated/suggested if the index name contains special characters. https://github.com/elastic/kibana/assets/43350163/94a37a82-9921-4419-b7d4-c8c50cc509f3 If user is already prefixing index name with a quote, e.g. `from "a` it will suggest as normal. ### Checklis Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- .../src/autocomplete/autocomplete.test.ts | 32 +++++++++---- .../src/autocomplete/autocomplete.ts | 14 +++++- .../src/autocomplete/factories.ts | 11 ++++- .../src/autocomplete/helper.ts | 11 ++++- .../src/shared/helpers.test.ts | 48 +++++++++++++++++++ .../src/shared/helpers.ts | 4 ++ packages/kbn-monaco/src/esql/language.ts | 2 + 7 files changed, 107 insertions(+), 15 deletions(-) create mode 100644 packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts index 57e66a825c37c..2f87d392a702e 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.test.ts @@ -53,15 +53,27 @@ const fields: Array<{ name: string; type: string; suggestedAs?: string }> = [ ]; const indexes = ([] as Array<{ name: string; hidden: boolean; suggestedAs?: string }>).concat( - ['a', 'index', 'otherIndex', '.secretIndex', 'my-index'].map((name) => ({ + [ + 'a', + 'index', + 'otherIndex', + '.secretIndex', + 'my-index', + 'my-index$', + 'my_index{}', + 'my-index+1', + 'synthetics-*', + ].map((name) => ({ name, hidden: name.startsWith('.'), })), - ['my-index[quoted]', 'my-index$', 'my_index{}'].map((name) => ({ - name, - hidden: false, - suggestedAs: `\`${name}\``, - })) + ['my-index[quoted]', 'my:index', 'my,index', 'logstash-{now/d{yyyy.MM.dd|+12:00}}'].map( + (name) => ({ + name, + hidden: false, + suggestedAs: `"${name}"`, + }) + ) ); const integrations: Integration[] = ['nginx', 'k8s'].map((name) => ({ @@ -365,8 +377,9 @@ describe('autocomplete', () => { }); describe('from', () => { - const suggestedIndexes = indexes.filter(({ hidden }) => !hidden).map(({ name }) => name); - + const suggestedIndexes = indexes + .filter(({ hidden }) => !hidden) + .map(({ name, suggestedAs }) => suggestedAs || name); // Monaco will filter further down here testSuggestions( 'f', @@ -394,8 +407,7 @@ describe('autocomplete', () => { const dataSources = indexes.concat(integrations); const suggestedDataSources = dataSources .filter(({ hidden }) => !hidden) - .map(({ name }) => name); - + .map(({ name, suggestedAs }) => suggestedAs || name); testSuggestions('from ', suggestedDataSources, '', [undefined, dataSources, undefined]); testSuggestions('from a,', suggestedDataSources, '', [undefined, dataSources, undefined]); testSuggestions('from *,', suggestedDataSources, '', [undefined, dataSources, undefined]); diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts index add47e4a5547b..03504552370b6 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/autocomplete.ts @@ -86,6 +86,7 @@ import { getQueryForFields, getSourcesFromCommands, isAggFunctionUsedAlready, + removeQuoteForSuggestedSources, } from './helper'; import { FunctionParameter } from '../definitions/types'; @@ -857,19 +858,28 @@ async function getExpressionSuggestionsByType( suggestions.push(...(policies.length ? policies : [buildNoPoliciesAvailableDefinition()])); } else { const index = getSourcesFromCommands(commands, 'index'); + const canRemoveQuote = isNewExpression && innerText.includes('"'); + // This is going to be empty for simple indices, and not empty for integrations if (index && index.text && index.text !== EDITOR_MARKER) { const source = index.text.replace(EDITOR_MARKER, ''); const dataSource = await getDatastreamsForIntegration(source); + const newDefinitions = buildSourcesDefinitions( dataSource?.dataStreams?.map(({ name }) => ({ name, isIntegration: false })) || [] ); - suggestions.push(...newDefinitions); + suggestions.push( + ...(canRemoveQuote ? removeQuoteForSuggestedSources(newDefinitions) : newDefinitions) + ); } else { // FROM // @TODO: filter down the suggestions here based on other existing sources defined const sourcesDefinitions = await getSources(); - suggestions.push(...sourcesDefinitions); + suggestions.push( + ...(canRemoveQuote + ? removeQuoteForSuggestedSources(sourcesDefinitions) + : sourcesDefinitions) + ); } } } diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts index a5f21d426c5fc..df1da9d092d73 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/factories.ts @@ -19,7 +19,7 @@ import { CommandOptionsDefinition, CommandModeDefinition, } from '../definitions/types'; -import { getCommandDefinition, shouldBeQuotedText } from '../shared/helpers'; +import { shouldBeQuotedSource, getCommandDefinition, shouldBeQuotedText } from '../shared/helpers'; import { buildDocumentation, buildFunctionDocumentation } from './documentation_util'; import { DOUBLE_BACKTICK, SINGLE_TICK_REGEX } from '../shared/constants'; @@ -37,6 +37,13 @@ function getSafeInsertText(text: string, options: { dashSupported?: boolean } = ? `\`${text.replace(SINGLE_TICK_REGEX, DOUBLE_BACKTICK)}\`` : text; } +export function getQuotedText(text: string) { + return text.startsWith(`"`) && text.endsWith(`"`) ? text : `"${text}"`; +} + +function getSafeInsertSourceText(text: string) { + return shouldBeQuotedSource(text) ? getQuotedText(text) : text; +} export function getSuggestionFunctionDefinition(fn: FunctionDefinition): SuggestionRawDefinition { const fullSignatures = getFunctionSignatures(fn); @@ -148,7 +155,7 @@ export const buildSourcesDefinitions = ( ): SuggestionRawDefinition[] => sources.map(({ name, isIntegration, title }) => ({ label: title ?? name, - text: name, + text: getSafeInsertSourceText(name), isSnippet: isIntegration, ...(isIntegration && { command: TRIGGER_SUGGESTION_COMMAND }), kind: isIntegration ? 'Class' : 'Issue', diff --git a/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts index fa6e364c78ca9..f9586670b29e6 100644 --- a/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts +++ b/packages/kbn-esql-validation-autocomplete/src/autocomplete/helper.ts @@ -7,8 +7,9 @@ */ import type { ESQLAstItem, ESQLCommand, ESQLFunction, ESQLSource } from '@kbn/esql-ast'; -import { FunctionDefinition } from '../definitions/types'; +import type { FunctionDefinition } from '../definitions/types'; import { getFunctionDefinition, isAssignment, isFunctionItem } from '../shared/helpers'; +import type { SuggestionRawDefinition } from './types'; function extractFunctionArgs(args: ESQLAstItem[]): ESQLFunction[] { return args.flatMap((arg) => (isAssignment(arg) ? arg.args[1] : arg)).filter(isFunctionItem); @@ -71,3 +72,11 @@ export function getSourcesFromCommands(commands: ESQLCommand[], sourceType: 'ind return sources.length === 1 ? sources[0] : undefined; } + +export function removeQuoteForSuggestedSources(suggestions: SuggestionRawDefinition[]) { + return suggestions.map((d) => ({ + ...d, + // "text" -> text + text: d.text.startsWith('"') && d.text.endsWith('"') ? d.text.slice(1, -1) : d.text, + })); +} diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts new file mode 100644 index 0000000000000..87eb31de4d3c9 --- /dev/null +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.test.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { shouldBeQuotedSource } from './helpers'; + +describe('shouldBeQuotedSource', () => { + it('does not have to be quoted for sources with acceptable characters @-+$', () => { + expect(shouldBeQuotedSource('foo')).toBe(false); + expect(shouldBeQuotedSource('123-test@foo_bar+baz1')).toBe(false); + expect(shouldBeQuotedSource('my-index*')).toBe(false); + expect(shouldBeQuotedSource('my-index$')).toBe(false); + expect(shouldBeQuotedSource('.my-index$')).toBe(false); + }); + it(`should be quoted if containing any of special characters [:"=|,[\]/ \t\r\n]`, () => { + expect(shouldBeQuotedSource('foo\ttest')).toBe(true); + expect(shouldBeQuotedSource('foo\rtest')).toBe(true); + expect(shouldBeQuotedSource('foo\ntest')).toBe(true); + expect(shouldBeQuotedSource('foo:test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo|test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo[test]=bar')).toBe(true); + expect(shouldBeQuotedSource('foo/test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo test=bar')).toBe(true); + expect(shouldBeQuotedSource('foo,test-*,abc')).toBe(true); + expect(shouldBeQuotedSource('foo, test-*, abc, xyz')).toBe(true); + expect(shouldBeQuotedSource('foo, test-*, abc, xyz,test123')).toBe(true); + expect(shouldBeQuotedSource('foo,test,xyz')).toBe(true); + expect( + shouldBeQuotedSource(',') + ).toBe(true); + expect(shouldBeQuotedSource('`backtick`,``multiple`back``ticks```')).toBe(true); + expect(shouldBeQuotedSource('test,metadata,metaata,.metadata')).toBe(true); + expect(shouldBeQuotedSource('cluster:index')).toBe(true); + expect(shouldBeQuotedSource('cluster:index|pattern')).toBe(true); + expect(shouldBeQuotedSource('cluster:.index')).toBe(true); + expect(shouldBeQuotedSource('cluster*:index*')).toBe(true); + expect(shouldBeQuotedSource('cluster*:*')).toBe(true); + expect(shouldBeQuotedSource('*:index*')).toBe(true); + expect(shouldBeQuotedSource('*:index|pattern')).toBe(true); + expect(shouldBeQuotedSource('*:*')).toBe(true); + expect(shouldBeQuotedSource('*:*,cluster*:index|pattern,i|p')).toBe(true); + expect(shouldBeQuotedSource('index-[dd-mm]')).toBe(true); + }); +}); diff --git a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts index 6f2da35031997..9bdb1f4e416a1 100644 --- a/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts +++ b/packages/kbn-esql-validation-autocomplete/src/shared/helpers.ts @@ -563,6 +563,10 @@ export function isRestartingExpression(text: string) { return getLastCharFromTrimmed(text) === ','; } +export function shouldBeQuotedSource(text: string) { + // Based on lexer `fragment UNQUOTED_SOURCE_PART` + return /[:"=|,[\]\/ \t\r\n]/.test(text); +} export function shouldBeQuotedText( text: string, { dashSupported }: { dashSupported?: boolean } = {} diff --git a/packages/kbn-monaco/src/esql/language.ts b/packages/kbn-monaco/src/esql/language.ts index 4e486a5c24188..7c49da41a996e 100644 --- a/packages/kbn-monaco/src/esql/language.ts +++ b/packages/kbn-monaco/src/esql/language.ts @@ -39,11 +39,13 @@ export const ESQLLang: CustomLangModuleType = { { open: '(', close: ')' }, { open: '[', close: ']' }, { open: `'`, close: `'` }, + { open: '"""', close: '"""' }, { open: '"', close: '"' }, ], surroundingPairs: [ { open: '(', close: ')' }, { open: `'`, close: `'` }, + { open: '"""', close: '"""' }, { open: '"', close: '"' }, ], }, From b11e9eeb6d8fd7579d95b2515ab0eb2d64523504 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Thu, 11 Jul 2024 02:40:41 -0500 Subject: [PATCH 64/82] [Search] Notebooks Telemetry (#188007) ## Summary Added telemetry tracking with usageCollection for opening notebooks view, viewing a specific notebook and errors fetching notebooks. ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) --- x-pack/plugins/search_notebooks/kibana.jsonc | 4 +- .../public/components/notebooks_view.tsx | 29 +++++--- .../public/components/search_notebook.tsx | 37 +++------- .../components/search_notebook_error.tsx | 67 +++++++++++++++++++ .../search_notebooks/public/console_view.tsx | 4 +- .../public/hooks/use_kibana.ts | 3 +- .../public/hooks/use_usage_tracker.ts | 15 +++++ .../plugins/search_notebooks/public/plugin.ts | 5 ++ .../plugins/search_notebooks/public/types.ts | 8 +++ .../public/utils/get_error_message.ts | 4 +- .../public/utils/usage_tracker.ts | 33 +++++++++ x-pack/plugins/search_notebooks/tsconfig.json | 2 + 12 files changed, 169 insertions(+), 42 deletions(-) create mode 100644 x-pack/plugins/search_notebooks/public/components/search_notebook_error.tsx create mode 100644 x-pack/plugins/search_notebooks/public/hooks/use_usage_tracker.ts create mode 100644 x-pack/plugins/search_notebooks/public/utils/usage_tracker.ts diff --git a/x-pack/plugins/search_notebooks/kibana.jsonc b/x-pack/plugins/search_notebooks/kibana.jsonc index d702cfb020275..e9432a5559ce9 100644 --- a/x-pack/plugins/search_notebooks/kibana.jsonc +++ b/x-pack/plugins/search_notebooks/kibana.jsonc @@ -15,7 +15,9 @@ "requiredPlugins": [ "console" ], - "optionalPlugins": [], + "optionalPlugins": [ + "usageCollection" + ], "requiredBundles": [ "kibanaReact" ] diff --git a/x-pack/plugins/search_notebooks/public/components/notebooks_view.tsx b/x-pack/plugins/search_notebooks/public/components/notebooks_view.tsx index a20c3b9ddaf2d..b6c837f70ba37 100644 --- a/x-pack/plugins/search_notebooks/public/components/notebooks_view.tsx +++ b/x-pack/plugins/search_notebooks/public/components/notebooks_view.tsx @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + import React from 'react'; import { CoreStart } from '@kbn/core/public'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -11,24 +12,32 @@ import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { SearchNotebooks } from './search_notebooks'; -import { NotebookListValue } from '../types'; +import { AppMetricsTracker, NotebookListValue } from '../types'; export interface SearchNotebooksViewProps { core: CoreStart; queryClient: QueryClient; + usageTracker: AppMetricsTracker; getNotebookList: () => NotebookListValue; } export const SearchNotebooksView = ({ core, queryClient, + usageTracker, getNotebookList, -}: SearchNotebooksViewProps) => ( - - - - - - - -); +}: SearchNotebooksViewProps) => { + React.useEffect(() => { + usageTracker.count('opened_notebooks_view'); + }, [usageTracker]); + + return ( + + + + + + + + ); +}; diff --git a/x-pack/plugins/search_notebooks/public/components/search_notebook.tsx b/x-pack/plugins/search_notebooks/public/components/search_notebook.tsx index 9c78344c15bab..e075c52c53e80 100644 --- a/x-pack/plugins/search_notebooks/public/components/search_notebook.tsx +++ b/x-pack/plugins/search_notebooks/public/components/search_notebook.tsx @@ -4,48 +4,31 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React from 'react'; -import { EuiPanel, EuiEmptyPrompt, EuiCodeBlock } from '@elastic/eui'; +import React, { useEffect } from 'react'; +import { EuiPanel } from '@elastic/eui'; import { NotebookRenderer } from '@kbn/ipynb'; -import { FormattedMessage } from '@kbn/i18n-react'; import { useNotebook } from '../hooks/use_notebook'; +import { useUsageTracker } from '../hooks/use_usage_tracker'; import { LoadingPanel } from './loading_panel'; +import { SearchNotebookError } from './search_notebook_error'; export interface SearchNotebookProps { notebookId: string; } export const SearchNotebook = ({ notebookId }: SearchNotebookProps) => { + const usageTracker = useUsageTracker(); const { data, isLoading, error } = useNotebook(notebookId); + useEffect(() => { + usageTracker.count(['view-notebook', `nb-${notebookId}`]); + }, [usageTracker, notebookId]); + if (isLoading) { return ; } if (!data || error) { return ( - - - - } - titleSize="l" - body={ - <> -

- -

- {JSON.stringify(error)} - - } - /> + ); } return ( diff --git a/x-pack/plugins/search_notebooks/public/components/search_notebook_error.tsx b/x-pack/plugins/search_notebooks/public/components/search_notebook_error.tsx new file mode 100644 index 0000000000000..87c0bf74fe941 --- /dev/null +++ b/x-pack/plugins/search_notebooks/public/components/search_notebook_error.tsx @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { EuiEmptyPrompt, EuiCodeBlock } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; +import type { AppMetricsTracker } from '../types'; +import { getErrorMessage } from '../utils/get_error_message'; + +export interface SearchNotebookErrorProps { + error: unknown; + notebookId: string; + usageTracker: AppMetricsTracker; +} + +export const SearchNotebookError = ({ + error, + notebookId, + usageTracker, +}: SearchNotebookErrorProps) => { + React.useEffect(() => { + usageTracker.count(['notebookViewError', `error-${notebookId}`]); + }, [usageTracker, notebookId]); + + return ( + + + + } + titleSize="l" + body={ + <> +

+ +

+ {error !== undefined && typeof error === 'object' ? ( + {JSON.stringify(error)} + ) : ( +

+ {getErrorMessage( + error, + i18n.translate('xpack.searchNotebooks.notebook.fetchError.unknownError', { + defaultMessage: 'Unknown error fetching notebook', + }) + )} +

+ )} + + } + /> + ); +}; diff --git a/x-pack/plugins/search_notebooks/public/console_view.tsx b/x-pack/plugins/search_notebooks/public/console_view.tsx index 99575c8e93948..0f64ed989f5e2 100644 --- a/x-pack/plugins/search_notebooks/public/console_view.tsx +++ b/x-pack/plugins/search_notebooks/public/console_view.tsx @@ -14,7 +14,7 @@ import type { import { dynamic } from '@kbn/shared-ux-utility'; import { QueryClient } from '@tanstack/react-query'; -import { NotebookListValue } from './types'; +import { NotebookListValue, AppMetricsTracker } from './types'; const SearchNotebooksButton = dynamic(async () => ({ default: (await import('./components/notebooks_button')).SearchNotebooksButton, @@ -26,6 +26,7 @@ const SearchNotebooksView = dynamic(async () => ({ export const notebooksConsoleView = ( core: CoreStart, queryClient: QueryClient, + usageTracker: AppMetricsTracker, clearNotebookList: () => void, getNotebookListValue: () => NotebookListValue ): EmbeddedConsoleView => { @@ -37,6 +38,7 @@ export const notebooksConsoleView = ( ), diff --git a/x-pack/plugins/search_notebooks/public/hooks/use_kibana.ts b/x-pack/plugins/search_notebooks/public/hooks/use_kibana.ts index b490e61f41490..fc2a5511b9336 100644 --- a/x-pack/plugins/search_notebooks/public/hooks/use_kibana.ts +++ b/x-pack/plugins/search_notebooks/public/hooks/use_kibana.ts @@ -9,13 +9,14 @@ import type { ConsolePluginStart } from '@kbn/console-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import { useKibana as useKibanaBase } from '@kbn/kibana-react-plugin/public'; -import { NotebookListValue } from '../types'; +import { NotebookListValue, AppMetricsTracker } from '../types'; export interface SearchNotebooksContext { console: ConsolePluginStart; notebooks: { getNotebookList: () => NotebookListValue; }; + usageTracker: AppMetricsTracker; } type ServerlessSearchKibanaContext = CoreStart & SearchNotebooksContext; diff --git a/x-pack/plugins/search_notebooks/public/hooks/use_usage_tracker.ts b/x-pack/plugins/search_notebooks/public/hooks/use_usage_tracker.ts new file mode 100644 index 0000000000000..52e583d6af358 --- /dev/null +++ b/x-pack/plugins/search_notebooks/public/hooks/use_usage_tracker.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibanaServices } from './use_kibana'; +import { AppMetricsTracker } from '../types'; + +export const useUsageTracker = (): AppMetricsTracker => { + const { usageTracker } = useKibanaServices(); + + return usageTracker; +}; diff --git a/x-pack/plugins/search_notebooks/public/plugin.ts b/x-pack/plugins/search_notebooks/public/plugin.ts index 3b71193ed3add..e4e1c2b4f0d00 100644 --- a/x-pack/plugins/search_notebooks/public/plugin.ts +++ b/x-pack/plugins/search_notebooks/public/plugin.ts @@ -14,14 +14,17 @@ import { SearchNotebooksPluginStart, SearchNotebooksPluginStartDependencies, NotebookListValue, + AppMetricsTracker, } from './types'; import { getErrorCode, getErrorMessage, isKibanaServerError } from './utils/get_error_message'; +import { createUsageTracker } from './utils/usage_tracker'; export class SearchNotebooksPlugin implements Plugin { private notebooksList: NotebookListValue = null; private queryClient: QueryClient | undefined; + private usageTracker: AppMetricsTracker | undefined; public setup(core: CoreSetup): SearchNotebooksPluginSetup { this.queryClient = new QueryClient({ @@ -56,11 +59,13 @@ export class SearchNotebooksPlugin core: CoreStart, deps: SearchNotebooksPluginStartDependencies ): SearchNotebooksPluginStart { + this.usageTracker = createUsageTracker(deps.usageCollection); if (deps.console?.registerEmbeddedConsoleAlternateView) { deps.console.registerEmbeddedConsoleAlternateView( notebooksConsoleView( core, this.queryClient!, + this.usageTracker, this.clearNotebookList.bind(this), this.getNotebookList.bind(this) ) diff --git a/x-pack/plugins/search_notebooks/public/types.ts b/x-pack/plugins/search_notebooks/public/types.ts index 150d08a5d463f..63955ceb85029 100644 --- a/x-pack/plugins/search_notebooks/public/types.ts +++ b/x-pack/plugins/search_notebooks/public/types.ts @@ -6,6 +6,7 @@ */ import type { ConsolePluginStart } from '@kbn/console-plugin/public'; +import type { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface SearchNotebooksPluginSetup {} @@ -16,6 +17,13 @@ export interface SearchNotebooksPluginStart { export interface SearchNotebooksPluginStartDependencies { console: ConsolePluginStart; + usageCollection?: UsageCollectionStart; } export type NotebookListValue = string | null; + +export interface AppMetricsTracker { + click: (eventName: string | string[]) => void; + count: (eventName: string | string[]) => void; + load: (eventName: string | string[]) => void; +} diff --git a/x-pack/plugins/search_notebooks/public/utils/get_error_message.ts b/x-pack/plugins/search_notebooks/public/utils/get_error_message.ts index 0a73af9e544ce..4625b2cf5240c 100644 --- a/x-pack/plugins/search_notebooks/public/utils/get_error_message.ts +++ b/x-pack/plugins/search_notebooks/public/utils/get_error_message.ts @@ -7,7 +7,7 @@ import { KibanaServerError } from '@kbn/kibana-utils-plugin/common'; -export function getErrorMessage(error: unknown): string { +export function getErrorMessage(error: unknown, defaultMessage?: string): string { if (typeof error === 'string') { return error; } @@ -19,7 +19,7 @@ export function getErrorMessage(error: unknown): string { return (error as { name: string }).name; } - return ''; + return defaultMessage ?? ''; } export function getErrorCode(error: unknown): number | undefined { diff --git a/x-pack/plugins/search_notebooks/public/utils/usage_tracker.ts b/x-pack/plugins/search_notebooks/public/utils/usage_tracker.ts new file mode 100644 index 0000000000000..9a85626c73608 --- /dev/null +++ b/x-pack/plugins/search_notebooks/public/utils/usage_tracker.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { METRIC_TYPE, UiCounterMetricType } from '@kbn/analytics'; +import type { + UsageCollectionSetup, + UsageCollectionStart, +} from '@kbn/usage-collection-plugin/public'; +import { AppMetricsTracker } from '../types'; + +const APP_TRACKER_NAME = 'searchNotebooks'; + +export function createUsageTracker( + usageCollection?: UsageCollectionSetup | UsageCollectionStart +): AppMetricsTracker { + const track = (type: UiCounterMetricType, name: string | string[]) => + usageCollection?.reportUiCounter(APP_TRACKER_NAME, type, name); + return { + click: (eventName: string | string[]) => { + track(METRIC_TYPE.CLICK, eventName); + }, + count: (eventName: string | string[]) => { + track(METRIC_TYPE.COUNT, eventName); + }, + load: (eventName: string | string[]) => { + track(METRIC_TYPE.LOADED, eventName); + }, + }; +} diff --git a/x-pack/plugins/search_notebooks/tsconfig.json b/x-pack/plugins/search_notebooks/tsconfig.json index b50ec60a5bed5..5f9d5efaa0308 100644 --- a/x-pack/plugins/search_notebooks/tsconfig.json +++ b/x-pack/plugins/search_notebooks/tsconfig.json @@ -15,6 +15,7 @@ "target/**/*" ], "kbn_references": [ + "@kbn/analytics", "@kbn/config-schema", "@kbn/core", "@kbn/i18n", @@ -26,5 +27,6 @@ "@kbn/shared-ux-utility", "@kbn/kibana-utils-plugin", "@kbn/ipynb", + "@kbn/usage-collection-plugin", ] } From 61de0b022b4a9a515c9b1da8940130a9243aaa4b Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Thu, 11 Jul 2024 10:20:17 +0200 Subject: [PATCH 65/82] [Lens] Fix multi-value formatting for metric (#187982) ## Summary Fixes #187968 It avoids the default JSON stringify behaviour around formatted values in multi-values scenarios for the new Metric chart type Screenshot 2024-07-10 at 15 28 23 Added also a couple of unit tests to spot regressions in the area. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../public/components/metric_vis.test.tsx | 55 +++++++++++++++++++ .../public/components/metric_vis.tsx | 7 ++- 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx index cd93d3997b8d5..3687113d9aee0 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.test.tsx @@ -405,6 +405,61 @@ describe('MetricVisComponent', function () { expect(tileConfig.trend).toEqual(trends[DEFAULT_TRENDLINE_NAME]); expect(tileConfig.trendShape).toEqual('area'); }); + + it('should display multi-values non-numeric values formatted and without quotes', () => { + const newTable: Datatable = { + ...table, + // change the format id for the columns + columns: table.columns.map((column) => + [basePriceColumnId, minPriceColumnId].includes(column.id) + ? { + ...column, + meta: { ...column.meta, params: { id: 'text' } }, + } + : column + ), + rows: table.rows.map((row) => ({ + ...row, + [basePriceColumnId]: [String(row[basePriceColumnId]), String(100)], + [minPriceColumnId]: [String(row[minPriceColumnId]), String(10)], + })), + }; + const component = shallow(); + + const [[visConfig]] = component.find(Metric).props().data!; + + expect(visConfig!.value).toMatchInlineSnapshot( + ` + Array [ + "text-28.984375", + "text-100", + ] + ` + ); + }); + + it('should display multi-values numeric values formatted and without quotes', () => { + const newTable = { + ...table, + rows: table.rows.map((row) => ({ + ...row, + [basePriceColumnId]: [row[basePriceColumnId], 100], + [minPriceColumnId]: [row[minPriceColumnId], 10], + })), + }; + const component = shallow(); + + const [[visConfig]] = component.find(Metric).props().data!; + + expect(visConfig!.value).toMatchInlineSnapshot( + ` + Array [ + "number-28.984375", + "number-100", + ] + ` + ); + }); }); describe('metric grid', () => { diff --git a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx index 117497d6e1e73..4ed15f5f72554 100644 --- a/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx +++ b/src/plugins/chart_expressions/expression_metric/public/components/metric_vis.tsx @@ -208,15 +208,16 @@ export const MetricVis = ({ const subtitle = breakdownByColumn ? primaryMetricColumn.name : config.metric.subtitle; if (typeof value !== 'number') { - const nonNumericMetric: MetricWText = { - value: formatPrimaryMetric(value), + const nonNumericMetricBase: Omit = { title: String(title), subtitle, icon: config.metric?.icon ? getIcon(config.metric?.icon) : undefined, extra: renderSecondaryMetric(data.columns, row, config), color: config.metric.color ?? defaultColor, }; - return nonNumericMetric; + return Array.isArray(value) + ? { ...nonNumericMetricBase, value: value.map((v) => formatPrimaryMetric(v)) } + : { ...nonNumericMetricBase, value: formatPrimaryMetric(value) }; } const baseMetric: MetricWNumber = { From 189fc763f524db771303fa9fac54ad9399c2a52b Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Thu, 11 Jul 2024 10:24:10 +0200 Subject: [PATCH 66/82] [Security Solution][Notes] - fix item per page wrong order in popover (#187967) --- .../public/notes/components/translations.ts | 7 ------- .../public/notes/pages/note_management_page.tsx | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/x-pack/plugins/security_solution/public/notes/components/translations.ts b/x-pack/plugins/security_solution/public/notes/components/translations.ts index e952e5e4ac715..f2846d6daab62 100644 --- a/x-pack/plugins/security_solution/public/notes/components/translations.ts +++ b/x-pack/plugins/security_solution/public/notes/components/translations.ts @@ -60,13 +60,6 @@ export const DELETE_SINGLE_NOTE_DESCRIPTION = i18n.translate( } ); -export const NOTES_MANAGEMENT_TITLE = i18n.translate( - 'xpack.securitySolution.notes.management.pageTitle', - { - defaultMessage: 'Notes management', - } -); - export const TABLE_ERROR = i18n.translate('xpack.securitySolution.notes.management.tableError', { defaultMessage: 'Unable to load notes', }); diff --git a/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx b/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx index 4e3f776d26027..a951968612ba7 100644 --- a/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx +++ b/x-pack/plugins/security_solution/public/notes/pages/note_management_page.tsx @@ -73,7 +73,7 @@ const columns: ( ]; }; -const pageSizeOptions = [50, 25, 10, 0]; +const pageSizeOptions = [10, 25, 50, 100]; /** * Allows user to search and delete notes. From d0d3847c7eae45077227a48a98c00ef0674ec519 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 11 Jul 2024 11:30:14 +0300 Subject: [PATCH 67/82] fix: [Obs Cases][SCREEN READER] Icons and repeated controls need unique accessible labels: 0003 (#188005) Closes: https://github.com/elastic/observability-dev/issues/3640 # Description Observability has a lot of icons that are used for controls and table row actions. These icons often have the same aria-label repeated across rows. While this meets the letter of SC 1.3.1: Info and Relationships, the repeated generic labels do not usually answer question what users are editing, or what users are deleting. We want to provide clear labels for each row to make the implicit relationships sighted users depend on, explicit for screen reader users. # What was changed?: 1. `aria-label` attribute was updated for `CasesTable` -> `ActionColumn` # Screen image --- x-pack/plugins/cases/public/common/translations.ts | 8 ++++++++ .../cases/public/components/all_cases/use_actions.tsx | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts index e83bbfd0013d1..2e11c3a64caae 100644 --- a/x-pack/plugins/cases/public/common/translations.ts +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -153,6 +153,14 @@ export const ACTIONS = i18n.translate('xpack.cases.allCases.actions', { defaultMessage: 'Actions', }); +export const ACTIONS_BUTTON_ARIA_LABEL = (title: string) => + i18n.translate('xpack.cases.allCases.actions.button.ariaLabel', { + defaultMessage: 'Actions for "{title}" column', + values: { + title, + }, + }); + export const NO_TAGS_AVAILABLE = i18n.translate('xpack.cases.allCases.noTagsAvailable', { defaultMessage: 'No tags available', }); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx index 70a163bcd69a0..4c43201b1eab4 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx @@ -174,7 +174,7 @@ const ActionColumnComponent: React.FC<{ theCase: CaseUI; disableActions: boolean Date: Thu, 11 Jul 2024 10:59:06 +0200 Subject: [PATCH 68/82] [Security Solution] Handle specific fields in `/upgrade/_review` endpoint and refactor diff logic to use Zod (#186615) Fixes: https://github.com/elastic/kibana/issues/180393 ## Summary Handles specific fields in `/upgrade/_review` endpoint upgrade workflow, as described in https://github.com/elastic/kibana/issues/180393. Achieves this with two mechanisms: 1. Removing fields from the `PrebuiltRuleAsset` schema, which excludes the field from the diff calculation completely. 2. Manually removing the diff calculation for certain fields, by excluding them from `/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts` Also, refactors a part of the codebase from its prior usage of `io-ts` schema types to use autogenerated Zod types. With this refactor, most of the `x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy` could be deleted. Unluckily some of the types manually created there are still used in some complex types elsewhere, so I added a note to that file indicating that those should be migrated to Zod, so that the legacy folder can finally be deleted. ### Checklist Delete any items that are not applicable to this PR. - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] [Flaky Test Runner](https://ci-stats.kibana.dev/trigger_flaky_test_runner/1) was used on any tests changed ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: Georgii Gorbachev --- .../rule_schema/common_attributes.gen.ts | 74 +++- .../rule_schema/common_attributes.schema.yaml | 70 +++- .../model/rule_schema/time_duration.test.ts | 135 ++++++ .../model/rule_schema/time_duration.ts | 53 +++ .../rule_schema_legacy/common_attributes.ts | 264 +----------- .../rule_schema_legacy/eql_attributes.ts | 19 - .../model/rule_schema_legacy/index.ts | 7 - .../new_terms_attributes.ts | 25 -- .../rule_schema_legacy/query_attributes.ts | 70 ---- .../rule_schema_legacy/response_actions.ts | 74 ---- .../model/rule_schema_legacy/rule_schemas.ts | 388 ------------------ .../threshold_attributes.ts | 62 --- .../api/detection_engine/model/schemas.ts | 137 +++---- .../detection_engine/prebuilt_rules/index.ts | 1 - .../model/diff/diffable_rule/build_schema.ts | 25 -- .../diffable_rule/diffable_field_types.ts | 171 ++++---- .../model/diff/diffable_rule/diffable_rule.ts | 272 +++++------- .../model/diff/rule_diff/fields_diff.ts | 8 +- .../prebuilt_rules/model/index.ts | 1 - .../components/rule_details/constants.ts | 1 - .../get_field_diffs_for_grouped_fields.ts | 13 +- .../components/rule_details/rule_diff_tab.tsx | 26 +- .../calculation/calculate_rule_fields_diff.ts | 5 - .../normalization/convert_rule_to_diffable.ts | 25 +- .../normalization/extract_rule_schedule.ts | 8 +- .../rule_assets/prebuilt_rule_asset.test.ts | 129 ++---- .../model/rule_assets/prebuilt_rule_asset.ts | 76 +++- 27 files changed, 730 insertions(+), 1409 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.test.ts create mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.ts delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/eql_attributes.ts delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/new_terms_attributes.ts delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/query_attributes.ts delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/response_actions.ts delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/rule_schemas.ts delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/threshold_attributes.ts delete mode 100644 x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/build_schema.ts diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.gen.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.gen.ts index df0084d6ff0e3..dadb6bfa4165d 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.gen.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.gen.ts @@ -304,8 +304,29 @@ export type TimestampOverrideFallbackDisabled = z.infer; export const RequiredField = z.object({ /** @@ -368,6 +389,39 @@ export const SavedObjectResolveAliasPurpose = z.enum([ export type SavedObjectResolveAliasPurposeEnum = typeof SavedObjectResolveAliasPurpose.enum; export const SavedObjectResolveAliasPurposeEnum = SavedObjectResolveAliasPurpose.enum; +/** + * Related integration is a potential dependency of a rule. It's assumed that if the user installs +one of the related integrations of a rule, the rule might start to work properly because it will +have source events (generated by this integration) potentially matching the rule's query. + +NOTE: Proper work is not guaranteed, because a related integration, if installed, can be +configured differently or generate data that is not necessarily relevant for this rule. + +Related integration is a combination of a Fleet package and (optionally) one of the +package's "integrations" that this package contains. It is represented by 3 properties: + +- `package`: name of the package (required, unique id) +- `version`: version of the package (required, semver-compatible) +- `integration`: name of the integration of this package (optional, id within the package) + +There are Fleet packages like `windows` that contain only one integration; in this case, +`integration` should be unspecified. There are also packages like `aws` and `azure` that contain +several integrations; in this case, `integration` should be specified. + +@example +const x: RelatedIntegration = { + package: 'windows', + version: '1.5.x', +}; + +@example +const x: RelatedIntegration = { + package: 'azure', + version: '~1.1.6', + integration: 'activitylogs', +}; + + */ export type RelatedIntegration = z.infer; export const RelatedIntegration = z.object({ package: NonEmptyString, @@ -378,6 +432,22 @@ export const RelatedIntegration = z.object({ export type RelatedIntegrationArray = z.infer; export const RelatedIntegrationArray = z.array(RelatedIntegration); +/** + * Schema for fields relating to investigation fields. These are user defined fields we use to highlight +in various features in the UI such as alert details flyout and exceptions auto-population from alert. +Added in PR #163235 +Right now we only have a single field but anticipate adding more related fields to store various +configuration states such as `override` - where a user might say if they want only these fields to +display, or if they want these fields + the fields we select. When expanding this field, it may look +something like: +```typescript +const investigationFields = z.object({ + field_names: NonEmptyArray(NonEmptyString), + override: z.boolean().optional(), +}); +``` + + */ export type InvestigationFields = z.infer; export const InvestigationFields = z.object({ field_names: z.array(NonEmptyString).min(1), diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.schema.yaml b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.schema.yaml index cd5e238723f6a..b2d72a561e46c 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.schema.yaml @@ -315,7 +315,28 @@ components: RequiredField: type: object - description: Describes an Elasticsearch field that is needed for the rule to function + description: | + Describes an Elasticsearch field that is needed for the rule to function. + + Almost all types of Security rules check source event documents for a match to some kind of + query or filter. If a document has certain field with certain values, then it's a match and + the rule will generate an alert. + + Required field is an event field that must be present in the source indices of a given rule. + + @example + const standardEcsField: RequiredField = { + name: 'event.action', + type: 'keyword', + ecs: true, + }; + + @example + const nonEcsField: RequiredField = { + name: 'winlog.event_data.AttributeLDAPDisplayName', + type: 'keyword', + ecs: false, + }; properties: name: $ref: '../../../model/primitives.schema.yaml#/components/schemas/NonEmptyString' @@ -376,6 +397,37 @@ components: RelatedIntegration: type: object + description: | + Related integration is a potential dependency of a rule. It's assumed that if the user installs + one of the related integrations of a rule, the rule might start to work properly because it will + have source events (generated by this integration) potentially matching the rule's query. + + NOTE: Proper work is not guaranteed, because a related integration, if installed, can be + configured differently or generate data that is not necessarily relevant for this rule. + + Related integration is a combination of a Fleet package and (optionally) one of the + package's "integrations" that this package contains. It is represented by 3 properties: + + - `package`: name of the package (required, unique id) + - `version`: version of the package (required, semver-compatible) + - `integration`: name of the integration of this package (optional, id within the package) + + There are Fleet packages like `windows` that contain only one integration; in this case, + `integration` should be unspecified. There are also packages like `aws` and `azure` that contain + several integrations; in this case, `integration` should be specified. + + @example + const x: RelatedIntegration = { + package: 'windows', + version: '1.5.x', + }; + + @example + const x: RelatedIntegration = { + package: 'azure', + version: '~1.1.6', + integration: 'activitylogs', + }; properties: package: $ref: '../../../model/primitives.schema.yaml#/components/schemas/NonEmptyString' @@ -392,10 +444,22 @@ components: items: $ref: '#/components/schemas/RelatedIntegration' - # Schema for fields relating to investigation fields, these are user defined fields we use to highlight in various features in the UI such as alert details flyout and exceptions auto-population from alert. Added in PR #163235 - # Right now we only have a single field but anticipate adding more related fields to store various configuration states such as `override` - where a user might say if they want only these fields to display, or if they want these fields + the fields we select. InvestigationFields: type: object + description: | + Schema for fields relating to investigation fields. These are user defined fields we use to highlight + in various features in the UI such as alert details flyout and exceptions auto-population from alert. + Added in PR #163235 + Right now we only have a single field but anticipate adding more related fields to store various + configuration states such as `override` - where a user might say if they want only these fields to + display, or if they want these fields + the fields we select. When expanding this field, it may look + something like: + ```typescript + const investigationFields = z.object({ + field_names: NonEmptyArray(NonEmptyString), + override: z.boolean().optional(), + }); + ``` properties: field_names: type: array diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.test.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.test.ts new file mode 100644 index 0000000000000..b455894333aee --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.test.ts @@ -0,0 +1,135 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { expectParseError, expectParseSuccess, stringifyZodError } from '@kbn/zod-helpers'; +import { TimeDuration } from './time_duration'; // Update with the actual path to your TimeDuration file + +describe('TimeDuration schema', () => { + test('it should validate a correctly formed TimeDuration with time unit of seconds', () => { + const payload = '1s'; + const schema = TimeDuration({ allowedUnits: ['s'] }); + + const result = schema.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(payload); + }); + + test('it should validate a correctly formed TimeDuration with time unit of minutes', () => { + const payload = '100m'; + const schema = TimeDuration({ allowedUnits: ['s', 'm'] }); + + const result = schema.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(payload); + }); + + test('it should validate a correctly formed TimeDuration with time unit of hours', () => { + const payload = '10000000h'; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h'] }); + + const result = schema.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(payload); + }); + + test('it should validate a correctly formed TimeDuration with time unit of days', () => { + const payload = '7d'; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h', 'd'] }); + + const result = schema.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(payload); + }); + + test('it should NOT validate a correctly formed TimeDuration with time unit of seconds if it is not an allowed unit', () => { + const payload = '30s'; + const schema = TimeDuration({ allowedUnits: ['m', 'h', 'd'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. \\"30s\\", \\"1m\\", \\"2h\\", \\"7d\\""` + ); + }); + + test('it should NOT validate a negative TimeDuration', () => { + const payload = '-10s'; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h', 'd'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. \\"30s\\", \\"1m\\", \\"2h\\", \\"7d\\""` + ); + }); + + test('it should NOT validate a fractional number', () => { + const payload = '1.5s'; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h', 'd'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. \\"30s\\", \\"1m\\", \\"2h\\", \\"7d\\""` + ); + }); + + test('it should NOT validate a TimeDuration with an invalid time unit', () => { + const payload = '10000000days'; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h', 'd'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. \\"30s\\", \\"1m\\", \\"2h\\", \\"7d\\""` + ); + }); + + test('it should NOT validate a TimeDuration with a time interval with incorrect format', () => { + const payload = '100ff0000w'; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. \\"30s\\", \\"1m\\", \\"2h\\", \\"7d\\""` + ); + }); + + test('it should NOT validate an empty string', () => { + const payload = ''; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. \\"30s\\", \\"1m\\", \\"2h\\", \\"7d\\""` + ); + }); + + test('it should NOT validate a number', () => { + const payload = 100; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Expected string, received number"` + ); + }); + + test('it should NOT validate a TimeDuration with a valid time unit but unsafe integer', () => { + const payload = `${Math.pow(2, 53)}h`; + const schema = TimeDuration({ allowedUnits: ['s', 'm', 'h'] }); + + const result = schema.safeParse(payload); + expectParseError(result); + expect(stringifyZodError(result.error)).toMatchInlineSnapshot( + `"Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. \\"30s\\", \\"1m\\", \\"2h\\", \\"7d\\""` + ); + }); +}); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.ts new file mode 100644 index 0000000000000..da5cea87f31cf --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/time_duration.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { z } from 'zod'; + +type TimeUnits = 's' | 'm' | 'h' | 'd' | 'w' | 'y'; + +interface TimeDurationType { + allowedUnits: TimeUnits[]; +} + +const isTimeSafe = (time: number) => time >= 1 && Number.isSafeInteger(time); + +/** + * Types the TimeDuration as: + * - A string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time + * - in the format {safe_integer}{timeUnit}, e.g. "30s", "1m", "2h", "7d" + * + * Example usage: + * ``` + * const schedule: RuleSchedule = { + * interval: TimeDuration({ allowedUnits: ['s', 'm', 'h'] }).parse('3h'), + * }; + * ``` + */ +export const TimeDuration = ({ allowedUnits }: TimeDurationType) => { + return z.string().refine( + (input) => { + if (input.trim() === '') return false; + + try { + const inputLength = input.length; + const time = Number(input.trim().substring(0, inputLength - 1)); + const unit = input.trim().at(-1) as TimeUnits; + + return isTimeSafe(time) && allowedUnits.includes(unit); + } catch (error) { + return false; + } + }, + { + message: + 'Invalid time duration format. Must be a string that is not empty, and composed of a positive integer greater than 0 followed by a unit of time in the format {safe_integer}{timeUnit}, e.g. "30s", "1m", "2h", "7d"', + } + ); +}; + +export type TimeDurationSchema = ReturnType; +export type TimeDuration = z.infer; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/common_attributes.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/common_attributes.ts index 310f96b7bf946..ba07c49a7b130 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/common_attributes.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/common_attributes.ts @@ -6,9 +6,24 @@ */ import * as t from 'io-ts'; -import { listArray } from '@kbn/securitysolution-io-ts-list-types'; -import { NonEmptyString, version, UUID, NonEmptyArray } from '@kbn/securitysolution-io-ts-types'; -import { max_signals, threat } from '@kbn/securitysolution-io-ts-alerting-types'; +import { NonEmptyString, UUID } from '@kbn/securitysolution-io-ts-types'; + +/* +IMPORTANT NOTE ON THIS FILE: + +This file contains the remaining rule schema types created manually via io-ts. They have been +migrated to Zod schemas created via code generation out of OpenAPI schemas +(found in x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.gen.ts) + +The remaining types here couldn't easily be deleted/replaced because they are dependencies in +complex derived schemas in two files: + +- x-pack/plugins/security_solution/common/api/detection_engine/rule_exceptions/find_exception_references/find_exception_references_route.ts +- x-pack/plugins/security_solution/common/api/timeline/model/api.ts + +Once those two files are migrated to Zod, the /common/api/detection_engine/model/rule_schema_legacy +folder can be removed. +*/ export type RuleObjectId = t.TypeOf; export const RuleObjectId = UUID; @@ -24,156 +39,6 @@ export const RuleSignatureId = t.string; // should be non-empty string? export type RuleName = t.TypeOf; export const RuleName = NonEmptyString; -export type RuleDescription = t.TypeOf; -export const RuleDescription = NonEmptyString; - -export type RuleVersion = t.TypeOf; -export const RuleVersion = version; - -export type IsRuleImmutable = t.TypeOf; -export const IsRuleImmutable = t.boolean; - -export type IsRuleEnabled = t.TypeOf; -export const IsRuleEnabled = t.boolean; - -export type RuleTagArray = t.TypeOf; -export const RuleTagArray = t.array(t.string); // should be non-empty strings? - -/** - * Note that this is a non-exact io-ts type as we allow extra meta information - * to be added to the meta object - */ -export type RuleMetadata = t.TypeOf; -export const RuleMetadata = t.UnknownRecord; // should be a more specific type? - -export type RuleLicense = t.TypeOf; -export const RuleLicense = t.string; - -export type RuleAuthorArray = t.TypeOf; -export const RuleAuthorArray = t.array(t.string); // should be non-empty strings? - -export type RuleFalsePositiveArray = t.TypeOf; -export const RuleFalsePositiveArray = t.array(t.string); // should be non-empty strings? - -export type RuleReferenceArray = t.TypeOf; -export const RuleReferenceArray = t.array(t.string); // should be non-empty strings? - -export type InvestigationGuide = t.TypeOf; -export const InvestigationGuide = t.string; - -/** - * Any instructions for the user for setting up their environment in order to start receiving - * source events for a given rule. - * - * It's a multiline text. Markdown is supported. - */ -export type SetupGuide = t.TypeOf; -export const SetupGuide = t.string; - -export type BuildingBlockType = t.TypeOf; -export const BuildingBlockType = t.string; - -export type AlertsIndex = t.TypeOf; -export const AlertsIndex = t.string; - -export type AlertsIndexNamespace = t.TypeOf; -export const AlertsIndexNamespace = t.string; - -export type ExceptionListArray = t.TypeOf; -export const ExceptionListArray = listArray; - -export type MaxSignals = t.TypeOf; -export const MaxSignals = max_signals; - -export type ThreatArray = t.TypeOf; -export const ThreatArray = t.array(threat); - -export type IndexPatternArray = t.TypeOf; -export const IndexPatternArray = t.array(t.string); - -export type DataViewId = t.TypeOf; -export const DataViewId = t.string; - -export type RuleQuery = t.TypeOf; -export const RuleQuery = t.string; - -/** - * TODO: Right now the filters is an "unknown", when it could more than likely - * become the actual ESFilter as a type. - */ -export type RuleFilterArray = t.TypeOf; // Filters are not easily type-able yet -export const RuleFilterArray = t.array(t.unknown); // Filters are not easily type-able yet - -export type RuleNameOverride = t.TypeOf; -export const RuleNameOverride = t.string; // should be non-empty string? - -export type TimestampOverride = t.TypeOf; -export const TimestampOverride = t.string; // should be non-empty string? - -export type TimestampOverrideFallbackDisabled = t.TypeOf; -export const TimestampOverrideFallbackDisabled = t.boolean; - -/** - * Almost all types of Security rules check source event documents for a match to some kind of - * query or filter. If a document has certain field with certain values, then it's a match and - * the rule will generate an alert. - * - * Required field is an event field that must be present in the source indices of a given rule. - * - * @example - * const standardEcsField: RequiredField = { - * name: 'event.action', - * type: 'keyword', - * ecs: true, - * }; - * - * @example - * const nonEcsField: RequiredField = { - * name: 'winlog.event_data.AttributeLDAPDisplayName', - * type: 'keyword', - * ecs: false, - * }; - */ -export type RequiredField = t.TypeOf; -export const RequiredField = t.exact( - t.type({ - name: NonEmptyString, - type: NonEmptyString, - ecs: t.boolean, - }) -); - -/** - * Array of event fields that must be present in the source indices of a given rule. - * - * @example - * const x: RequiredFieldArray = [ - * { - * name: 'event.action', - * type: 'keyword', - * ecs: true, - * }, - * { - * name: 'event.code', - * type: 'keyword', - * ecs: true, - * }, - * { - * name: 'winlog.event_data.AttributeLDAPDisplayName', - * type: 'keyword', - * ecs: false, - * }, - * ]; - */ -export type RequiredFieldArray = t.TypeOf; -export const RequiredFieldArray = t.array(RequiredField); - -export type TimelineTemplateId = t.TypeOf; -export const TimelineTemplateId = t.string; // should be non-empty string? - -export type TimelineTemplateTitle = t.TypeOf; -export const TimelineTemplateTitle = t.string; // should be non-empty string? - /** * Outcome is a property of the saved object resolve api * will tell us info about the rule after 8.0 migrations @@ -193,96 +58,3 @@ export const SavedObjectResolveAliasPurpose = t.union([ t.literal('savedObjectConversion'), t.literal('savedObjectImport'), ]); - -/** - * Related integration is a potential dependency of a rule. It's assumed that if the user installs - * one of the related integrations of a rule, the rule might start to work properly because it will - * have source events (generated by this integration) potentially matching the rule's query. - * - * NOTE: Proper work is not guaranteed, because a related integration, if installed, can be - * configured differently or generate data that is not necessarily relevant for this rule. - * - * Related integration is a combination of a Fleet package and (optionally) one of the - * package's "integrations" that this package contains. It is represented by 3 properties: - * - * - `package`: name of the package (required, unique id) - * - `version`: version of the package (required, semver-compatible) - * - `integration`: name of the integration of this package (optional, id within the package) - * - * There are Fleet packages like `windows` that contain only one integration; in this case, - * `integration` should be unspecified. There are also packages like `aws` and `azure` that contain - * several integrations; in this case, `integration` should be specified. - * - * @example - * const x: RelatedIntegration = { - * package: 'windows', - * version: '1.5.x', - * }; - * - * @example - * const x: RelatedIntegration = { - * package: 'azure', - * version: '~1.1.6', - * integration: 'activitylogs', - * }; - */ -export type RelatedIntegration = t.TypeOf; -export const RelatedIntegration = t.exact( - t.intersection([ - t.type({ - package: NonEmptyString, - version: NonEmptyString, - }), - t.partial({ - integration: NonEmptyString, - }), - ]) -); - -/** - * Array of related integrations. - * - * @example - * const x: RelatedIntegrationArray = [ - * { - * package: 'windows', - * version: '1.5.x', - * }, - * { - * package: 'azure', - * version: '~1.1.6', - * integration: 'activitylogs', - * }, - * ]; - */ -export type RelatedIntegrationArray = t.TypeOf; -export const RelatedIntegrationArray = t.array(RelatedIntegration); - -/** - * Schema for fields relating to investigation fields, these are user defined fields we use to highlight - * in various features in the UI such as alert details flyout and exceptions auto-population from alert. - * Added in PR #163235 - * Right now we only have a single field but anticipate adding more related fields to store various - * configuration states such as `override` - where a user might say if they want only these fields to - * display, or if they want these fields + the fields we select. When expanding this field, it may look - * something like: - * export const investigationFields = t.intersection([ - * t.exact( - * t.type({ - * field_names: NonEmptyArray(NonEmptyString), - * }) - * ), - * t.exact( - * t.partial({ - * overide: t.boolean, - * }) - * ), - * ]); - * - */ -export type InvestigationFields = t.TypeOf; -export const InvestigationFields = t.exact( - t.type({ - field_names: NonEmptyArray(NonEmptyString), - }) -); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/eql_attributes.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/eql_attributes.ts deleted file mode 100644 index 0bc029fa0d4a5..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/eql_attributes.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; - -// Attributes specific to EQL rules - -export type EventCategoryOverride = t.TypeOf; -export const EventCategoryOverride = t.string; // should be non-empty string? - -export type TimestampField = t.TypeOf; -export const TimestampField = t.string; // should be non-empty string? - -export type TiebreakerField = t.TypeOf; -export const TiebreakerField = t.string; // should be non-empty string? diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/index.ts index 6fbe808a0eb48..a112f6ca1b29f 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/index.ts @@ -6,10 +6,3 @@ */ export * from './common_attributes'; - -export * from './eql_attributes'; -export * from './new_terms_attributes'; -export * from './query_attributes'; -export * from './threshold_attributes'; - -export * from './rule_schemas'; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/new_terms_attributes.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/new_terms_attributes.ts deleted file mode 100644 index 6d9f39011b675..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/new_terms_attributes.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; -import { LimitedSizeArray, NonEmptyString } from '@kbn/securitysolution-io-ts-types'; -import { MAX_NUMBER_OF_NEW_TERMS_FIELDS } from '../../../../constants'; - -// Attributes specific to New Terms rules - -/** - * New terms rule type supports a limited number of fields. Max number of fields is 3 and defined in common constants as MAX_NUMBER_OF_NEW_TERMS_FIELDS - */ -export type NewTermsFields = t.TypeOf; -export const NewTermsFields = LimitedSizeArray({ - codec: t.string, - minSize: 1, - maxSize: MAX_NUMBER_OF_NEW_TERMS_FIELDS, -}); - -export type HistoryWindowStart = t.TypeOf; -export const HistoryWindowStart = NonEmptyString; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/query_attributes.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/query_attributes.ts deleted file mode 100644 index 8ee40e7a507d4..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/query_attributes.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; -import { - LimitedSizeArray, - PositiveIntegerGreaterThanZero, - enumeration, -} from '@kbn/securitysolution-io-ts-types'; -import { AlertSuppressionMissingFieldsStrategyEnum } from '../rule_schema/common_attributes.gen'; - -export type AlertSuppressionMissingFields = t.TypeOf; -export const AlertSuppressionMissingFields = enumeration( - 'AlertSuppressionMissingFields', - AlertSuppressionMissingFieldsStrategyEnum -); - -export const AlertSuppressionGroupBy = LimitedSizeArray({ - codec: t.string, - minSize: 1, - maxSize: 3, -}); - -export const AlertSuppressionDuration = t.type({ - value: PositiveIntegerGreaterThanZero, - unit: t.keyof({ - s: null, - m: null, - h: null, - }), -}); - -/** - * Schema for fields relating to alert suppression, which enables limiting the number of alerts per entity. - * e.g. group_by: ['host.name'] would create only one alert per value of host.name. The created alert - * contains metadata about how many other candidate alerts with the same host.name value were suppressed. - */ -export type AlertSuppression = t.TypeOf; -export const AlertSuppression = t.intersection([ - t.exact( - t.type({ - group_by: AlertSuppressionGroupBy, - }) - ), - t.exact( - t.partial({ - duration: AlertSuppressionDuration, - missing_fields_strategy: AlertSuppressionMissingFields, - }) - ), -]); - -export type AlertSuppressionCamel = t.TypeOf; -export const AlertSuppressionCamel = t.intersection([ - t.exact( - t.type({ - groupBy: AlertSuppressionGroupBy, - }) - ), - t.exact( - t.partial({ - duration: AlertSuppressionDuration, - missingFieldsStrategy: AlertSuppressionMissingFields, - }) - ), -]); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/response_actions.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/response_actions.ts deleted file mode 100644 index e4164c6d2bb04..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/response_actions.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { arrayQueries, ecsMapping } from '@kbn/osquery-io-ts-types'; -import * as t from 'io-ts'; - -// to enable using RESPONSE_ACTION_API_COMMANDS_NAMES as a type -function keyObject(arr: T): { [K in T[number]]: null } { - return Object.fromEntries(arr.map((v) => [v, null])) as never; -} - -export type EndpointParams = t.TypeOf; -export const EndpointParams = t.type({ - // TODO: TC- change these when we go GA with automated process actions - command: t.keyof(keyObject(['isolate', 'kill-process', 'suspend-process'])), - // command: t.keyof(keyObject(ENABLED_AUTOMATED_RESPONSE_ACTION_COMMANDS)), - comment: t.union([t.string, t.undefined]), -}); - -export const OsqueryParams = t.type({ - query: t.union([t.string, t.undefined]), - ecs_mapping: t.union([ecsMapping, t.undefined]), - queries: t.union([arrayQueries, t.undefined]), - pack_id: t.union([t.string, t.undefined]), - saved_query_id: t.union([t.string, t.undefined]), -}); - -export const OsqueryParamsCamelCase = t.type({ - query: t.union([t.string, t.undefined]), - ecsMapping: t.union([ecsMapping, t.undefined]), - queries: t.union([arrayQueries, t.undefined]), - packId: t.union([t.string, t.undefined]), - savedQueryId: t.union([t.string, t.undefined]), -}); - -// When we create new response action types, create a union of types -export type RuleResponseOsqueryAction = t.TypeOf; -export const RuleResponseOsqueryAction = t.strict({ - actionTypeId: t.literal('.osquery'), - params: OsqueryParamsCamelCase, -}); - -export type RuleResponseEndpointAction = t.TypeOf; -export const RuleResponseEndpointAction = t.strict({ - actionTypeId: t.literal('.endpoint'), - params: EndpointParams, -}); - -export type RuleResponseAction = t.TypeOf; -const ResponseActionRuleParam = t.union([RuleResponseOsqueryAction, RuleResponseEndpointAction]); - -export const ResponseActionRuleParamsOrUndefined = t.union([ - t.array(ResponseActionRuleParam), - t.undefined, -]); - -// When we create new response action types, create a union of types -const OsqueryResponseAction = t.strict({ - action_type_id: t.literal('.osquery'), - params: OsqueryParams, -}); - -const EndpointResponseAction = t.strict({ - action_type_id: t.literal('.endpoint'), - params: EndpointParams, -}); - -export type ResponseAction = t.TypeOf; -export const ResponseAction = t.union([OsqueryResponseAction, EndpointResponseAction]); - -export const ResponseActionArray = t.array(ResponseAction); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/rule_schemas.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/rule_schemas.ts deleted file mode 100644 index 4ec9ca19ee399..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/rule_schemas.ts +++ /dev/null @@ -1,388 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; - -import { - concurrent_searches, - items_per_search, - machine_learning_job_id, - RiskScore, - RiskScoreMapping, - RuleActionArray, - RuleActionThrottle, - RuleInterval, - RuleIntervalFrom, - RuleIntervalTo, - Severity, - SeverityMapping, - threat_filters, - threat_index, - threat_indicator_path, - threat_mapping, - threat_query, -} from '@kbn/securitysolution-io-ts-alerting-types'; -import { PositiveInteger } from '@kbn/securitysolution-io-ts-types'; -import { ResponseActionArray } from './response_actions'; - -import { anomaly_threshold, saved_id } from '../schemas'; - -import { - AlertsIndex, - AlertsIndexNamespace, - BuildingBlockType, - DataViewId, - ExceptionListArray, - IndexPatternArray, - InvestigationFields, - InvestigationGuide, - IsRuleEnabled, - MaxSignals, - RuleAuthorArray, - RuleDescription, - RuleFalsePositiveArray, - RuleFilterArray, - RuleLicense, - RuleMetadata, - RuleName, - RuleNameOverride, - RuleQuery, - RuleReferenceArray, - RuleSignatureId, - RuleTagArray, - RuleVersion, - SavedObjectResolveAliasPurpose, - SavedObjectResolveAliasTargetId, - SavedObjectResolveOutcome, - ThreatArray, - TimelineTemplateId, - TimelineTemplateTitle, - TimestampOverride, - TimestampOverrideFallbackDisabled, -} from './common_attributes'; -import { EventCategoryOverride, TiebreakerField, TimestampField } from './eql_attributes'; -import { HistoryWindowStart, NewTermsFields } from './new_terms_attributes'; -import { AlertSuppression } from './query_attributes'; -import { Threshold } from './threshold_attributes'; - -export const buildRuleSchemas = < - Required extends t.Props, - Optional extends t.Props, - Defaultable extends t.Props ->({ - required, - optional, - defaultable, -}: { - required: Required; - optional: Optional; - defaultable: Defaultable; -}) => ({ - create: t.intersection([ - t.exact(t.type(required)), - t.exact(t.partial(optional)), - t.exact(t.partial(defaultable)), - ]), - patch: t.intersection([t.partial(required), t.partial(optional), t.partial(defaultable)]), - response: t.intersection([ - t.exact(t.type(required)), - // This bit of logic is to force all fields to be accounted for in conversions from the internal - // rule schema to the response schema. Rather than use `t.partial`, which makes each field optional, - // we make each field required but possibly undefined. The result is that if a field is forgotten in - // the conversion from internal schema to response schema TS will report an error. If we just used t.partial - // instead, then optional fields can be accidentally omitted from the conversion - and any actual values - // in those fields internally will be stripped in the response. - t.exact(t.type(orUndefined(optional))), - t.exact(t.type(defaultable)), - ]), -}); - -export type OrUndefined

= { - [K in keyof P]: P[K] | t.UndefinedC; -}; - -export const orUndefined =

(props: P): OrUndefined

=> { - return Object.keys(props).reduce((acc, key) => { - acc[key] = t.union([props[key], t.undefined]); - return acc; - }, {}) as OrUndefined

; -}; - -// ------------------------------------------------------------------------------------------------- -// Base schema - -export const baseSchema = buildRuleSchemas({ - required: { - name: RuleName, - description: RuleDescription, - risk_score: RiskScore, - severity: Severity, - }, - optional: { - // Field overrides - rule_name_override: RuleNameOverride, - timestamp_override: TimestampOverride, - timestamp_override_fallback_disabled: TimestampOverrideFallbackDisabled, - // Timeline template - timeline_id: TimelineTemplateId, - timeline_title: TimelineTemplateTitle, - // Attributes related to SavedObjectsClient.resolve API - outcome: SavedObjectResolveOutcome, - alias_target_id: SavedObjectResolveAliasTargetId, - alias_purpose: SavedObjectResolveAliasPurpose, - // Misc attributes - license: RuleLicense, - note: InvestigationGuide, - building_block_type: BuildingBlockType, - output_index: AlertsIndex, - namespace: AlertsIndexNamespace, - meta: RuleMetadata, - investigation_fields: InvestigationFields, - // Throttle - throttle: RuleActionThrottle, - }, - defaultable: { - // Main attributes - version: RuleVersion, - tags: RuleTagArray, - enabled: IsRuleEnabled, - // Field overrides - risk_score_mapping: RiskScoreMapping, - severity_mapping: SeverityMapping, - // Rule schedule - interval: RuleInterval, - from: RuleIntervalFrom, - to: RuleIntervalTo, - // Rule actions - actions: RuleActionArray, - // Rule exceptions - exceptions_list: ExceptionListArray, - // Misc attributes - author: RuleAuthorArray, - false_positives: RuleFalsePositiveArray, - references: RuleReferenceArray, - // maxSignals not used in ML rules but probably should be used - max_signals: MaxSignals, - threat: ThreatArray, - }, -}); - -export type DurationMetric = t.TypeOf; -export const DurationMetric = PositiveInteger; - -export type RuleExecutionMetrics = t.TypeOf; - -/** - @property total_search_duration_ms - "total time spent performing ES searches as measured by Kibana; - includes network latency and time spent serializing/deserializing request/response", - @property total_indexing_duration_ms - "total time spent indexing documents during current rule execution cycle", - @property total_enrichment_duration_ms - total time spent enriching documents during current rule execution cycle - @property execution_gap_duration_s - "duration in seconds of execution gap" -*/ -export const RuleExecutionMetrics = t.partial({ - total_search_duration_ms: DurationMetric, - total_indexing_duration_ms: DurationMetric, - total_enrichment_duration_ms: DurationMetric, - execution_gap_duration_s: DurationMetric, -}); - -export type BaseCreateProps = t.TypeOf; -export const BaseCreateProps = baseSchema.create; - -// ------------------------------------------------------------------------------------------------- -// Shared schemas - -// "Shared" types are the same across all rule types, and built from "baseSchema" above -// with some variations for each route. These intersect with type specific schemas below -// to create the full schema for each route. - -export type SharedCreateProps = t.TypeOf; -export const SharedCreateProps = t.intersection([ - baseSchema.create, - t.exact(t.partial({ rule_id: RuleSignatureId })), -]); - -// ------------------------------------------------------------------------------------------------- -// EQL rule schema - -export type KqlQueryLanguage = t.TypeOf; -export const KqlQueryLanguage = t.keyof({ kuery: null, lucene: null }); - -export type EqlQueryLanguage = t.TypeOf; -export const EqlQueryLanguage = t.literal('eql'); - -const eqlSchema = buildRuleSchemas({ - required: { - type: t.literal('eql'), - language: EqlQueryLanguage, - query: RuleQuery, - }, - optional: { - index: IndexPatternArray, - data_view_id: DataViewId, - filters: RuleFilterArray, - timestamp_field: TimestampField, - event_category_override: EventCategoryOverride, - tiebreaker_field: TiebreakerField, - }, - defaultable: {}, -}); - -// ------------------------------------------------------------------------------------------------- -// ES|QL rule schema - -export type EsqlQueryLanguage = t.TypeOf; -export const EsqlQueryLanguage = t.literal('esql'); - -const esqlSchema = buildRuleSchemas({ - required: { - type: t.literal('esql'), - language: EsqlQueryLanguage, - query: RuleQuery, - }, - optional: {}, - defaultable: {}, -}); - -// ------------------------------------------------------------------------------------------------- -// Indicator Match rule schema - -const threatMatchSchema = buildRuleSchemas({ - required: { - type: t.literal('threat_match'), - query: RuleQuery, - threat_query, - threat_mapping, - threat_index, - }, - optional: { - index: IndexPatternArray, - data_view_id: DataViewId, - filters: RuleFilterArray, - saved_id, - threat_filters, - threat_indicator_path, - threat_language: KqlQueryLanguage, - concurrent_searches, - items_per_search, - }, - defaultable: { - language: KqlQueryLanguage, - }, -}); - -// ------------------------------------------------------------------------------------------------- -// Custom Query rule schema - -const querySchema = buildRuleSchemas({ - required: { - type: t.literal('query'), - }, - optional: { - index: IndexPatternArray, - data_view_id: DataViewId, - filters: RuleFilterArray, - saved_id, - response_actions: ResponseActionArray, - alert_suppression: AlertSuppression, - }, - defaultable: { - query: RuleQuery, - language: KqlQueryLanguage, - }, -}); - -// ------------------------------------------------------------------------------------------------- -// Saved Query rule schema - -const savedQuerySchema = buildRuleSchemas({ - required: { - type: t.literal('saved_query'), - saved_id, - }, - optional: { - // Having language, query, and filters possibly defined adds more code confusion and probably user confusion - // if the saved object gets deleted for some reason - index: IndexPatternArray, - data_view_id: DataViewId, - query: RuleQuery, - filters: RuleFilterArray, - response_actions: ResponseActionArray, - alert_suppression: AlertSuppression, - }, - defaultable: { - language: KqlQueryLanguage, - }, -}); - -// ------------------------------------------------------------------------------------------------- -// Threshold rule schema - -const thresholdSchema = buildRuleSchemas({ - required: { - type: t.literal('threshold'), - query: RuleQuery, - threshold: Threshold, - }, - optional: { - index: IndexPatternArray, - data_view_id: DataViewId, - filters: RuleFilterArray, - saved_id, - }, - defaultable: { - language: KqlQueryLanguage, - }, -}); - -// ------------------------------------------------------------------------------------------------- -// Machine Learning rule schema - -const machineLearningSchema = buildRuleSchemas({ - required: { - type: t.literal('machine_learning'), - anomaly_threshold, - machine_learning_job_id, - }, - optional: {}, - defaultable: {}, -}); - -// ------------------------------------------------------------------------------------------------- -// New Terms rule schema - -const newTermsSchema = buildRuleSchemas({ - required: { - type: t.literal('new_terms'), - query: RuleQuery, - new_terms_fields: NewTermsFields, - history_window_start: HistoryWindowStart, - }, - optional: { - index: IndexPatternArray, - data_view_id: DataViewId, - filters: RuleFilterArray, - }, - defaultable: { - language: KqlQueryLanguage, - }, -}); - -// ------------------------------------------------------------------------------------------------- -// Combined type specific schemas - -export type TypeSpecificCreateProps = t.TypeOf; -export const TypeSpecificCreateProps = t.union([ - eqlSchema.create, - esqlSchema.create, - threatMatchSchema.create, - querySchema.create, - savedQuerySchema.create, - thresholdSchema.create, - machineLearningSchema.create, - newTermsSchema.create, -]); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/threshold_attributes.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/threshold_attributes.ts deleted file mode 100644 index eb5639c97ab3e..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema_legacy/threshold_attributes.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; -import { PositiveInteger, PositiveIntegerGreaterThanZero } from '@kbn/securitysolution-io-ts-types'; - -// Attributes specific to Threshold rules - -const thresholdField = t.exact( - t.type({ - field: t.union([t.string, t.array(t.string)]), // Covers pre- and post-7.12 - value: PositiveIntegerGreaterThanZero, - }) -); - -const thresholdFieldNormalized = t.exact( - t.type({ - field: t.array(t.string), - value: PositiveIntegerGreaterThanZero, - }) -); - -const thresholdCardinalityField = t.exact( - t.type({ - field: t.string, - value: PositiveInteger, - }) -); - -export type Threshold = t.TypeOf; -export const Threshold = t.intersection([ - thresholdField, - t.exact( - t.partial({ - cardinality: t.array(thresholdCardinalityField), - }) - ), -]); - -export type ThresholdNormalized = t.TypeOf; -export const ThresholdNormalized = t.intersection([ - thresholdFieldNormalized, - t.exact( - t.partial({ - cardinality: t.array(thresholdCardinalityField), - }) - ), -]); - -export type ThresholdWithCardinality = t.TypeOf; -export const ThresholdWithCardinality = t.intersection([ - thresholdFieldNormalized, - t.exact( - t.type({ - cardinality: t.array(thresholdCardinalityField), - }) - ), -]); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/model/schemas.ts b/x-pack/plugins/security_solution/common/api/detection_engine/model/schemas.ts index 68a6dbb461673..12973846c1f23 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/model/schemas.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/model/schemas.ts @@ -7,89 +7,76 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import * as t from 'io-ts'; -import { PositiveInteger } from '@kbn/securitysolution-io-ts-types'; - -export const file_name = t.string; -export type FileName = t.TypeOf; - -export const exclude_export_details = t.boolean; -export type ExcludeExportDetails = t.TypeOf; - -export const saved_id = t.string; - -export const savedIdOrUndefined = t.union([saved_id, t.undefined]); -export type SavedIdOrUndefined = t.TypeOf; - -export const anomaly_threshold = PositiveInteger; - -export const status = t.keyof({ - open: null, - closed: null, - acknowledged: null, - 'in-progress': null, -}); -export type Status = t.TypeOf; - -export const conflicts = t.keyof({ abort: null, proceed: null }); - -export const signal_ids = t.array(t.string); -export type SignalIds = t.TypeOf; - -// TODO: Can this be more strict or is this is the set of all Elastic Queries? -export const signal_status_query = t.object; - -export const alert_tag_ids = t.array(t.string); -export type AlertTagIds = t.TypeOf; - -export const indexRecord = t.record( - t.string, - t.type({ - all: t.boolean, - maintenance: t.boolean, - read: t.boolean, - create_index: t.boolean, - index: t.boolean, - monitor: t.boolean, - delete: t.boolean, - manage: t.boolean, - delete_index: t.boolean, - create_doc: t.boolean, - view_index_metadata: t.boolean, - create: t.boolean, - write: t.boolean, +import { z } from 'zod'; + +export type FileName = z.infer; +export const file_name = z.string(); + +export type ExcludeExportDetails = z.infer; +export const exclude_export_details = z.boolean(); + +export const saved_id = z.string(); + +export type SavedIdOrUndefined = z.infer; +export const savedIdOrUndefined = saved_id.optional(); + +export const status = z.enum(['open', 'closed', 'acknowledged', 'in-progress']); +export type Status = z.infer; + +export const signal_ids = z.array(z.string()); +export type SignalIds = z.infer; + +export const alert_tag_ids = z.array(z.string()); +export type AlertTagIds = z.infer; + +export const indexRecord = z.record( + z.string(), + z.object({ + all: z.boolean(), + maintenance: z.boolean(), + read: z.boolean(), + create_index: z.boolean(), + index: z.boolean(), + monitor: z.boolean(), + delete: z.boolean(), + manage: z.boolean(), + delete_index: z.boolean(), + create_doc: z.boolean(), + view_index_metadata: z.boolean(), + create: z.boolean(), + write: z.boolean(), }) ); -export const privilege = t.type({ - username: t.string, - has_all_requested: t.boolean, - cluster: t.type({ - monitor_ml: t.boolean, - manage_index_templates: t.boolean, - monitor_transform: t.boolean, - manage_security: t.boolean, - manage_own_api_key: t.boolean, - all: t.boolean, - monitor: t.boolean, - manage: t.boolean, - manage_transform: t.boolean, - manage_ml: t.boolean, - manage_pipeline: t.boolean, +export const privilege = z.object({ + username: z.string(), + has_all_requested: z.boolean(), + cluster: z.object({ + monitor_ml: z.boolean(), + manage_index_templates: z.boolean(), + monitor_transform: z.boolean(), + manage_security: z.boolean(), + manage_own_api_key: z.boolean(), + all: z.boolean(), + monitor: z.boolean(), + manage: z.boolean(), + manage_transform: z.boolean(), + manage_ml: z.boolean(), + manage_pipeline: z.boolean(), }), index: indexRecord, - is_authenticated: t.boolean, - has_encryption_key: t.boolean, + is_authenticated: z.boolean(), + has_encryption_key: z.boolean(), }); -export type Privilege = t.TypeOf; +export type Privilege = z.infer; -export const alert_tags = t.type({ - tags_to_add: t.array(t.string), - tags_to_remove: t.array(t.string), +export const alert_tags = z.object({ + tags_to_add: z.array(z.string()), + tags_to_remove: z.array(z.string()), }); -export type AlertTags = t.TypeOf; +export type AlertTags = z.infer; -export const user_search_term = t.string; -export type UserSearchTerm = t.TypeOf; +export const user_search_term = z.string(); +export type UserSearchTerm = z.infer; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts index a2b514676767b..635dfdf45c1c4 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/index.ts @@ -14,7 +14,6 @@ export * from './review_rule_installation/review_rule_installation_route'; export * from './review_rule_upgrade/review_rule_upgrade_route'; export * from './urls'; export * from './model/aggregated_prebuilt_rules_error'; -export * from './model/diff/diffable_rule/build_schema'; export * from './model/diff/diffable_rule/diffable_field_types'; export * from './model/diff/diffable_rule/diffable_rule'; export * from './model/diff/rule_diff/fields_diff'; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/build_schema.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/build_schema.ts deleted file mode 100644 index b1d7752fb9f89..0000000000000 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/build_schema.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; -// TODO https://github.com/elastic/security-team/issues/7491 -// eslint-disable-next-line no-restricted-imports -import { orUndefined } from '../../../../model/rule_schema_legacy'; - -interface RuleFields { - required: TRequired; - optional: TOptional; -} - -export const buildSchema = ( - fields: RuleFields -) => { - return t.intersection([ - t.exact(t.type(fields.required)), - t.exact(t.type(orUndefined(fields.optional))), - ]); -}; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts index 299b4a7d7b394..aa64c1d12185a 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_field_types.ts @@ -4,25 +4,23 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { z } from 'zod'; -import * as t from 'io-ts'; -import { TimeDuration } from '@kbn/securitysolution-io-ts-types'; -// TODO https://github.com/elastic/security-team/issues/7491 -// eslint-disable-next-line no-restricted-imports import { BuildingBlockType, DataViewId, IndexPatternArray, KqlQueryLanguage, RuleFilterArray, - RuleNameOverride as RuleNameOverrideFieldName, + RuleNameOverride, RuleQuery, + SavedQueryId, TimelineTemplateId, TimelineTemplateTitle, - TimestampOverride as TimestampOverrideFieldName, + TimestampOverride, TimestampOverrideFallbackDisabled, -} from '../../../../model/rule_schema_legacy'; -import { saved_id } from '../../../../model/schemas'; +} from '../../../../model/rule_schema'; +import { TimeDuration } from '../../../../model/rule_schema/time_duration'; // ------------------------------------------------------------------------------------------------- // Rule data source @@ -32,24 +30,23 @@ export enum DataSourceType { 'data_view' = 'data_view', } -export type DataSourceIndexPatterns = t.TypeOf; -export const DataSourceIndexPatterns = t.exact( - t.type({ - type: t.literal(DataSourceType.index_patterns), - index_patterns: IndexPatternArray, - }) -); - -export type DataSourceDataView = t.TypeOf; -export const DataSourceDataView = t.exact( - t.type({ - type: t.literal(DataSourceType.data_view), - data_view_id: DataViewId, - }) -); - -export type RuleDataSource = t.TypeOf; -export const RuleDataSource = t.union([DataSourceIndexPatterns, DataSourceDataView]); +export type DataSourceIndexPatterns = z.infer; +export const DataSourceIndexPatterns = z.object({ + type: z.literal(DataSourceType.index_patterns), + index_patterns: IndexPatternArray, +}); + +export type DataSourceDataView = z.infer; +export const DataSourceDataView = z.object({ + type: z.literal(DataSourceType.data_view), + data_view_id: DataViewId, +}); + +export type RuleDataSource = z.infer; +export const RuleDataSource = z.discriminatedUnion('type', [ + DataSourceIndexPatterns, + DataSourceDataView, +]); // ------------------------------------------------------------------------------------------------- // Rule data query @@ -59,93 +56,75 @@ export enum KqlQueryType { 'saved_query' = 'saved_query', } -export type InlineKqlQuery = t.TypeOf; -export const InlineKqlQuery = t.exact( - t.type({ - type: t.literal(KqlQueryType.inline_query), - query: RuleQuery, - language: KqlQueryLanguage, - filters: RuleFilterArray, - }) -); - -export type SavedKqlQuery = t.TypeOf; -export const SavedKqlQuery = t.exact( - t.type({ - type: t.literal(KqlQueryType.saved_query), - saved_query_id: saved_id, - }) -); - -export type RuleKqlQuery = t.TypeOf; -export const RuleKqlQuery = t.union([InlineKqlQuery, SavedKqlQuery]); - -export type RuleEqlQuery = t.TypeOf; -export const RuleEqlQuery = t.exact( - t.type({ - query: RuleQuery, - language: t.literal('eql'), - filters: RuleFilterArray, - }) -); - -export type RuleEsqlQuery = t.TypeOf; -export const RuleEsqlQuery = t.exact( - t.type({ - query: RuleQuery, - language: t.literal('esql'), - }) -); +export type InlineKqlQuery = z.infer; +export const InlineKqlQuery = z.object({ + type: z.literal(KqlQueryType.inline_query), + query: RuleQuery, + language: KqlQueryLanguage, + filters: RuleFilterArray, +}); + +export type SavedKqlQuery = z.infer; +export const SavedKqlQuery = z.object({ + type: z.literal(KqlQueryType.saved_query), + saved_query_id: SavedQueryId, +}); + +export type RuleKqlQuery = z.infer; +export const RuleKqlQuery = z.discriminatedUnion('type', [InlineKqlQuery, SavedKqlQuery]); + +export type RuleEqlQuery = z.infer; +export const RuleEqlQuery = z.object({ + query: RuleQuery, + language: z.literal('eql'), + filters: RuleFilterArray, +}); + +export type RuleEsqlQuery = z.infer; +export const RuleEsqlQuery = z.object({ + query: RuleQuery, + language: z.literal('esql'), +}); // ------------------------------------------------------------------------------------------------- // Rule schedule -export type RuleSchedule = t.TypeOf; -export const RuleSchedule = t.exact( - t.type({ - interval: TimeDuration({ allowedUnits: ['s', 'm', 'h'] }), - lookback: TimeDuration({ allowedUnits: ['s', 'm', 'h'] }), - }) -); +export type RuleSchedule = z.infer; +export const RuleSchedule = z.object({ + interval: TimeDuration({ allowedUnits: ['s', 'm', 'h'] }), + lookback: TimeDuration({ allowedUnits: ['s', 'm', 'h'] }), +}); // ------------------------------------------------------------------------------------------------- // Rule name override -export type RuleNameOverrideObject = t.TypeOf; -export const RuleNameOverrideObject = t.exact( - t.type({ - field_name: RuleNameOverrideFieldName, - }) -); +export type RuleNameOverrideObject = z.infer; +export const RuleNameOverrideObject = z.object({ + field_name: RuleNameOverride, +}); // ------------------------------------------------------------------------------------------------- // Timestamp override -export type TimestampOverrideObject = t.TypeOf; -export const TimestampOverrideObject = t.exact( - t.type({ - field_name: TimestampOverrideFieldName, - fallback_disabled: TimestampOverrideFallbackDisabled, - }) -); +export type TimestampOverrideObject = z.infer; +export const TimestampOverrideObject = z.object({ + field_name: TimestampOverride, + fallback_disabled: TimestampOverrideFallbackDisabled, +}); // ------------------------------------------------------------------------------------------------- // Reference to a timeline template -export type TimelineTemplateReference = t.TypeOf; -export const TimelineTemplateReference = t.exact( - t.type({ - timeline_id: TimelineTemplateId, - timeline_title: TimelineTemplateTitle, - }) -); +export type TimelineTemplateReference = z.infer; +export const TimelineTemplateReference = z.object({ + timeline_id: TimelineTemplateId, + timeline_title: TimelineTemplateTitle, +}); // ------------------------------------------------------------------------------------------------- // Building block -export type BuildingBlockObject = t.TypeOf; -export const BuildingBlockObject = t.exact( - t.type({ - type: BuildingBlockType, - }) -); +export type BuildingBlockObject = z.infer; +export const BuildingBlockObject = z.object({ + type: BuildingBlockType, +}); diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts index 9bb6fc10031d2..3d58f1e0b7da5 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/diffable_rule/diffable_rule.ts @@ -5,212 +5,164 @@ * 2.0. */ -import * as t from 'io-ts'; +import { z } from 'zod'; import { - concurrent_searches, - items_per_search, - machine_learning_job_id, - RiskScore, - RiskScoreMapping, - RuleActionArray, - RuleActionThrottle, - Severity, - SeverityMapping, - threat_index, - threat_indicator_path, - threat_mapping, -} from '@kbn/securitysolution-io-ts-alerting-types'; - -// TODO https://github.com/elastic/security-team/issues/7491 -// eslint-disable-next-line no-restricted-imports -import { - AlertSuppression, + AnomalyThreshold, + ConcurrentSearches, EventCategoryOverride, - ExceptionListArray, HistoryWindowStart, InvestigationGuide, + ItemsPerSearch, + MachineLearningJobId, MaxSignals, NewTermsFields, RelatedIntegrationArray, RequiredFieldArray, + RiskScore, + RiskScoreMapping, RuleAuthorArray, RuleDescription, + RuleExceptionList, RuleFalsePositiveArray, RuleLicense, - RuleMetadata, RuleName, RuleReferenceArray, RuleSignatureId, RuleTagArray, RuleVersion, SetupGuide, + Severity, + SeverityMapping, ThreatArray, + ThreatIndex, + ThreatIndicatorPath, + ThreatMapping, Threshold, TiebreakerField, TimestampField, -} from '../../../../model/rule_schema_legacy'; +} from '../../../../model/rule_schema'; import { BuildingBlockObject, + InlineKqlQuery, + RuleDataSource, RuleEqlQuery, RuleEsqlQuery, - InlineKqlQuery, RuleKqlQuery, - RuleDataSource, RuleNameOverrideObject, RuleSchedule, TimelineTemplateReference, TimestampOverrideObject, } from './diffable_field_types'; -import { buildSchema } from './build_schema'; -import { anomaly_threshold } from '../../../../model/schemas'; - -export type DiffableCommonFields = t.TypeOf; -export const DiffableCommonFields = buildSchema({ - required: { - // Technical fields - // NOTE: We might consider removing them from the schema and returning from the API - // not via the fields diff, but via dedicated properties in the response body. - rule_id: RuleSignatureId, - version: RuleVersion, - meta: RuleMetadata, - - // Main domain fields - name: RuleName, - tags: RuleTagArray, - description: RuleDescription, - severity: Severity, - severity_mapping: SeverityMapping, - risk_score: RiskScore, - risk_score_mapping: RiskScoreMapping, - - // About -> Advanced settings - references: RuleReferenceArray, - false_positives: RuleFalsePositiveArray, - threat: ThreatArray, - note: InvestigationGuide, - setup: SetupGuide, - related_integrations: RelatedIntegrationArray, - required_fields: RequiredFieldArray, - author: RuleAuthorArray, - license: RuleLicense, - - // Other domain fields - rule_schedule: RuleSchedule, // NOTE: new field - actions: RuleActionArray, - throttle: RuleActionThrottle, - exceptions_list: ExceptionListArray, - max_signals: MaxSignals, - }, - optional: { - rule_name_override: RuleNameOverrideObject, // NOTE: new field - timestamp_override: TimestampOverrideObject, // NOTE: new field - timeline_template: TimelineTemplateReference, // NOTE: new field - building_block: BuildingBlockObject, // NOTE: new field - }, +export type DiffableCommonFields = z.infer; +export const DiffableCommonFields = z.object({ + // Technical fields + // NOTE: We might consider removing them from the schema and returning from the API + // not via the fields diff, but via dedicated properties in the response body. + rule_id: RuleSignatureId, + version: RuleVersion, + + // Main domain fields + name: RuleName, + tags: RuleTagArray, + description: RuleDescription, + severity: Severity, + severity_mapping: SeverityMapping, + risk_score: RiskScore, + risk_score_mapping: RiskScoreMapping, + + // About -> Advanced settings + references: RuleReferenceArray, + false_positives: RuleFalsePositiveArray, + threat: ThreatArray, + note: InvestigationGuide, + setup: SetupGuide, + related_integrations: RelatedIntegrationArray, + required_fields: RequiredFieldArray, + author: RuleAuthorArray, + license: RuleLicense, + + // Other domain fields + rule_schedule: RuleSchedule, // NOTE: new field + exceptions_list: z.array(RuleExceptionList), + max_signals: MaxSignals, + + // Optional fields + rule_name_override: RuleNameOverrideObject.optional(), // NOTE: new field + timestamp_override: TimestampOverrideObject.optional(), // NOTE: new field + timeline_template: TimelineTemplateReference.optional(), // NOTE: new field + building_block: BuildingBlockObject.optional(), // NOTE: new field }); -export type DiffableCustomQueryFields = t.TypeOf; -export const DiffableCustomQueryFields = buildSchema({ - required: { - type: t.literal('query'), - kql_query: RuleKqlQuery, // NOTE: new field - }, - optional: { - data_source: RuleDataSource, // NOTE: new field - alert_suppression: AlertSuppression, - }, +export type DiffableCustomQueryFields = z.infer; +export const DiffableCustomQueryFields = z.object({ + type: z.literal('query'), + kql_query: RuleKqlQuery, // NOTE: new field + data_source: RuleDataSource.optional(), // NOTE: new field }); -export type DiffableSavedQueryFields = t.TypeOf; -export const DiffableSavedQueryFields = buildSchema({ - required: { - type: t.literal('saved_query'), - kql_query: RuleKqlQuery, // NOTE: new field - }, - optional: { - data_source: RuleDataSource, // NOTE: new field - alert_suppression: AlertSuppression, - }, +export type DiffableSavedQueryFields = z.infer; +export const DiffableSavedQueryFields = z.object({ + type: z.literal('saved_query'), + kql_query: RuleKqlQuery, // NOTE: new field + data_source: RuleDataSource.optional(), // NOTE: new field }); -export type DiffableEqlFields = t.TypeOf; -export const DiffableEqlFields = buildSchema({ - required: { - type: t.literal('eql'), - eql_query: RuleEqlQuery, // NOTE: new field - }, - optional: { - data_source: RuleDataSource, // NOTE: new field - event_category_override: EventCategoryOverride, - timestamp_field: TimestampField, - tiebreaker_field: TiebreakerField, - }, +export type DiffableEqlFields = z.infer; +export const DiffableEqlFields = z.object({ + type: z.literal('eql'), + eql_query: RuleEqlQuery, // NOTE: new field + data_source: RuleDataSource.optional(), // NOTE: new field + event_category_override: EventCategoryOverride.optional(), + timestamp_field: TimestampField.optional(), + tiebreaker_field: TiebreakerField.optional(), }); -export type DiffableEsqlFields = t.TypeOf; -export const DiffableEsqlFields = buildSchema({ - required: { - type: t.literal('esql'), - esql_query: RuleEsqlQuery, // NOTE: new field - }, - // this is a new type of rule, no prebuilt rules created yet. - // new properties might be added here during further rule type development - optional: {}, +// this is a new type of rule, no prebuilt rules created yet. +// new properties might be added here during further rule type development +export type DiffableEsqlFields = z.infer; +export const DiffableEsqlFields = z.object({ + type: z.literal('esql'), + esql_query: RuleEsqlQuery, // NOTE: new field }); -export type DiffableThreatMatchFields = t.TypeOf; -export const DiffableThreatMatchFields = buildSchema({ - required: { - type: t.literal('threat_match'), - kql_query: RuleKqlQuery, // NOTE: new field - threat_query: InlineKqlQuery, // NOTE: new field - threat_index, - threat_mapping, - }, - optional: { - data_source: RuleDataSource, // NOTE: new field - threat_indicator_path, - concurrent_searches, // Should combine concurrent_searches and items_per_search? - items_per_search, - }, +export type DiffableThreatMatchFields = z.infer; +export const DiffableThreatMatchFields = z.object({ + type: z.literal('threat_match'), + kql_query: RuleKqlQuery, // NOTE: new field + threat_query: InlineKqlQuery, // NOTE: new field + threat_index: ThreatIndex, + threat_mapping: ThreatMapping, + data_source: RuleDataSource.optional(), // NOTE: new field + threat_indicator_path: ThreatIndicatorPath.optional(), + concurrent_searches: ConcurrentSearches.optional(), + items_per_search: ItemsPerSearch.optional(), }); -export type DiffableThresholdFields = t.TypeOf; -export const DiffableThresholdFields = buildSchema({ - required: { - type: t.literal('threshold'), - kql_query: RuleKqlQuery, // NOTE: new field - threshold: Threshold, - }, - optional: { - data_source: RuleDataSource, // NOTE: new field - }, +export type DiffableThresholdFields = z.infer; +export const DiffableThresholdFields = z.object({ + type: z.literal('threshold'), + kql_query: RuleKqlQuery, // NOTE: new field + threshold: Threshold, + data_source: RuleDataSource.optional(), // NOTE: new field }); -export type DiffableMachineLearningFields = t.TypeOf; -export const DiffableMachineLearningFields = buildSchema({ - required: { - type: t.literal('machine_learning'), - machine_learning_job_id, - anomaly_threshold, - }, - optional: {}, +export type DiffableMachineLearningFields = z.infer; +export const DiffableMachineLearningFields = z.object({ + type: z.literal('machine_learning'), + machine_learning_job_id: MachineLearningJobId, + anomaly_threshold: AnomalyThreshold, }); -export type DiffableNewTermsFields = t.TypeOf; -export const DiffableNewTermsFields = buildSchema({ - required: { - type: t.literal('new_terms'), - kql_query: InlineKqlQuery, // NOTE: new field - new_terms_fields: NewTermsFields, - history_window_start: HistoryWindowStart, - }, - optional: { - data_source: RuleDataSource, // NOTE: new field - }, +export type DiffableNewTermsFields = z.infer; +export const DiffableNewTermsFields = z.object({ + type: z.literal('new_terms'), + kql_query: InlineKqlQuery, // NOTE: new field + new_terms_fields: NewTermsFields, + history_window_start: HistoryWindowStart, + data_source: RuleDataSource.optional(), // NOTE: new field }); /** @@ -240,10 +192,10 @@ export const DiffableNewTermsFields = buildSchema({ * top-level fields. */ -export type DiffableRule = t.TypeOf; -export const DiffableRule = t.intersection([ +export type DiffableRule = z.infer; +const DiffableRule = z.intersection( DiffableCommonFields, - t.union([ + z.discriminatedUnion('type', [ DiffableCustomQueryFields, DiffableSavedQueryFields, DiffableEqlFields, @@ -252,8 +204,8 @@ export const DiffableRule = t.intersection([ DiffableThresholdFields, DiffableMachineLearningFields, DiffableNewTermsFields, - ]), -]); + ]) +); /** * This is a merge of all fields from all rule types into a single TS type. diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/fields_diff.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/fields_diff.ts index a1b8a0ae8d104..9637faebe9c9c 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/fields_diff.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/diff/rule_diff/fields_diff.ts @@ -7,10 +7,10 @@ import type { ThreeWayDiff, ThreeWayDiffAlgorithm } from '../three_way_diff/three_way_diff'; -export type FieldsDiff = { +export type FieldsDiff = Required<{ [Field in keyof TObject]: ThreeWayDiff; -}; +}>; -export type FieldsDiffAlgorithmsFor = { +export type FieldsDiffAlgorithmsFor = Required<{ [Field in keyof TObject]: ThreeWayDiffAlgorithm; -}; +}>; diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts index 7e550633d8efc..8abee3cbe83a6 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts +++ b/x-pack/plugins/security_solution/common/api/detection_engine/prebuilt_rules/model/index.ts @@ -6,7 +6,6 @@ */ export * from './aggregated_prebuilt_rules_error'; -export * from './diff/diffable_rule/build_schema'; export * from './diff/diffable_rule/diffable_field_types'; export * from './diff/diffable_rule/diffable_rule'; export * from './diff/rule_diff/fields_diff'; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts index 45cb8f0633e65..0672e599160ad 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/constants.ts @@ -51,7 +51,6 @@ export const DEFINITION_UPGRADE_FIELD_ORDER: Array = [ 'threat_indicator_path', 'concurrent_searches', 'items_per_search', - 'alert_suppression', 'new_terms_fields', 'history_window_start', 'max_signals', diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_diff/get_field_diffs_for_grouped_fields.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_diff/get_field_diffs_for_grouped_fields.ts index 2c5c20da928dd..21717998483ea 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_diff/get_field_diffs_for_grouped_fields.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/per_field_diff/get_field_diffs_for_grouped_fields.ts @@ -8,6 +8,9 @@ import stringify from 'json-stable-stringify'; import type { AllFieldsDiff, + RuleFieldsDiffWithDataSource, + RuleFieldsDiffWithEqlQuery, + RuleFieldsDiffWithEsqlQuery, RuleFieldsDiffWithKqlQuery, } from '../../../../../../common/api/detection_engine'; import type { FieldDiff } from '../../../model/rule_details/rule_field_diff'; @@ -24,7 +27,7 @@ export const sortAndStringifyJson = (fieldValue: unknown): string => { }; export const getFieldDiffsForDataSource = ( - dataSourceThreeWayDiff: AllFieldsDiff['data_source'] + dataSourceThreeWayDiff: RuleFieldsDiffWithDataSource['data_source'] ): FieldDiff[] => { const currentType = sortAndStringifyJson(dataSourceThreeWayDiff.current_version?.type); const targetType = sortAndStringifyJson(dataSourceThreeWayDiff.target_version?.type); @@ -171,7 +174,9 @@ export const getFieldDiffsForKqlQuery = ( ]; }; -export const getFieldDiffsForEqlQuery = (eqlQuery: AllFieldsDiff['eql_query']): FieldDiff[] => { +export const getFieldDiffsForEqlQuery = ( + eqlQuery: RuleFieldsDiffWithEqlQuery['eql_query'] +): FieldDiff[] => { const currentQuery = sortAndStringifyJson(eqlQuery.current_version?.query); const targetQuery = sortAndStringifyJson(eqlQuery.target_version?.query); @@ -199,7 +204,9 @@ export const getFieldDiffsForEqlQuery = (eqlQuery: AllFieldsDiff['eql_query']): ]; }; -export const getFieldDiffsForEsqlQuery = (esqlQuery: AllFieldsDiff['esql_query']): FieldDiff[] => { +export const getFieldDiffsForEsqlQuery = ( + esqlQuery: RuleFieldsDiffWithEsqlQuery['esql_query'] +): FieldDiff[] => { const currentQuery = sortAndStringifyJson(esqlQuery.current_version?.query); const targetQuery = sortAndStringifyJson(esqlQuery.target_version?.query); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_diff_tab.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_diff_tab.tsx index b22fc1b73bbe6..dd6d0417d3bb6 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_diff_tab.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_diff_tab.tsx @@ -28,7 +28,7 @@ import * as i18n from './json_diff/translations'; import { getHumanizedDuration } from '../../../../detections/pages/detection_engine/rules/helpers'; /* Inclding these properties in diff display might be confusing to users. */ -const HIDDEN_PROPERTIES = [ +const HIDDEN_PROPERTIES: Array = [ /* By default, prebuilt rules don't have any actions or exception lists. So if a user has defined actions or exception lists for a rule, it'll show up as diff. This looks confusing as the user might think that their actions and exceptions lists will get removed after the upgrade, which is not the case - they will be preserved. */ @@ -44,13 +44,13 @@ const HIDDEN_PROPERTIES = [ 'revision', /* - "updated_at" value is regenerated on every '/upgrade/_review' endpoint run + "updated_at" value is regenerated on every '/upgrade/_review' endpoint run and will therefore always show a diff. It adds no value to display it to the user. */ 'updated_at', /* - These values make sense only for installed prebuilt rules. + These values make sense only for installed prebuilt rules. They are not present in the prebuilt rule package. So, showing them in the diff doesn't add value. */ @@ -76,11 +76,11 @@ const normalizeRule = (originalRule: RuleResponse): RuleResponse => { const rule = { ...originalRule }; /* - Convert the "from" property value to a humanized duration string, like 'now-1m' or 'now-2h'. - Conversion is needed to skip showing the diff for the "from" property when the same - duration is represented in different time units. For instance, 'now-1h' and 'now-3600s' + Convert the "from" property value to a humanized duration string, like 'now-1m' or 'now-2h'. + Conversion is needed to skip showing the diff for the "from" property when the same + duration is represented in different time units. For instance, 'now-1h' and 'now-3600s' indicate a one-hour duration. - The same helper is used in the rule editing UI to format "from" before submitting the edits. + The same helper is used in the rule editing UI to format "from" before submitting the edits. So, after the rule is saved, the "from" property unit/value might differ from what's in the package. */ rule.from = formatScheduleStepData({ @@ -91,8 +91,8 @@ const normalizeRule = (originalRule: RuleResponse): RuleResponse => { /* Default "note" to an empty string if it's not present. - Sometimes, in a new version of a rule, the "note" value equals an empty string, while - in the old version, it wasn't specified at all (undefined becomes ''). In this case, + Sometimes, in a new version of a rule, the "note" value equals an empty string, while + in the old version, it wasn't specified at all (undefined becomes ''). In this case, it doesn't make sense to show diff, so we default falsy values to ''. */ rule.note = rule.note ?? ''; @@ -104,9 +104,9 @@ const normalizeRule = (originalRule: RuleResponse): RuleResponse => { rule.threat = filterEmptyThreats(rule.threat); /* - The "machine_learning_job_id" property is converted from the legacy string format - to the new array format during installation and upgrade. Thus, all installed rules - use the new format. For correct comparison, we must ensure that the rule update is + The "machine_learning_job_id" property is converted from the legacy string format + to the new array format during installation and upgrade. Thus, all installed rules + use the new format. For correct comparison, we must ensure that the rule update is also in the new format before showing the diff. */ if ('machine_learning_job_id' in rule) { @@ -115,7 +115,7 @@ const normalizeRule = (originalRule: RuleResponse): RuleResponse => { /* Default the "alias" property to null for all threat filters that don't have it. - Setting a default is needed to match the behavior of the rule editing UI, + Setting a default is needed to match the behavior of the rule editing UI, which also defaults the "alias" property to null. */ if (rule.type === 'threat_match' && Array.isArray(rule.threat_filters)) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts index ea482858650fb..5e9bd8bd9ae64 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/calculation/calculate_rule_fields_diff.ts @@ -173,7 +173,6 @@ const calculateCommonFieldsDiff = ( const commonFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor = { rule_id: simpleDiffAlgorithm, version: numberDiffAlgorithm, - meta: simpleDiffAlgorithm, name: singleLineStringDiffAlgorithm, tags: simpleDiffAlgorithm, description: simpleDiffAlgorithm, @@ -191,8 +190,6 @@ const commonFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor author: simpleDiffAlgorithm, license: singleLineStringDiffAlgorithm, rule_schedule: simpleDiffAlgorithm, - actions: simpleDiffAlgorithm, - throttle: simpleDiffAlgorithm, exceptions_list: simpleDiffAlgorithm, max_signals: numberDiffAlgorithm, rule_name_override: simpleDiffAlgorithm, @@ -211,7 +208,6 @@ const customQueryFieldsDiffAlgorithms: FieldsDiffAlgorithmsFor { +): RequiredOptional => { return { // --------------------- REQUIRED FIELDS // Technical fields rule_id: rule.rule_id, version: rule.version, - meta: rule.meta ?? {}, // Main domain fields name: rule.name, @@ -140,8 +139,6 @@ const extractDiffableCommonFields = ( // Other domain fields rule_schedule: extractRuleSchedule(rule), - actions: (rule.actions ?? []) as RuleActionArray, - throttle: rule.throttle ?? 'no_actions', exceptions_list: rule.exceptions_list ?? [], max_signals: rule.max_signals ?? DEFAULT_MAX_SIGNALS, @@ -155,29 +152,27 @@ const extractDiffableCommonFields = ( const extractDiffableCustomQueryFields = ( rule: QueryRule | QueryRuleCreateProps -): DiffableCustomQueryFields => { +): RequiredOptional => { return { type: rule.type, kql_query: extractRuleKqlQuery(rule.query, rule.language, rule.filters, rule.saved_id), data_source: extractRuleDataSource(rule.index, rule.data_view_id), - alert_suppression: rule.alert_suppression, }; }; const extractDiffableSavedQueryFieldsFromRuleObject = ( rule: SavedQueryRule | SavedQueryRuleCreateProps -): DiffableSavedQueryFields => { +): RequiredOptional => { return { type: rule.type, kql_query: extractRuleKqlQuery(rule.query, rule.language, rule.filters, rule.saved_id), data_source: extractRuleDataSource(rule.index, rule.data_view_id), - alert_suppression: rule.alert_suppression, }; }; const extractDiffableEqlFieldsFromRuleObject = ( rule: EqlRule | EqlRuleCreateProps -): DiffableEqlFields => { +): RequiredOptional => { return { type: rule.type, eql_query: extractRuleEqlQuery(rule.query, rule.language, rule.filters), @@ -190,7 +185,7 @@ const extractDiffableEqlFieldsFromRuleObject = ( const extractDiffableEsqlFieldsFromRuleObject = ( rule: EsqlRule | EsqlRuleCreateProps -): DiffableEsqlFields => { +): RequiredOptional => { return { type: rule.type, esql_query: extractRuleEsqlQuery(rule.query, rule.language), @@ -199,7 +194,7 @@ const extractDiffableEsqlFieldsFromRuleObject = ( const extractDiffableThreatMatchFieldsFromRuleObject = ( rule: ThreatMatchRule | ThreatMatchRuleCreateProps -): DiffableThreatMatchFields => { +): RequiredOptional => { return { type: rule.type, kql_query: extractRuleKqlQuery(rule.query, rule.language, rule.filters, rule.saved_id), @@ -219,7 +214,7 @@ const extractDiffableThreatMatchFieldsFromRuleObject = ( const extractDiffableThresholdFieldsFromRuleObject = ( rule: ThresholdRule | ThresholdRuleCreateProps -): DiffableThresholdFields => { +): RequiredOptional => { return { type: rule.type, kql_query: extractRuleKqlQuery(rule.query, rule.language, rule.filters, rule.saved_id), @@ -230,7 +225,7 @@ const extractDiffableThresholdFieldsFromRuleObject = ( const extractDiffableMachineLearningFieldsFromRuleObject = ( rule: MachineLearningRule | MachineLearningRuleCreateProps -): DiffableMachineLearningFields => { +): RequiredOptional => { return { type: rule.type, machine_learning_job_id: rule.machine_learning_job_id, @@ -240,7 +235,7 @@ const extractDiffableMachineLearningFieldsFromRuleObject = ( const extractDiffableNewTermsFieldsFromRuleObject = ( rule: NewTermsRule | NewTermsRuleCreateProps -): DiffableNewTermsFields => { +): RequiredOptional => { return { type: rule.type, kql_query: extractInlineKqlQuery(rule.query, rule.language, rule.filters), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/normalization/extract_rule_schedule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/normalization/extract_rule_schedule.ts index 28880523c774c..a15a4fcb930cd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/normalization/extract_rule_schedule.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/diff/normalization/extract_rule_schedule.ts @@ -9,7 +9,10 @@ import moment from 'moment'; import dateMath from '@elastic/datemath'; import { parseDuration } from '@kbn/alerting-plugin/common'; -import type { RuleResponse } from '../../../../../../../common/api/detection_engine/model/rule_schema'; +import type { + RuleMetadata, + RuleResponse, +} from '../../../../../../../common/api/detection_engine/model/rule_schema'; import type { RuleSchedule } from '../../../../../../../common/api/detection_engine/prebuilt_rules'; import type { PrebuiltRuleAsset } from '../../../model/rule_assets/prebuilt_rule_asset'; @@ -18,8 +21,7 @@ export const extractRuleSchedule = (rule: RuleResponse | PrebuiltRuleAsset): Rul const from = rule.from ?? 'now-6m'; const to = rule.to ?? 'now'; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const ruleMeta = (rule.meta ?? {}) as any; + const ruleMeta: RuleMetadata = ('meta' in rule ? rule.meta : undefined) ?? {}; const lookbackFromMeta = String(ruleMeta.from ?? ''); const intervalDuration = parseInterval(interval); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts index 06ccf0a2b97f4..e4d9255dc2b95 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.test.ts @@ -32,6 +32,33 @@ describe('Prebuilt rule asset schema', () => { expect(result.data).toEqual(getPrebuiltRuleMock()); }); + describe('ommited fields from the rule schema are ignored', () => { + // The PrebuiltRuleAsset schema is built out of the rule schema, + // but the following fields are manually omitted. + // See: detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts + const omittedFields = [ + 'actions', + 'throttle', + 'meta', + 'output_index', + 'namespace', + 'alias_purpose', + 'alias_target_id', + 'outcome', + ]; + + test.each(omittedFields)('ignores %s since it`s an omitted field', (field) => { + const payload: Partial & Record = { + ...getPrebuiltRuleMock(), + [field]: 'some value', + }; + + const result = PrebuiltRuleAsset.safeParse(payload); + expectParseSuccess(result); + expect(result.data).toEqual(getPrebuiltRuleMock()); + }); + }); + test('[rule_id] does not validate', () => { const payload: Partial = { rule_id: 'rule-1', @@ -64,17 +91,6 @@ describe('Prebuilt rule asset schema', () => { expect(result.data).toEqual(payload); }); - test('You can send in a namespace', () => { - const payload: PrebuiltRuleAsset = { - ...getPrebuiltRuleMock(), - namespace: 'a namespace', - }; - - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseSuccess(result); - expect(result.data).toEqual(payload); - }); - test('You can send in an empty array to threat', () => { const payload: PrebuiltRuleAsset = { ...getPrebuiltRuleMock(), @@ -449,32 +465,6 @@ describe('Prebuilt rule asset schema', () => { expect(result.data).toEqual(payload); }); - test('You can set meta to any object you want', () => { - const payload: PrebuiltRuleAsset = { - ...getPrebuiltRuleMock(), - meta: { - somethingMadeUp: { somethingElse: true }, - }, - }; - - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseSuccess(result); - expect(result.data).toEqual(payload); - }); - - test('You cannot create meta as a string', () => { - const payload: Omit & { meta: string } = { - ...getPrebuiltRuleMock(), - meta: 'should not work', - }; - - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseError(result); - expect(stringifyZodError(result.error)).toMatchInlineSnapshot( - `"meta: Expected object, received string"` - ); - }); - test('validates with timeline_id and timeline_title', () => { const payload: PrebuiltRuleAsset = { ...getPrebuiltRuleMock(), @@ -500,71 +490,6 @@ describe('Prebuilt rule asset schema', () => { ); }); - test('You cannot send in an array of actions that are missing "group"', () => { - const payload: Omit = { - ...getPrebuiltRuleMock(), - actions: [{ id: 'id', action_type_id: 'action_type_id', params: {} }], - }; - - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseError(result); - expect(stringifyZodError(result.error)).toMatchInlineSnapshot(`"actions.0.group: Required"`); - }); - - test('You cannot send in an array of actions that are missing "id"', () => { - const payload: Omit = { - ...getPrebuiltRuleMock(), - actions: [{ group: 'group', action_type_id: 'action_type_id', params: {} }], - }; - - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseError(result); - expect(stringifyZodError(result.error)).toMatchInlineSnapshot(`"actions.0.id: Required"`); - }); - - test('You cannot send in an array of actions that are missing "action_type_id"', () => { - const payload: Omit = { - ...getPrebuiltRuleMock(), - actions: [{ group: 'group', id: 'id', params: {} }], - }; - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseError(result); - expect(stringifyZodError(result.error)).toMatchInlineSnapshot( - `"actions.0.action_type_id: Required"` - ); - }); - - test('You cannot send in an array of actions that are missing "params"', () => { - const payload: Omit = { - ...getPrebuiltRuleMock(), - actions: [{ group: 'group', id: 'id', action_type_id: 'action_type_id' }], - }; - - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseError(result); - expect(stringifyZodError(result.error)).toMatchInlineSnapshot(`"actions.0.params: Required"`); - }); - - test('You cannot send in an array of actions that are including "actionTypeId"', () => { - const payload: Omit = { - ...getPrebuiltRuleMock(), - actions: [ - { - group: 'group', - id: 'id', - actionTypeId: 'actionTypeId', - params: {}, - }, - ], - }; - - const result = PrebuiltRuleAsset.safeParse(payload); - expectParseError(result); - expect(stringifyZodError(result.error)).toMatchInlineSnapshot( - `"actions.0.action_type_id: Required"` - ); - }); - describe('note', () => { test('You can set note to a string', () => { const payload: PrebuiltRuleAsset = { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts index 38ead608a3b75..056a3998e3b3e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts @@ -10,9 +10,64 @@ import { RuleSignatureId, RuleVersion, BaseCreateProps, - TypeSpecificCreateProps, + EqlRuleCreateFields, + EsqlRuleCreateFields, + MachineLearningRuleCreateFields, + NewTermsRuleCreateFields, + QueryRuleCreateFields, + SavedQueryRuleCreateFields, + ThreatMatchRuleCreateFields, + ThresholdRuleCreateFields, } from '../../../../../../common/api/detection_engine/model/rule_schema'; +/** + * The PrebuiltRuleAsset schema is created based on the rule schema defined in our OpenAPI specs. + * However, we don't need all the rule schema fields to be present in the PrebuiltRuleAsset. + * We omit some of them because they are not present in https://github.com/elastic/detection-rules. + * Context: https://github.com/elastic/kibana/issues/180393 + */ +const BASE_PROPS_REMOVED_FROM_PREBUILT_RULE_ASSET = zodMaskFor()([ + 'actions', + 'throttle', + 'meta', + 'output_index', + 'namespace', + 'alias_purpose', + 'alias_target_id', + 'outcome', +]); + +// `response_actions` is only part of the optional fields in QueryRuleCreateFields and SavedQueryRuleCreateFields +const TYPE_SPECIFIC_PROPS_REMOVED_FROM_PREBUILT_RULE_ASSET = zodMaskFor< + QueryRuleCreateFields | SavedQueryRuleCreateFields +>()(['response_actions']); + +const QueryRuleAssetFields = QueryRuleCreateFields.omit( + TYPE_SPECIFIC_PROPS_REMOVED_FROM_PREBUILT_RULE_ASSET +); +const SavedQueryRuleAssetFields = SavedQueryRuleCreateFields.omit( + TYPE_SPECIFIC_PROPS_REMOVED_FROM_PREBUILT_RULE_ASSET +); + +export const RuleAssetTypeSpecificCreateProps = z.discriminatedUnion('type', [ + EqlRuleCreateFields, + QueryRuleAssetFields, + SavedQueryRuleAssetFields, + ThresholdRuleCreateFields, + ThreatMatchRuleCreateFields, + MachineLearningRuleCreateFields, + NewTermsRuleCreateFields, + EsqlRuleCreateFields, +]); + +function zodMaskFor() { + return function (props: U[]): Record { + type PropObject = Record; + const propObjects: PropObject[] = props.map((p: U) => ({ [p]: true })); + return Object.assign({}, ...propObjects); + }; +} + /** * Asset containing source content of a prebuilt Security detection rule. * Is defined for each prebuilt rule in https://github.com/elastic/detection-rules. @@ -24,13 +79,16 @@ import { * - Data Exfiltration Detection * * Big differences between this schema and RuleCreateProps: - * - rule_id is required here - * - version is a required field that must exist + * - rule_id is a required field + * - version is a required field + * - some fields are omitted because they are not present in https://github.com/elastic/detection-rules */ export type PrebuiltRuleAsset = z.infer; -export const PrebuiltRuleAsset = BaseCreateProps.and(TypeSpecificCreateProps).and( - z.object({ - rule_id: RuleSignatureId, - version: RuleVersion, - }) -); +export const PrebuiltRuleAsset = BaseCreateProps.omit(BASE_PROPS_REMOVED_FROM_PREBUILT_RULE_ASSET) + .and(RuleAssetTypeSpecificCreateProps) + .and( + z.object({ + rule_id: RuleSignatureId, + version: RuleVersion, + }) + ); From 1f7fdfdfe428525b08bf14321463d091bdad4c79 Mon Sep 17 00:00:00 2001 From: Pratham Shirbhate Date: Thu, 11 Jul 2024 14:45:54 +0530 Subject: [PATCH 69/82] [Fleet][Cloud] Enrollment token table may show an empty last page #167663 (#188049) Fixes #167663 ## Summary Fixes the creation of extra empty page at pagination of 5 rows ### Video https://github.com/elastic/kibana/assets/140709379/cdac6a22-f239-4b70-b40c-93fc727418a6 Co-authored-by: Julien Lind --- .../fleet/sections/agents/enrollment_token_list_page/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx index 3a21103503ae5..a9adc6140c7c5 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/enrollment_token_list_page/index.tsx @@ -128,6 +128,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { const agentPolicy = agentPoliciesById[enrollmentKey.policy_id]; return !agentPolicy?.is_managed; }) || []; + const filteredTotal = rowItems.length; const columns = [ { @@ -294,7 +295,7 @@ export const EnrollmentTokenListPage: React.FunctionComponent<{}> = () => { pagination={{ pageIndex: pagination.currentPage - 1, pageSize: pagination.pageSize, - totalItemCount: total, + totalItemCount: filteredTotal, pageSizeOptions, }} onChange={({ page }: { page: { index: number; size: number } }) => { From cd4a782cac7689b12087d2cdb0b2c9bcc676728e Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Thu, 11 Jul 2024 11:33:52 +0200 Subject: [PATCH 70/82] [Discover] Update data view API docs (#187146) - Closes https://github.com/elastic/kibana/issues/187075 ## Summary This PR updates data view API docs. `customDescription` was added in https://github.com/elastic/kibana/pull/168577 --------- Co-authored-by: Lisa Cawley Co-authored-by: Davis McPhee --- docs/api/data-views/create.asciidoc | 7 +++- docs/api/data-views/update-fields.asciidoc | 5 ++- .../data_views/docs/openapi/bundled.json | 40 +++++++++++++++---- .../data_views/docs/openapi/bundled.yaml | 29 +++++++++++--- .../update_field_metadata_request.yaml | 11 +++-- .../create_data_view_request_object.yaml | 4 +- .../schemas/data_view_response_object.yaml | 4 +- .../components/schemas/fieldattrs.yaml | 13 +++++- ...@data_views@data_view@{viewid}@fields.yaml | 2 +- 9 files changed, 92 insertions(+), 23 deletions(-) diff --git a/docs/api/data-views/create.asciidoc b/docs/api/data-views/create.asciidoc index 2164983db11ea..32372639d2dbf 100644 --- a/docs/api/data-views/create.asciidoc +++ b/docs/api/data-views/create.asciidoc @@ -231,10 +231,13 @@ The API returns the {data-source} object: .Properties of the fieldAttrs[fieldName] objects: [%collapsible%open] ===== -`customLabel`::: +`customLabel`:: (Optional, string) Custom label for the field. -`count`::: +`customDescription`:: +(Optional, string) Custom description for the field. Max length is 300 characters. + +`count`:: (Optional, number) Popularity count for the field. ===== diff --git a/docs/api/data-views/update-fields.asciidoc b/docs/api/data-views/update-fields.asciidoc index 9b0b044238f36..0feacccb81863 100644 --- a/docs/api/data-views/update-fields.asciidoc +++ b/docs/api/data-views/update-fields.asciidoc @@ -5,7 +5,7 @@ ++++ experimental[] Update fields presentation metadata, such as `count`, -`customLabel`, and `format`. You can update multiple fields in one request. Updates +`customLabel`, `customDescription`, and `format`. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify `null` as the value. @@ -119,7 +119,8 @@ $ curl -X POST api/data_views/data_view/my-view/fields "customLabel": "Foo" }, "bar": { - "customLabel": "Bar" + "customLabel": "Bar", + "customDescription": "Bar Custom description" } } } diff --git a/src/plugins/data_views/docs/openapi/bundled.json b/src/plugins/data_views/docs/openapi/bundled.json index 28893b86cef3f..5f2506c46e609 100644 --- a/src/plugins/data_views/docs/openapi/bundled.json +++ b/src/plugins/data_views/docs/openapi/bundled.json @@ -1036,7 +1036,7 @@ "post": { "summary": "Update data view fields metadata in the default space", "operationId": "updateFieldsMetadataDefault", - "description": "Update fields presentation metadata such as count, customLabel and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value.\n", + "description": "Update fields presentation metadata such as count, customLabel, customDescription, and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value.\n", "tags": [ "data views" ], @@ -2786,11 +2786,16 @@ } }, "update_field_metadata_request": { - "summary": "Set popularity count for field foo.", + "summary": "Update multiple metadata fields.", "value": { "fields": { - "foo": { - "count": 123 + "field1": { + "count": 123, + "customLabel": "Field 1 label" + }, + "field2": { + "customLabel": "Field 2 label", + "customDescription": "Field 2 description" } } } @@ -3465,7 +3470,22 @@ }, "fieldattrs": { "type": "object", - "description": "A map of field attributes by field name." + "description": "A map of field attributes by field name.", + "properties": { + "count": { + "type": "integer", + "description": "Popularity count for the field." + }, + "customDescription": { + "type": "string", + "description": "Custom description for the field.", + "maxLength": 300 + }, + "customLabel": { + "type": "string", + "description": "Custom label for the field." + } + } }, "fieldformats": { "type": "object", @@ -3532,7 +3552,10 @@ "$ref": "#/components/schemas/allownoindex" }, "fieldAttrs": { - "$ref": "#/components/schemas/fieldattrs" + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/fieldattrs" + } }, "fieldFormats": { "$ref": "#/components/schemas/fieldformats" @@ -3591,7 +3614,10 @@ "$ref": "#/components/schemas/allownoindex" }, "fieldAttrs": { - "$ref": "#/components/schemas/fieldattrs" + "type": "object", + "additionalProperties": { + "$ref": "#/components/schemas/fieldattrs" + } }, "fieldFormats": { "$ref": "#/components/schemas/fieldformats" diff --git a/src/plugins/data_views/docs/openapi/bundled.yaml b/src/plugins/data_views/docs/openapi/bundled.yaml index dee19e6b1d67b..810f379b272e6 100644 --- a/src/plugins/data_views/docs/openapi/bundled.yaml +++ b/src/plugins/data_views/docs/openapi/bundled.yaml @@ -646,7 +646,7 @@ paths: summary: Update data view fields metadata in the default space operationId: updateFieldsMetadataDefault description: | - Update fields presentation metadata such as count, customLabel and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value. + Update fields presentation metadata such as count, customLabel, customDescription, and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value. tags: - data views parameters: @@ -1966,11 +1966,15 @@ components: data_view_id: ff959d40-b880-11e8-a6d9-e546fe2bba5f force: true update_field_metadata_request: - summary: Set popularity count for field foo. + summary: Update multiple metadata fields. value: fields: - foo: + field1: count: 123 + customLabel: Field 1 label + field2: + customLabel: Field 2 label + customDescription: Field 2 description create_runtime_field_request: summary: Create a runtime field. value: @@ -2507,6 +2511,17 @@ components: fieldattrs: type: object description: A map of field attributes by field name. + properties: + count: + type: integer + description: Popularity count for the field. + customDescription: + type: string + description: Custom description for the field. + maxLength: 300 + customLabel: + type: string + description: Custom label for the field. fieldformats: type: object description: A map of field formats by field name. @@ -2556,7 +2571,9 @@ components: allowNoIndex: $ref: '#/components/schemas/allownoindex' fieldAttrs: - $ref: '#/components/schemas/fieldattrs' + type: object + additionalProperties: + $ref: '#/components/schemas/fieldattrs' fieldFormats: $ref: '#/components/schemas/fieldformats' fields: @@ -2596,7 +2613,9 @@ components: allowNoIndex: $ref: '#/components/schemas/allownoindex' fieldAttrs: - $ref: '#/components/schemas/fieldattrs' + type: object + additionalProperties: + $ref: '#/components/schemas/fieldattrs' fieldFormats: $ref: '#/components/schemas/fieldformats' fields: diff --git a/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml b/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml index ffa1eba13150f..e16e7e4d38dcb 100644 --- a/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml +++ b/src/plugins/data_views/docs/openapi/components/examples/update_field_metadata_request.yaml @@ -1,9 +1,14 @@ -summary: Set popularity count for field foo. +summary: Update metadata for multiple fields. value: { "fields": { - "foo": { - "count": 123 + "field1": { + "count": 123, + "customLabel": "Field 1 label" + }, + "field2": { + "customLabel": "Field 2 label", + "customDescription": "Field 2 description" } } } \ No newline at end of file diff --git a/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml b/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml index ff2c34ed6d9ad..9ac5e0ddd796a 100644 --- a/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml +++ b/src/plugins/data_views/docs/openapi/components/schemas/create_data_view_request_object.yaml @@ -12,7 +12,9 @@ properties: allowNoIndex: $ref: 'allownoindex.yaml' fieldAttrs: - $ref: 'fieldattrs.yaml' + type: object + additionalProperties: + $ref: 'fieldattrs.yaml' fieldFormats: $ref: 'fieldformats.yaml' fields: diff --git a/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml b/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml index 9d3c67201896b..f850c2f7c565e 100644 --- a/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml +++ b/src/plugins/data_views/docs/openapi/components/schemas/data_view_response_object.yaml @@ -7,7 +7,9 @@ properties: allowNoIndex: $ref: 'allownoindex.yaml' fieldAttrs: - $ref: 'fieldattrs.yaml' + type: object + additionalProperties: + $ref: 'fieldattrs.yaml' fieldFormats: $ref: 'fieldformats.yaml' fields: diff --git a/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml b/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml index ede637d538a92..6d0cecd6b43b5 100644 --- a/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml +++ b/src/plugins/data_views/docs/openapi/components/schemas/fieldattrs.yaml @@ -1,2 +1,13 @@ type: object -description: A map of field attributes by field name. \ No newline at end of file +description: A map of field attributes by field name. +properties: + count: + type: integer + description: Popularity count for the field. + customDescription: + type: string + description: Custom description for the field. + maxLength: 300 + customLabel: + type: string + description: Custom label for the field. \ No newline at end of file diff --git a/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml b/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml index 58dd10b88b5d3..3c2526c073513 100644 --- a/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml +++ b/src/plugins/data_views/docs/openapi/paths/api@data_views@data_view@{viewid}@fields.yaml @@ -2,7 +2,7 @@ post: summary: Update data view fields metadata in the default space operationId: updateFieldsMetadataDefault description: > - Update fields presentation metadata such as count, customLabel and format. + Update fields presentation metadata such as count, customLabel, customDescription, and format. This functionality is in technical preview and may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify null as the value. tags: - data views From a4cd90b6f328ba87a13416fd1266217bafb7d7cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20=C3=81brah=C3=A1m?= Date: Thu, 11 Jul 2024 11:40:56 +0200 Subject: [PATCH 71/82] [EDR Workflows] Add warning for duplicated `event.category` for Process Descendant event filter (#187844) ## Summary ![warning](https://github.com/elastic/kibana/assets/39014407/998b8c57-f852-4983-b545-80c810f21a54) ### Checklist Delete any items that are not applicable to this PR. - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Elastic Machine --- .../view/components/form.test.tsx | 362 ++++++++++++++---- .../event_filters/view/components/form.tsx | 17 +- 2 files changed, 299 insertions(+), 80 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx index c355cc8bdea0b..7dc11f828187a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.test.tsx @@ -546,90 +546,294 @@ describe('Event filter form', () => { }); describe('Warnings', () => { - beforeEach(() => { - render(); - }); + describe('duplicate fields', () => { + it('should not show warning text when unique fields are added', async () => { + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value', + }, + { + field: 'file.name', + operator: 'excluded', + type: 'match', + value: 'some other value', + }, + ]; + render(); + expect(await renderResult.findByDisplayValue('some value')).toBeInTheDocument(); - it('should not show warning text when unique fields are added', async () => { - formProps.item.entries = [ - { - field: 'event.category', - operator: 'included', - type: 'match', - value: 'some value', - }, - { - field: 'file.name', - operator: 'excluded', - type: 'match', - value: 'some other value', - }, - ]; - rerender(); - expect(renderResult.queryByTestId('duplicate-fields-warning-message')).toBeNull(); - }); + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + }); - it('should not show warning text when field values are not added', async () => { - formProps.item.entries = [ - { - field: 'event.category', - operator: 'included', - type: 'match', - value: '', - }, - { - field: 'event.category', - operator: 'excluded', - type: 'match', - value: '', - }, - ]; - rerender(); - expect(renderResult.queryByTestId('duplicate-fields-warning-message')).toBeNull(); - }); + it('should not show warning text when field values are not added', async () => { + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: '', + }, + { + field: 'event.category', + operator: 'excluded', + type: 'match', + value: '', + }, + ]; + render(); + expect((await renderResult.findAllByTestId('fieldAutocompleteComboBox')).length).toBe(2); - it('should show warning text when duplicate fields are added with values', async () => { - formProps.item.entries = [ - { - field: 'event.category', - operator: 'included', - type: 'match', - value: 'some value', - }, - { - field: 'event.category', - operator: 'excluded', - type: 'match', - value: 'some other value', - }, - ]; - rerender(); - expect(renderResult.findByTestId('duplicate-fields-warning-message')).not.toBeNull(); + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + }); + + it('should show warning text when duplicate fields are added with values', async () => { + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value', + }, + { + field: 'event.category', + operator: 'excluded', + type: 'match', + value: 'some other value', + }, + ]; + render(); + + expect( + await renderResult.findByTestId('duplicate-fields-warning-message') + ).toBeInTheDocument(); + }); + + describe('in relation with Process Descendant filtering', () => { + it('should not show warning text when event.category is added but feature flag is disabled', async () => { + mockedContext.setExperimentalFlag({ + filterProcessDescendantsForEventFiltersEnabled: false, + }); + + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value 1', + }, + ]; + formProps.item.tags = [FILTER_PROCESS_DESCENDANTS_TAG]; + + render(); + expect(await renderResult.findByDisplayValue('some value 1')).toBeInTheDocument(); + + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + }); + + it('should not show warning text when event.category is added but process descendant filter is disabled', async () => { + mockedContext.setExperimentalFlag({ + filterProcessDescendantsForEventFiltersEnabled: true, + }); + + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value 2', + }, + ]; + formProps.item.tags = []; + + render(); + expect(await renderResult.findByDisplayValue('some value 2')).toBeInTheDocument(); + + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + }); + + it('should not show warning text when event.category is NOT added and process descendant filter is enabled', async () => { + mockedContext.setExperimentalFlag({ + filterProcessDescendantsForEventFiltersEnabled: true, + }); + + formProps.item.entries = [ + { + field: 'event.action', + operator: 'included', + type: 'match', + value: 'some value 3', + }, + ]; + formProps.item.tags = [FILTER_PROCESS_DESCENDANTS_TAG]; + + render(); + expect(await renderResult.findByDisplayValue('some value 3')).toBeInTheDocument(); + + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + }); + + it('should show warning text when event.category is added and process descendant filter is enabled', async () => { + mockedContext.setExperimentalFlag({ + filterProcessDescendantsForEventFiltersEnabled: true, + }); + + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value 4', + }, + ]; + formProps.item.tags = [FILTER_PROCESS_DESCENDANTS_TAG]; + + render(); + expect(await renderResult.findByDisplayValue('some value 4')).toBeInTheDocument(); + + expect( + await renderResult.findByTestId('duplicate-fields-warning-message') + ).toBeInTheDocument(); + }); + + it('should add warning text when switching to process descendant filtering', async () => { + mockedContext.setExperimentalFlag({ + filterProcessDescendantsForEventFiltersEnabled: true, + }); + + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value 5', + }, + ]; + formProps.item.tags = []; + + render(); + expect(await renderResult.findByDisplayValue('some value 5')).toBeInTheDocument(); + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + + // switch to Process Descendant filtering + userEvent.click(renderResult.getByTestId(`${formPrefix}-filterProcessDescendantsButton`)); + rerenderWithLatestProps(); + + expect( + await renderResult.findByTestId('duplicate-fields-warning-message') + ).toBeInTheDocument(); + }); + + it('should remove warning text when switching from process descendant filtering', async () => { + mockedContext.setExperimentalFlag({ + filterProcessDescendantsForEventFiltersEnabled: true, + }); + + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value 6', + }, + ]; + formProps.item.tags = [FILTER_PROCESS_DESCENDANTS_TAG]; + + render(); + + expect( + await renderResult.findByTestId('duplicate-fields-warning-message') + ).toBeInTheDocument(); + + // switch to classic Event filtering + userEvent.click(renderResult.getByTestId(`${formPrefix}-filterEventsButton`)); + rerenderWithLatestProps(); + + expect(await renderResult.findByDisplayValue('some value 6')).toBeInTheDocument(); + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + }); + + it('should remove warning text when removing `event.category`', async () => { + mockedContext.setExperimentalFlag({ + filterProcessDescendantsForEventFiltersEnabled: true, + }); + + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'some value 6', + }, + ]; + formProps.item.tags = [FILTER_PROCESS_DESCENDANTS_TAG]; + + render(); + + expect( + await renderResult.findByTestId('duplicate-fields-warning-message') + ).toBeInTheDocument(); + + // switch to classic Event filtering + userEvent.click(renderResult.getByTestId(`builderItemEntryDeleteButton`)); + rerenderWithLatestProps(); + + expect( + renderResult.queryByTestId('duplicate-fields-warning-message') + ).not.toBeInTheDocument(); + }); + }); }); - it('should not show warning callout when wildcard is used with the "MATCHES" operator', async () => { - formProps.item.entries = [ - { - field: 'event.category', - operator: 'included', - type: 'wildcard', - value: 'valuewithwildcard*', - }, - ]; - rerender(); - expect(renderResult.queryByTestId('wildcardWithWrongOperatorCallout')).toBeNull(); - }); - it('should show warning callout when wildcard is used with the "IS" operator', async () => { - formProps.item.entries = [ - { - field: 'event.category', - operator: 'included', - type: 'match', - value: 'valuewithwildcard*', - }, - ]; - rerender(); - await expect(renderResult.findByTestId('wildcardWithWrongOperatorCallout')).not.toBeNull(); + describe('wildcard with wrong operator', () => { + it('should not show warning callout when wildcard is used with the "MATCHES" operator', async () => { + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'wildcard', + value: 'valuewithwildcard*', + }, + ]; + render(); + expect(await renderResult.findByDisplayValue('valuewithwildcard*')).toBeInTheDocument(); + + expect( + renderResult.queryByTestId('wildcardWithWrongOperatorCallout') + ).not.toBeInTheDocument(); + }); + + it('should show warning callout when wildcard is used with the "IS" operator', async () => { + formProps.item.entries = [ + { + field: 'event.category', + operator: 'included', + type: 'match', + value: 'valuewithwildcard*', + }, + ]; + render(); + + expect( + await renderResult.findByTestId('wildcardWithWrongOperatorCallout') + ).toBeInTheDocument(); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx index 4275502961848..afdab70202f12 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx @@ -41,6 +41,7 @@ import { useIsExperimentalFeatureEnabled } from '../../../../../common/hooks/use import { useGetUpdatedTags } from '../../../../hooks/artifacts'; import { FILTER_PROCESS_DESCENDANTS_TAG, + PROCESS_DESCENDANT_EVENT_FILTER_EXTRA_ENTRY, PROCESS_DESCENDANT_EVENT_FILTER_EXTRA_ENTRY_TEXT, } from '../../../../../../common/endpoint/service/artifacts/constants'; import { @@ -545,11 +546,19 @@ export const EventFiltersForm: React.FC e.field) || ['']; + + if (isFilterProcessDescendantsFeatureEnabled && isFilterProcessDescendantsSelected) { + addedFields.push(PROCESS_DESCENDANT_EVENT_FILTER_EXTRA_ENTRY.field); + } + setHasDuplicateFields(computeHasDuplicateFields(getAddedFieldsCounts(addedFields))); if (!hasFormChanged) setHasFormChanged(true); return; + } else { + setHasDuplicateFields(false); } // handle wildcard with wrong operator case @@ -576,7 +585,13 @@ export const EventFiltersForm: React.FC From 5e0a52c4a24c4ee4324ab424489a6203e30f7f7a Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 11 Jul 2024 11:44:26 +0200 Subject: [PATCH 72/82] [ES|QL] [Unified Histogram] Changes the ratio to be rectangle (#187981) ## Summary image We had a chat with @gvnmagni about the ratio of the metric in Discover. The square one is okeish but not for multi values. We decided to change it in rectangle to be closer to how it will look in a dashboard --- .../public/chart/histogram.tsx | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/plugins/unified_histogram/public/chart/histogram.tsx b/src/plugins/unified_histogram/public/chart/histogram.tsx index 50c8f7242c589..70e1f039bc3ba 100644 --- a/src/plugins/unified_histogram/public/chart/histogram.tsx +++ b/src/plugins/unified_histogram/public/chart/histogram.tsx @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import { useEuiTheme, useResizeObserver } from '@elastic/eui'; +import { useEuiTheme } from '@elastic/eui'; import { css } from '@emotion/react'; -import React, { useState, useRef, useEffect } from 'react'; +import React, { useState } from 'react'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { DefaultInspectorAdapters, Datatable } from '@kbn/expressions-plugin/common'; import type { IKibanaSearchResponse } from '@kbn/search-types'; @@ -106,7 +106,6 @@ export function Histogram({ abortController, }: HistogramProps) { const [bucketInterval, setBucketInterval] = useState(); - const [chartSize, setChartSize] = useState('100%'); const { timeRangeText, timeRangeDisplay } = useTimeRange({ uiSettings, bucketInterval, @@ -115,19 +114,8 @@ export function Histogram({ isPlainRecord, timeField: dataView.timeFieldName, }); - const chartRef = useRef(null); - const { height: containerHeight, width: containerWidth } = useResizeObserver(chartRef.current); const { attributes } = visContext; - useEffect(() => { - if (attributes.visualizationType === 'lnsMetric') { - const size = containerHeight < containerWidth ? containerHeight : containerWidth; - setChartSize(`${size}px`); - } else { - setChartSize('100%'); - } - }, [attributes, containerHeight, containerWidth]); - const onLoad = useStableCallback( ( isLoading: boolean, @@ -197,7 +185,7 @@ export function Histogram({ } & .lnsExpressionRenderer { - width: ${chartSize}; + width: ${attributes.visualizationType === 'lnsMetric' ? '90$' : '100%'}; margin: auto; box-shadow: ${attributes.visualizationType === 'lnsMetric' ? boxShadow : 'none'}; } @@ -222,7 +210,6 @@ export function Histogram({ data-request-data={requestData} data-suggestion-type={visContext.suggestionType} css={chartCss} - ref={chartRef} > Date: Thu, 11 Jul 2024 11:49:15 +0200 Subject: [PATCH 73/82] `@kbn/config-schema`: Add support for multi-unit duration (#187888) --- packages/kbn-config-schema/README.md | 6 +++++- .../kbn-config-schema/src/duration/index.ts | 19 ++++++++++++------ .../src/types/duration_type.test.ts | 20 +++++++++++++++++-- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/packages/kbn-config-schema/README.md b/packages/kbn-config-schema/README.md index a1e56f05cd528..2074ab7698e63 100644 --- a/packages/kbn-config-schema/README.md +++ b/packages/kbn-config-schema/README.md @@ -461,8 +461,12 @@ const valueSchema = schema.duration({ defaultValue: '70ms' }); ``` __Notes:__ -* The string value for `schema.duration()` supports the following optional suffixes: `ms`, `s`, `m`, `h`, `d`, `w`, `M` and `Y`. The default suffix is `ms`. +* The string value for `schema.duration()` supports the following optional suffixes: `ms`, `s`, `m`, `h`, `d`, `w`, `M` and `y`. The default suffix is `ms`. * The number value is treated as a number of milliseconds and hence should be a positive integer, e.g. `100` is equal to `'100ms'`. +* Multi-unit duration strings are supported (`1m30s`). + * Spaces are not allowed. + * It allows any order in the units (`1m30s1d`). + * It allows the same unit to be specified multiple times (`1m30s50m` is the same as `51m30s`). #### `schema.conditional()` diff --git a/packages/kbn-config-schema/src/duration/index.ts b/packages/kbn-config-schema/src/duration/index.ts index 1b1d47a24abd3..5111a603bfbdc 100644 --- a/packages/kbn-config-schema/src/duration/index.ts +++ b/packages/kbn-config-schema/src/duration/index.ts @@ -6,29 +6,36 @@ * Side Public License, v 1. */ -import { Duration, duration as momentDuration, DurationInputArg2, isDuration } from 'moment'; +import { Duration, duration as momentDuration, isDuration } from 'moment'; export type { Duration }; export { isDuration }; -const timeFormatRegex = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|M|Y)$/; +const timeFormatRegex = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|M|y|Y)(.*)$/; +type TimeUnitString = 'ms' | 's' | 'm' | 'h' | 'd' | 'w' | 'M' | 'y' | 'Y'; // Moment officially supports lowercased 'y', but keeping 'Y' for BWC -function stringToDuration(text: string) { +function stringToDuration(text: string): Duration { const result = timeFormatRegex.exec(text); if (!result) { const number = Number(text); if (typeof number !== 'number' || isNaN(number)) { throw new Error( `Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format ` + - `[ms|s|m|h|d|w|M|Y] (e.g. '70ms', '5s', '3d', '1Y'), where the duration is a safe positive integer.` + `[ms|s|m|h|d|w|M|y] (e.g. '70ms', '5s', '3d', '1y', '1m30s'), where the duration is a safe positive integer.` ); } return numberToDuration(number); } const count = parseInt(result[1], 10); - const unit = result[2] as DurationInputArg2; + const unit = result[2] as TimeUnitString; + const rest = result[3]; - return momentDuration(count, unit); + const duration = momentDuration(count, unit as Exclude); // Moment still supports capital 'Y', but officially (and type-wise), it doesn't. + + if (rest) { + return duration.add(stringToDuration(rest)); + } + return duration; } function numberToDuration(numberMs: number) { diff --git a/packages/kbn-config-schema/src/types/duration_type.test.ts b/packages/kbn-config-schema/src/types/duration_type.test.ts index 18327b65cd1f6..779962b6354b8 100644 --- a/packages/kbn-config-schema/src/types/duration_type.test.ts +++ b/packages/kbn-config-schema/src/types/duration_type.test.ts @@ -24,6 +24,22 @@ test('handles number', () => { expect(duration().validate(123000)).toEqual(momentDuration(123000)); }); +test('handles multi-unit', () => { + expect(duration().validate('1m30s')).toEqual(momentDuration(90000)); + expect(duration().validate('1m30s70ms')).toEqual(momentDuration(90070)); +}); + +test.each([60000, '60000', '60000ms', '60s', '1m', '1m0s'])( + 'multiple ways of introducing 1 minute: %p', + (d) => { + expect(duration().validate(d)).toEqual(momentDuration(60000)); + } +); + +test('it supports years as Y and y', () => { + expect(duration().validate('1y')).toEqual(duration().validate('1Y')); +}); + test('is required by default', () => { expect(() => duration().validate(undefined)).toThrowErrorMatchingInlineSnapshot( `"expected value of type [moment.Duration] but got [undefined]"` @@ -184,10 +200,10 @@ test('returns error when not valid string or non-safe positive integer', () => { ); expect(() => duration().validate('123foo')).toThrowErrorMatchingInlineSnapshot( - `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|Y] (e.g. '70ms', '5s', '3d', '1Y'), where the duration is a safe positive integer."` + `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|y] (e.g. '70ms', '5s', '3d', '1y', '1m30s'), where the duration is a safe positive integer."` ); expect(() => duration().validate('123 456')).toThrowErrorMatchingInlineSnapshot( - `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|Y] (e.g. '70ms', '5s', '3d', '1Y'), where the duration is a safe positive integer."` + `"Failed to parse value as time value. Value must be a duration in milliseconds, or follow the format [ms|s|m|h|d|w|M|y] (e.g. '70ms', '5s', '3d', '1y', '1m30s'), where the duration is a safe positive integer."` ); }); From 57be31c8cb95a730be37d30af9cda3994712ee2e Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Thu, 11 Jul 2024 11:55:08 +0200 Subject: [PATCH 74/82] Split types between OS and Ops metric collectors (#187836) ## Summary Fix https://github.com/elastic/kibana/issues/141922 --- .../core-metrics-collectors-server-internal/index.ts | 3 +-- .../core-metrics-collectors-server-internal/src/os.ts | 4 ++-- .../src/ops_metrics_collector.ts | 8 +++++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/index.ts b/packages/core/metrics/core-metrics-collectors-server-internal/index.ts index 351129cdc8ba3..d726b0339a0bf 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/index.ts +++ b/packages/core/metrics/core-metrics-collectors-server-internal/index.ts @@ -6,8 +6,7 @@ * Side Public License, v 1. */ -export { OsMetricsCollector } from './src/os'; -export type { OpsMetricsCollectorOptions } from './src/os'; +export { OsMetricsCollector, type OsMetricsCollectorOptions } from './src/os'; export { ProcessMetricsCollector } from './src/process'; export { ServerMetricsCollector } from './src/server'; export { EventLoopDelaysMonitor } from './src/event_loop_delays_monitor'; diff --git a/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts b/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts index 350b01a8100eb..049597cfa1f12 100644 --- a/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts +++ b/packages/core/metrics/core-metrics-collectors-server-internal/src/os.ts @@ -15,7 +15,7 @@ import { OsCgroupMetricsCollector } from './cgroup'; const getos = promisify(getosAsync); -export interface OpsMetricsCollectorOptions { +export interface OsMetricsCollectorOptions { logger: Logger; cpuPath?: string; cpuAcctPath?: string; @@ -24,7 +24,7 @@ export interface OpsMetricsCollectorOptions { export class OsMetricsCollector implements MetricsCollector { private readonly cgroupCollector: OsCgroupMetricsCollector; - constructor(options: OpsMetricsCollectorOptions) { + constructor(options: OsMetricsCollectorOptions) { this.cgroupCollector = new OsCgroupMetricsCollector({ ...options, logger: options.logger.get('cgroup'), diff --git a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts index 2e358fc121bce..f35213a0e0480 100644 --- a/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts +++ b/packages/core/metrics/core-metrics-server-internal/src/ops_metrics_collector.ts @@ -7,16 +7,22 @@ */ import { Server as HapiServer } from '@hapi/hapi'; +import type { Logger } from '@kbn/logging'; import type { OpsMetrics, MetricsCollector } from '@kbn/core-metrics-server'; import type { AgentStatsProvider } from '@kbn/core-elasticsearch-client-server-internal'; import { ProcessMetricsCollector, OsMetricsCollector, - type OpsMetricsCollectorOptions, ServerMetricsCollector, ElasticsearchClientsMetricsCollector, } from '@kbn/core-metrics-collectors-server-internal'; +export interface OpsMetricsCollectorOptions { + logger: Logger; + cpuPath?: string; + cpuAcctPath?: string; +} + export class OpsMetricsCollector implements MetricsCollector { private readonly processCollector: ProcessMetricsCollector; private readonly osCollector: OsMetricsCollector; From 35b5fcc4c4e898cd58e2624c244078f55112aa85 Mon Sep 17 00:00:00 2001 From: jennypavlova Date: Thu, 11 Jul 2024 12:00:26 +0200 Subject: [PATCH 75/82] [APM] Add sparklines to the multi-signal view table (#187782) Closes #187567 ## Summary This PR adds sparklines to the multi-signal view table ![image](https://github.com/elastic/kibana/assets/14139027/d29aa76f-1ec1-4720-bf85-84e818971bc0) ## Testing 1. Enable `observability:apmEnableMultiSignal` in advanced settings

2. Run the entities definition in the dev tools ``` POST kbn:/internal/api/entities/definition { "id": "apm-services-with-metadata", "name": "Services from logs and metrics", "displayNameTemplate": "test", "history": { "timestampField": "@timestamp", "interval": "5m" }, "type": "service", "indexPatterns": [ "logs-*", "metrics-*" ], "timestampField": "@timestamp", "lookback": "5m", "identityFields": [ { "field": "service.name", "optional": false }, { "field": "service.environment", "optional": true } ], "identityTemplate": "{{service.name}}:{{service.environment}}", "metadata": [ "tags", "host.name", "data_stream.type", "service.name", "service.instance.id", "service.namespace", "service.environment", "service.version", "service.runtime.name", "service.runtime.version", "service.node.name", "service.language.name", "agent.name", "cloud.provider", "cloud.instance.id", "cloud.availability_zone", "cloud.instance.name", "cloud.machine.type", "container.id" ], "metrics": [ { "name": "latency", "equation": "A", "metrics": [ { "name": "A", "aggregation": "avg", "field": "transaction.duration.histogram" } ] }, { "name": "throughput", "equation": "A / 5", "metrics": [ { "name": "A", "aggregation": "doc_count", "filter": "transaction.duration.histogram:*" } ] }, { "name": "failedTransactionRate", "equation": "A / B", "metrics": [ { "name": "A", "aggregation": "doc_count", "filter": "event.outcome: \"failure\"" }, { "name": "B", "aggregation": "doc_count", "filter": "event.outcome: *" } ] }, { "name": "logErrorRate", "equation": "A / B", "metrics": [ { "name": "A", "aggregation": "doc_count", "filter": "log.level: \"error\"" }, { "name": "B", "aggregation": "doc_count", "filter": "log.level: *" } ] }, { "name": "logRatePerMinute", "equation": "A / 5", "metrics": [ { "name": "A", "aggregation": "doc_count", "filter": "log.level: \"error\"" } ] } ] } ```
3. Generate data with synthrace 1. logs only: `node scripts/synthtrace simple_logs.ts` 2. APM only: `node scripts/synthtrace simple_trace.ts` 4. Open services inventory - the sparklines should be visible next to the values in the table (big screen only like in the services table) image - on small screens, the sparklines should not be visible image --- .../multi_signal_inventory/index.tsx | 80 +++++++- .../table/get_service_columns.tsx | 42 ++-- .../table/multi_signal_services_table.tsx | 10 +- .../server/routes/entities/services/routes.ts | 117 ++++++++++- ...service_transaction_detailed_statistics.ts | 2 +- .../get_logs_error_rate_timeseries.ts | 6 +- ...vices_entities_detailed_statistics.spec.ts | 191 ++++++++++++++++++ 7 files changed, 421 insertions(+), 27 deletions(-) create mode 100644 x-pack/test/apm_api_integration/tests/entities/services/services_entities_detailed_statistics.spec.ts diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/index.tsx index af2282ea19219..01b8b9af7985f 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/index.tsx @@ -8,9 +8,10 @@ import { EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { v4 as uuidv4 } from 'uuid'; +import { ApmDocumentType } from '../../../../../common/document_type'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { useApmParams } from '../../../../hooks/use_apm_params'; -import { useFetcher } from '../../../../hooks/use_fetcher'; +import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; import { useTimeRange } from '../../../../hooks/use_time_range'; import { EmptyMessage } from '../../../shared/empty_message'; import { SearchBar } from '../../../shared/search_bar/search_bar'; @@ -22,6 +23,9 @@ import { MultiSignalServicesTable, ServiceInventoryFieldName, } from './table/multi_signal_services_table'; +import { ServiceListItem } from '../../../../../common/service_inventory'; +import { usePreferredDataSourceAndBucketSize } from '../../../../hooks/use_preferred_data_source_and_bucket_size'; +import { useProgressiveFetcher } from '../../../../hooks/use_progressive_fetcher'; type MainStatisticsApiResponse = APIReturnType<'GET /internal/apm/entities/services'>; @@ -74,9 +78,72 @@ function useServicesEntitiesMainStatisticsFetcher() { return { mainStatisticsData: data, mainStatisticsStatus: status }; } -export const MultiSignalInventory = () => { +function useServicesEntitiesDetailedStatisticsFetcher({ + mainStatisticsFetch, + services, +}: { + mainStatisticsFetch: ReturnType; + services: ServiceListItem[]; +}) { + const { + query: { rangeFrom, rangeTo, environment, kuery }, + } = useApmParams('/services'); + + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + + const dataSourceOptions = usePreferredDataSourceAndBucketSize({ + start, + end, + kuery, + type: ApmDocumentType.ServiceTransactionMetric, + numBuckets: 20, + }); + + const { mainStatisticsData, mainStatisticsStatus } = mainStatisticsFetch; + + const timeseriesDataFetch = useProgressiveFetcher( + (callApmApi) => { + const serviceNames = services.map(({ serviceName }) => serviceName); + + if ( + start && + end && + serviceNames.length > 0 && + mainStatisticsStatus === FETCH_STATUS.SUCCESS && + dataSourceOptions + ) { + return callApmApi('POST /internal/apm/entities/services/detailed_statistics', { + params: { + query: { + environment, + kuery, + start, + end, + documentType: dataSourceOptions.source.documentType, + rollupInterval: dataSourceOptions.source.rollupInterval, + bucketSizeInSeconds: dataSourceOptions.bucketSizeInSeconds, + }, + body: { + // Service name is sorted to guarantee the same order every time this API is called so the result can be cached. + serviceNames: JSON.stringify(serviceNames.sort()), + }, + }, + }); + } + }, + // only fetches detailed statistics when requestId is invalidated by main statistics api call or offset is changed + // eslint-disable-next-line react-hooks/exhaustive-deps + [mainStatisticsData.requestId, services], + { preservePreviousData: false } + ); + + return { timeseriesDataFetch }; +} + +export function MultiSignalInventory() { const [searchQuery, setSearchQuery] = React.useState(''); const { mainStatisticsData, mainStatisticsStatus } = useServicesEntitiesMainStatisticsFetcher(); + const mainStatisticsFetch = useServicesEntitiesMainStatisticsFetcher(); const initialSortField = ServiceInventoryFieldName.Throughput; @@ -86,6 +153,11 @@ export const MultiSignalInventory = () => { fieldsToSearch: [ServiceInventoryFieldName.ServiceName], }); + const { timeseriesDataFetch } = useServicesEntitiesDetailedStatisticsFetcher({ + mainStatisticsFetch, + services: mainStatisticsData.services, + }); + return ( <> @@ -110,6 +182,8 @@ export const MultiSignalInventory = () => { initialSortField={initialSortField} initialPageSize={INITIAL_PAGE_SIZE} initialSortDirection={INITIAL_SORT_DIRECTION} + timeseriesData={timeseriesDataFetch?.data} + timeseriesDataLoading={timeseriesDataFetch.status === FETCH_STATUS.LOADING} noItemsMessage={ { ); -}; +} diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/get_service_columns.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/get_service_columns.tsx index b68201894b0d3..a5661e36141ac 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/get_service_columns.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/get_service_columns.tsx @@ -31,15 +31,26 @@ import { TruncateWithTooltip } from '../../../../shared/truncate_with_tooltip'; import { ServiceInventoryFieldName } from './multi_signal_services_table'; import { EntityServiceListItem, SignalTypes } from '../../../../../../common/entities/types'; import { isApmSignal } from '../../../../../utils/get_signal_type'; +import { APIReturnType } from '../../../../../services/rest/create_call_apm_api'; + +type ServicesDetailedStatisticsAPIResponse = + APIReturnType<'POST /internal/apm/entities/services/detailed_statistics'>; + export function getServiceColumns({ query, breakpoints, link, + timeseriesDataLoading, + timeseriesData, }: { query: TypeOf['query']; breakpoints: Breakpoints; link: any; + timeseriesDataLoading: boolean; + timeseriesData?: ServicesDetailedStatisticsAPIResponse; }): Array> { + const { isSmall, isLarge } = breakpoints; + const showWhenSmallOrGreaterThanLarge = isSmall || !isLarge; return [ { field: ServiceInventoryFieldName.ServiceName, @@ -90,17 +101,18 @@ export function getServiceColumns({ sortable: true, dataType: 'number', align: RIGHT_ALIGNMENT, - render: (_, { metrics, signalTypes }) => { + render: (_, { metrics, serviceName, signalTypes }) => { const { currentPeriodColor } = getTimeSeriesColor(ChartType.LATENCY_AVG); return !isApmSignal(signalTypes) ? ( ) : ( ); }, @@ -113,17 +125,18 @@ export function getServiceColumns({ sortable: true, dataType: 'number', align: RIGHT_ALIGNMENT, - render: (_, { metrics, signalTypes }) => { + render: (_, { metrics, serviceName, signalTypes }) => { const { currentPeriodColor } = getTimeSeriesColor(ChartType.THROUGHPUT); return !isApmSignal(signalTypes) ? ( ) : ( ); }, @@ -136,17 +149,18 @@ export function getServiceColumns({ sortable: true, dataType: 'number', align: RIGHT_ALIGNMENT, - render: (_, { metrics, signalTypes }) => { + render: (_, { metrics, serviceName, signalTypes }) => { const { currentPeriodColor } = getTimeSeriesColor(ChartType.FAILED_TRANSACTION_RATE); return !isApmSignal(signalTypes) ? ( ) : ( ); }, @@ -159,15 +173,16 @@ export function getServiceColumns({ sortable: true, dataType: 'number', align: RIGHT_ALIGNMENT, - render: (_, { metrics }) => { + render: (_, { metrics, serviceName }) => { const { currentPeriodColor } = getTimeSeriesColor(ChartType.LOG_RATE); return ( ); }, @@ -180,15 +195,16 @@ export function getServiceColumns({ sortable: true, dataType: 'number', align: RIGHT_ALIGNMENT, - render: (_, { metrics }) => { + render: (_, { metrics, serviceName }) => { const { currentPeriodColor } = getTimeSeriesColor(ChartType.LOG_ERROR_RATE); return ( ); }, diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/multi_signal_services_table.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/multi_signal_services_table.tsx index deffe7a1de5ba..5320fef8f22db 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/multi_signal_services_table.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/multi_signal_inventory/table/multi_signal_services_table.tsx @@ -17,6 +17,8 @@ import { ManagedTable } from '../../../../shared/managed_table'; import { getServiceColumns } from './get_service_columns'; type MainStatisticsApiResponse = APIReturnType<'GET /internal/apm/entities/services'>; +type ServicesDetailedStatisticsAPIResponse = + APIReturnType<'POST /internal/apm/entities/services/detailed_statistics'>; export enum ServiceInventoryFieldName { ServiceName = 'serviceName', @@ -35,6 +37,8 @@ interface Props { initialSortDirection: 'asc' | 'desc'; noItemsMessage: React.ReactNode; data: MainStatisticsApiResponse['services']; + timeseriesDataLoading: boolean; + timeseriesData?: ServicesDetailedStatisticsAPIResponse; } export function MultiSignalServicesTable({ @@ -44,6 +48,8 @@ export function MultiSignalServicesTable({ initialPageSize, initialSortDirection, noItemsMessage, + timeseriesDataLoading, + timeseriesData, }: Props) { const breakpoints = useBreakpoints(); const { query } = useApmParams('/services'); @@ -55,8 +61,10 @@ export function MultiSignalServicesTable({ query: omit(query, 'page', 'pageSize', 'sortDirection', 'sortField'), breakpoints, link, + timeseriesDataLoading, + timeseriesData, }); - }, [query, link, breakpoints]); + }, [query, breakpoints, link, timeseriesDataLoading, timeseriesData]); return ( diff --git a/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts b/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts index 895129c33bdab..52c8e6983384c 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/entities/services/routes.ts @@ -4,12 +4,24 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import Boom from '@hapi/boom'; +import { toNumberRt, jsonRt } from '@kbn/io-ts-utils'; import * as t from 'io-ts'; +import { offsetRt } from '../../../../common/comparison_rt'; +import { getApmEventClient } from '../../../lib/helpers/get_apm_event_client'; +import { getRandomSampler } from '../../../lib/helpers/get_random_sampler'; import { EntityServiceListItem } from '../../../../common/entities/types'; import { environmentQuery } from '../../../../common/utils/environment_query'; import { createEntitiesESClient } from '../../../lib/helpers/create_es_client/create_assets_es_client/create_assets_es_clients'; import { createApmServerRoute } from '../../apm_routes/create_apm_server_route'; -import { environmentRt, kueryRt, rangeRt } from '../../default_api_types'; +import { + environmentRt, + kueryRt, + probabilityRt, + rangeRt, + serviceTransactionDataSourceRt, +} from '../../default_api_types'; +import { getServiceTransactionDetailedStatsPeriods } from '../../services/get_services_detailed_statistics/get_service_transaction_detailed_statistics'; import { getServiceEntities } from './get_service_entities'; export interface EntityServicesResponse { @@ -46,6 +58,99 @@ const servicesEntitiesRoute = createApmServerRoute({ }, }); +const servicesEntitiesDetailedStatisticsRoute = createApmServerRoute({ + endpoint: 'POST /internal/apm/entities/services/detailed_statistics', + params: t.type({ + query: t.intersection([ + environmentRt, + kueryRt, + rangeRt, + t.intersection([offsetRt, probabilityRt, serviceTransactionDataSourceRt]), + t.type({ + bucketSizeInSeconds: toNumberRt, + }), + ]), + body: t.type({ serviceNames: jsonRt.pipe(t.array(t.string)) }), + }), + options: { tags: ['access:apm'] }, + handler: async (resources) => { + const { + context, + params, + request, + plugins: { security, logsDataAccess }, + } = resources; + + const [coreContext, logsDataAccessStart] = await Promise.all([ + context.core, + logsDataAccess.start(), + ]); + + const { + environment, + kuery, + offset, + start, + end, + probability, + documentType, + rollupInterval, + bucketSizeInSeconds, + } = params.query; + + const { serviceNames } = params.body; + + if (!serviceNames.length) { + throw Boom.badRequest(`serviceNames cannot be empty`); + } + + const [apmEventClient, randomSampler] = await Promise.all([ + getApmEventClient(resources), + getRandomSampler({ security, request, probability }), + ]); + + const logsParams = { + esClient: coreContext.elasticsearch.client.asCurrentUser, + identifyingMetadata: 'service.name', + timeFrom: start, + timeTo: end, + kuery, + serviceEnvironmentQuery: environmentQuery(environment), + serviceNames, + }; + + const [ + currentPeriodLogsRateTimeseries, + currentPeriodLogsErrorRateTimeseries, + apmServiceTransactionDetailedStatsPeriods, + ] = await Promise.all([ + logsDataAccessStart.services.getLogsRateTimeseries(logsParams), + logsDataAccessStart.services.getLogsErrorRateTimeseries(logsParams), + getServiceTransactionDetailedStatsPeriods({ + environment, + kuery, + apmEventClient, + documentType, + rollupInterval, + bucketSizeInSeconds, + offset, + serviceNames, + start, + end, + randomSampler, + }), + ]); + + return { + currentPeriod: { + apm: { ...apmServiceTransactionDetailedStatsPeriods.currentPeriod }, + logErrorRate: { ...currentPeriodLogsErrorRateTimeseries }, + logRate: { ...currentPeriodLogsRateTimeseries }, + }, + }; + }, +}); + const serviceLogRateTimeseriesRoute = createApmServerRoute({ endpoint: 'GET /internal/apm/entities/services/{serviceName}/logs_rate_timeseries', params: t.type({ @@ -65,8 +170,8 @@ const serviceLogRateTimeseriesRoute = createApmServerRoute({ const { serviceName } = params.path; const { start, end, kuery, environment } = params.query; - const curentPeriodlogsRateTimeseries = await logsDataAccessStart.services.getLogsRateTimeseries( - { + const currentPeriodLogsRateTimeseries = + await logsDataAccessStart.services.getLogsRateTimeseries({ esClient: coreContext.elasticsearch.client.asCurrentUser, identifyingMetadata: 'service.name', timeFrom: start, @@ -74,10 +179,9 @@ const serviceLogRateTimeseriesRoute = createApmServerRoute({ kuery, serviceEnvironmentQuery: environmentQuery(environment), serviceNames: [serviceName], - } - ); + }); - return { currentPeriod: curentPeriodlogsRateTimeseries }; + return { currentPeriod: currentPeriodLogsRateTimeseries }; }, }); @@ -118,4 +222,5 @@ export const servicesEntitiesRoutesRepository = { ...servicesEntitiesRoute, ...serviceLogRateTimeseriesRoute, ...serviceLogErrorRateTimeseriesRoute, + ...servicesEntitiesDetailedStatisticsRoute, }; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts b/x-pack/plugins/observability_solution/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts index 1ef359016c4d9..fd425d62fcb38 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts @@ -24,7 +24,7 @@ import { import { withApmSpan } from '../../../utils/with_apm_span'; import { maybe } from '../../../../common/utils/maybe'; -interface ServiceTransactionDetailedStat { +export interface ServiceTransactionDetailedStat { serviceName: string; latency: Array<{ x: number; y: number | null }>; transactionErrorRate?: Array<{ x: number; y: number }>; diff --git a/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_error_rate_timeseries/get_logs_error_rate_timeseries.ts b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_error_rate_timeseries/get_logs_error_rate_timeseries.ts index c5abd6a564ed8..fdc71e5b84685 100644 --- a/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_error_rate_timeseries/get_logs_error_rate_timeseries.ts +++ b/x-pack/plugins/observability_solution/logs_data_access/server/services/get_logs_error_rate_timeseries/get_logs_error_rate_timeseries.ts @@ -22,14 +22,14 @@ export interface LogsErrorRateTimeseries { kuery?: string; } -export const getLogErrorsAggegation = () => ({ +const getLogErrorsAggregation = () => ({ terms: { field: LOG_LEVEL, include: ['error', 'ERROR'], }, }); -type LogErrorsAggregation = ReturnType; +type LogErrorsAggregation = ReturnType; interface LogsErrorRateTimeseriesHistogram { timeseries: AggregationResultOf< { @@ -103,7 +103,7 @@ export function createGetLogErrorRateTimeseries() { }, }, aggs: { - logErrors: getLogErrorsAggegation(), + logErrors: getLogErrorsAggregation(), }, }, }, diff --git a/x-pack/test/apm_api_integration/tests/entities/services/services_entities_detailed_statistics.spec.ts b/x-pack/test/apm_api_integration/tests/entities/services/services_entities_detailed_statistics.spec.ts new file mode 100644 index 0000000000000..9e4cc209c6b92 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/entities/services/services_entities_detailed_statistics.spec.ts @@ -0,0 +1,191 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import { + APIClientRequestParamsOf, + APIReturnType, +} from '@kbn/apm-plugin/public/services/rest/create_call_apm_api'; +import { ApmDocumentType } from '@kbn/apm-plugin/common/document_type'; +import { RollupInterval } from '@kbn/apm-plugin/common/rollup'; +import { apm, log, timerange } from '@kbn/apm-synthtrace-client'; +import { uniq, map } from 'lodash'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +type ServicesEntitiesDetailedStatisticsReturn = + APIReturnType<'POST /internal/apm/entities/services/detailed_statistics'>; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + + const apmApiClient = getService('apmApiClient'); + const synthtrace = getService('apmSynthtraceEsClient'); + const logSynthtrace = getService('logSynthtraceEsClient'); + + const start = '2024-01-01T00:00:00.000Z'; + const end = '2024-01-01T00:59:59.999Z'; + + const serviceNames = ['my-service', 'synth-go']; + const hostName = 'synth-host'; + const serviceName = 'synth-go'; + + const EXPECTED_TPM = 5; + const EXPECTED_LATENCY = 1000; + const EXPECTED_FAILURE_RATE = 0.25; + const EXPECTED_LOG_RATE = 0.016666666666666666; + const EXPECTED_LOG_ERROR_RATE = 1; + + async function getStats( + overrides?: Partial< + APIClientRequestParamsOf<'POST /internal/apm/entities/services/detailed_statistics'>['params']['query'] + > + ) { + const response = await apmApiClient.readUser({ + endpoint: `POST /internal/apm/entities/services/detailed_statistics`, + params: { + query: { + start, + end, + environment: 'ENVIRONMENT_ALL', + kuery: '', + probability: 1, + documentType: ApmDocumentType.TransactionMetric, + rollupInterval: RollupInterval.OneMinute, + bucketSizeInSeconds: 60, + ...overrides, + }, + body: { + serviceNames: JSON.stringify(serviceNames), + }, + }, + }); + + return response.body; + } + + registry.when( + 'Services entities detailed statistics when data is generated', + { config: 'basic', archives: [] }, + () => { + let servicesEntitiesDetailedStatistics: ServicesEntitiesDetailedStatisticsReturn; + + const instance = apm.service('my-service', 'production', 'java').instance('instance'); + + before(async () => { + const interval = timerange(new Date(start).getTime(), new Date(end).getTime() - 1).interval( + '1m' + ); + + await logSynthtrace.index([ + timerange(start, end) + .interval('1m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is a log message') + .logLevel('error') + .timestamp(timestamp) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': serviceName, + 'host.name': hostName, + 'service.environment': 'test', + }) + ), + timerange(start, end) + .interval('2m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is an error log message') + .logLevel('error') + .timestamp(timestamp) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': 'my-service', + 'host.name': hostName, + 'service.environment': 'production', + }) + ), + timerange(start, end) + .interval('5m') + .rate(1) + .generator((timestamp) => + log + .create() + .message('This is an info message') + .logLevel('info') + .timestamp(timestamp) + .defaults({ + 'log.file.path': '/my-service.log', + 'service.name': 'my-service', + 'host.name': hostName, + 'service.environment': 'production', + }) + ), + ]); + + await synthtrace.index([ + interval.rate(3).generator((timestamp) => { + return instance + .transaction('GET /api') + .duration(EXPECTED_LATENCY) + .outcome('success') + .timestamp(timestamp); + }), + interval.rate(1).generator((timestamp) => { + return instance + .transaction('GET /api') + .duration(EXPECTED_LATENCY) + .outcome('failure') + .timestamp(timestamp); + }), + interval.rate(1).generator((timestamp) => { + return instance + .transaction('GET /api') + .duration(EXPECTED_LATENCY) + .outcome('unknown') + .timestamp(timestamp); + }), + ]); + }); + + after(() => synthtrace.clean()); + + describe('and transaction metrics are used', () => { + before(async () => { + servicesEntitiesDetailedStatistics = await getStats(); + }); + + it('returns the expected statistics for apm', () => { + const stats = servicesEntitiesDetailedStatistics.currentPeriod.apm['my-service']; + + expect(stats).not.empty(); + expect(uniq(map(stats.throughput, 'y'))).eql([EXPECTED_TPM], 'tpm'); + + expect(uniq(map(stats.latency, 'y'))).eql([EXPECTED_LATENCY * 1000], 'latency'); + + expect(uniq(map(stats.transactionErrorRate, 'y'))).eql( + [EXPECTED_FAILURE_RATE], + 'errorRate' + ); + }); + + it('returns the expected statistics for logs', () => { + const statsLogErrorRate = + servicesEntitiesDetailedStatistics.currentPeriod.logErrorRate[serviceName]; + const statsLogRate = + servicesEntitiesDetailedStatistics.currentPeriod.logRate[serviceName]; + + expect(statsLogErrorRate.every(({ y }) => y === EXPECTED_LOG_ERROR_RATE)).to.be(true); + expect(statsLogRate.every(({ y }) => y === EXPECTED_LOG_RATE)).to.be(true); + }); + }); + } + ); +} From e7b3d3ee7b7300aa3a5980038f9b132d5feee8a2 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Thu, 11 Jul 2024 12:00:57 +0200 Subject: [PATCH 76/82] SOM plugin: remove column and action services from public contract (#187872) ## Summary Fix https://github.com/elastic/kibana/issues/128784 --- .../saved_objects_management/public/index.ts | 9 +------ .../management_section/mount_section.tsx | 19 +++++++++++--- .../saved_objects_management/public/mocks.ts | 14 ++++------ .../saved_objects_management/public/plugin.ts | 26 +++++++++---------- .../public/services/action_service.ts | 23 +++++++--------- .../public/services/column_service.ts | 21 ++++++--------- .../public/services/index.ts | 10 ++----- 7 files changed, 52 insertions(+), 70 deletions(-) diff --git a/src/plugins/saved_objects_management/public/index.ts b/src/plugins/saved_objects_management/public/index.ts index 6df2288d110b5..37ed13ea749e8 100644 --- a/src/plugins/saved_objects_management/public/index.ts +++ b/src/plugins/saved_objects_management/public/index.ts @@ -13,14 +13,7 @@ export type { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart, } from './plugin'; -export type { - SavedObjectsManagementActionServiceSetup, - SavedObjectsManagementActionServiceStart, - SavedObjectsManagementColumnServiceSetup, - SavedObjectsManagementColumnServiceStart, - SavedObjectsManagementColumn, - SavedObjectsManagementRecord, -} from './services'; +export type { SavedObjectsManagementColumn, SavedObjectsManagementRecord } from './services'; export { SavedObjectsManagementAction } from './services'; export type { ProcessedImportResponse, FailedImport } from './lib'; export { processImportResponse, getTagFindReferences, parseQuery } from './lib'; diff --git a/src/plugins/saved_objects_management/public/management_section/mount_section.tsx b/src/plugins/saved_objects_management/public/management_section/mount_section.tsx index 57103921c909a..66bd4f6e9542f 100644 --- a/src/plugins/saved_objects_management/public/management_section/mount_section.tsx +++ b/src/plugins/saved_objects_management/public/management_section/mount_section.tsx @@ -17,10 +17,16 @@ import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import type { SavedObjectManagementTypeInfo } from '../../common/types'; import { StartDependencies, SavedObjectsManagementPluginStart } from '../plugin'; import { getAllowedTypes } from '../lib'; +import { + SavedObjectsManagementActionServiceStart, + SavedObjectsManagementColumnServiceStart, +} from '../services'; interface MountParams { core: CoreSetup; mountParams: ManagementAppMountParams; + getActionServiceStart: () => SavedObjectsManagementActionServiceStart; + getColumnServiceStart: () => SavedObjectsManagementColumnServiceStart; } let allowedObjectTypes: SavedObjectManagementTypeInfo[] | undefined; @@ -31,8 +37,13 @@ const title = i18n.translate('savedObjectsManagement.objects.savedObjectsTitle', const SavedObjectsEditionPage = lazy(() => import('./saved_objects_edition_page')); const SavedObjectsTablePage = lazy(() => import('./saved_objects_table_page')); -export const mountManagementSection = async ({ core, mountParams }: MountParams) => { - const [coreStart, { data, dataViews, savedObjectsTaggingOss, spaces: spacesApi }, pluginStart] = +export const mountManagementSection = async ({ + core, + mountParams, + getColumnServiceStart, + getActionServiceStart, +}: MountParams) => { + const [coreStart, { data, dataViews, savedObjectsTaggingOss, spaces: spacesApi }] = await core.getStartServices(); const { capabilities } = coreStart.application; const { element, history, setBreadcrumbs } = mountParams; @@ -77,8 +88,8 @@ export const mountManagementSection = async ({ core, mountParams }: MountParams) spacesApi={spacesApi} dataStart={data} dataViewsApi={dataViews} - actionRegistry={pluginStart.actions} - columnRegistry={pluginStart.columns} + actionRegistry={getActionServiceStart()} + columnRegistry={getColumnServiceStart()} allowedTypes={allowedObjectTypes} setBreadcrumbs={setBreadcrumbs} /> diff --git a/src/plugins/saved_objects_management/public/mocks.ts b/src/plugins/saved_objects_management/public/mocks.ts index 82fe0d419855c..51b93f04c5826 100644 --- a/src/plugins/saved_objects_management/public/mocks.ts +++ b/src/plugins/saved_objects_management/public/mocks.ts @@ -6,22 +6,18 @@ * Side Public License, v 1. */ -import { actionServiceMock } from './services/action_service.mock'; -import { columnServiceMock } from './services/column_service.mock'; -import { SavedObjectsManagementPluginSetup, SavedObjectsManagementPluginStart } from './plugin'; +import type { + SavedObjectsManagementPluginSetup, + SavedObjectsManagementPluginStart, +} from './plugin'; const createSetupContractMock = (): jest.Mocked => { - const mock = { - actions: actionServiceMock.createSetup(), - columns: columnServiceMock.createSetup(), - }; + const mock = {}; return mock; }; const createStartContractMock = (): jest.Mocked => { const mock = { - actions: actionServiceMock.createStart(), - columns: columnServiceMock.createStart(), getAllowedTypes: jest.fn(), getRelationships: jest.fn(), getSavedObjectLabel: jest.fn(), diff --git a/src/plugins/saved_objects_management/public/plugin.ts b/src/plugins/saved_objects_management/public/plugin.ts index eaefe96a0916a..855ea9dd7c91e 100644 --- a/src/plugins/saved_objects_management/public/plugin.ts +++ b/src/plugins/saved_objects_management/public/plugin.ts @@ -16,10 +16,8 @@ import { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import { SavedObjectTaggingOssPluginStart } from '@kbn/saved-objects-tagging-oss-plugin/public'; import { SavedObjectsManagementActionService, - SavedObjectsManagementActionServiceSetup, SavedObjectsManagementActionServiceStart, SavedObjectsManagementColumnService, - SavedObjectsManagementColumnServiceSetup, SavedObjectsManagementColumnServiceStart, } from './services'; @@ -28,21 +26,18 @@ import type { v1 } from '../common'; import { SavedObjectManagementTypeInfo } from './types'; import { getAllowedTypes, + getDefaultTitle, getRelationships, getSavedObjectLabel, - getDefaultTitle, - parseQuery, getTagFindReferences, + parseQuery, } from './lib'; -export interface SavedObjectsManagementPluginSetup { - actions: SavedObjectsManagementActionServiceSetup; - columns: SavedObjectsManagementColumnServiceSetup; -} +// keeping the interface to reduce work if we want to add back APIs later +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SavedObjectsManagementPluginSetup {} export interface SavedObjectsManagementPluginStart { - actions: SavedObjectsManagementActionServiceStart; - columns: SavedObjectsManagementColumnServiceStart; getAllowedTypes: () => Promise; getRelationships: ( type: string, @@ -79,6 +74,9 @@ export class SavedObjectsManagementPlugin private actionService = new SavedObjectsManagementActionService(); private columnService = new SavedObjectsManagementColumnService(); + private actionServiceStart?: SavedObjectsManagementActionServiceStart; + private columnServiceStart?: SavedObjectsManagementColumnServiceStart; + public setup( core: CoreSetup, { home, management }: SetupDependencies @@ -114,6 +112,8 @@ export class SavedObjectsManagementPlugin return mountManagementSection({ core, mountParams, + getColumnServiceStart: () => this.columnServiceStart!, + getActionServiceStart: () => this.actionServiceStart!, }); }, }); @@ -125,12 +125,10 @@ export class SavedObjectsManagementPlugin } public start(_core: CoreStart, { spaces: spacesApi }: StartDependencies) { - const actionStart = this.actionService.start(spacesApi); - const columnStart = this.columnService.start(spacesApi); + this.actionServiceStart = this.actionService.start(spacesApi); + this.columnServiceStart = this.columnService.start(spacesApi); return { - actions: actionStart, - columns: columnStart, getAllowedTypes: () => getAllowedTypes(_core.http), getRelationships: (type: string, id: string, savedObjectTypes: string[]) => getRelationships(_core.http, type, id, savedObjectTypes), diff --git a/src/plugins/saved_objects_management/public/services/action_service.ts b/src/plugins/saved_objects_management/public/services/action_service.ts index b255ee9a7fa80..83f968a846113 100644 --- a/src/plugins/saved_objects_management/public/services/action_service.ts +++ b/src/plugins/saved_objects_management/public/services/action_service.ts @@ -36,30 +36,25 @@ export class SavedObjectsManagementActionService { setup(): SavedObjectsManagementActionServiceSetup { return { - register: (action) => { - if (this.actions.has(action.id)) { - throw new Error(`Saved Objects Management Action with id '${action.id}' already exists`); - } - this.actions.set(action.id, action); - }, + register: (action) => this.register(action), }; } start(spacesApi?: SpacesApi): SavedObjectsManagementActionServiceStart { if (spacesApi && !spacesApi.hasOnlyDefaultSpace) { - registerSpacesApiActions(this, spacesApi); + this.register(new ShareToSpaceSavedObjectsManagementAction(spacesApi.ui)); + this.register(new CopyToSpaceSavedObjectsManagementAction(spacesApi.ui)); } return { has: (actionId) => this.actions.has(actionId), getAll: () => [...this.actions.values()], }; } -} -function registerSpacesApiActions( - service: SavedObjectsManagementActionService, - spacesApi: SpacesApi -) { - service.setup().register(new ShareToSpaceSavedObjectsManagementAction(spacesApi.ui)); - service.setup().register(new CopyToSpaceSavedObjectsManagementAction(spacesApi.ui)); + private register(action: SavedObjectsManagementAction) { + if (this.actions.has(action.id)) { + throw new Error(`Saved Objects Management Action with id '${action.id}' already exists`); + } + this.actions.set(action.id, action); + } } diff --git a/src/plugins/saved_objects_management/public/services/column_service.ts b/src/plugins/saved_objects_management/public/services/column_service.ts index 665866df1b4b0..519704d258c49 100644 --- a/src/plugins/saved_objects_management/public/services/column_service.ts +++ b/src/plugins/saved_objects_management/public/services/column_service.ts @@ -29,28 +29,23 @@ export class SavedObjectsManagementColumnService { setup(): SavedObjectsManagementColumnServiceSetup { return { - register: (column) => { - if (this.columns.has(column.id)) { - throw new Error(`Saved Objects Management Column with id '${column.id}' already exists`); - } - this.columns.set(column.id, column); - }, + register: (column) => this.register(column), }; } start(spacesApi?: SpacesApi): SavedObjectsManagementColumnServiceStart { if (spacesApi && !spacesApi.hasOnlyDefaultSpace) { - registerSpacesApiColumns(this, spacesApi); + this.register(new ShareToSpaceSavedObjectsManagementColumn(spacesApi.ui)); } return { getAll: () => [...this.columns.values()], }; } -} -function registerSpacesApiColumns( - service: SavedObjectsManagementColumnService, - spacesApi: SpacesApi -) { - service.setup().register(new ShareToSpaceSavedObjectsManagementColumn(spacesApi.ui)); + private register(column: SavedObjectsManagementColumn) { + if (this.columns.has(column.id)) { + throw new Error(`Saved Objects Management Column with id '${column.id}' already exists`); + } + this.columns.set(column.id, column); + } } diff --git a/src/plugins/saved_objects_management/public/services/index.ts b/src/plugins/saved_objects_management/public/services/index.ts index 997a1b96b418f..9d6f96cee0cfb 100644 --- a/src/plugins/saved_objects_management/public/services/index.ts +++ b/src/plugins/saved_objects_management/public/services/index.ts @@ -6,15 +6,9 @@ * Side Public License, v 1. */ -export type { - SavedObjectsManagementActionServiceStart, - SavedObjectsManagementActionServiceSetup, -} from './action_service'; +export type { SavedObjectsManagementActionServiceStart } from './action_service'; export { SavedObjectsManagementActionService } from './action_service'; -export type { - SavedObjectsManagementColumnServiceStart, - SavedObjectsManagementColumnServiceSetup, -} from './column_service'; +export type { SavedObjectsManagementColumnServiceStart } from './column_service'; export { SavedObjectsManagementColumnService } from './column_service'; export type { SavedObjectsManagementRecord } from './types'; export { SavedObjectsManagementColumn, SavedObjectsManagementAction } from './types'; From 6a72c266890d3f55692309217ce3f4e696ce55cb Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Thu, 11 Jul 2024 12:03:19 +0200 Subject: [PATCH 77/82] [licensing] Log a warning when fetching a missing license (#187942) ## Summary Fix https://github.com/elastic/kibana/issues/101865 --- .../licensing/server/license_fetcher.test.ts | 44 +++++++++++++++++++ .../licensing/server/license_fetcher.ts | 4 ++ 2 files changed, 48 insertions(+) diff --git a/x-pack/plugins/licensing/server/license_fetcher.test.ts b/x-pack/plugins/licensing/server/license_fetcher.test.ts index efd9b001fa0ff..a8a64d300e9f4 100644 --- a/x-pack/plugins/licensing/server/license_fetcher.test.ts +++ b/x-pack/plugins/licensing/server/license_fetcher.test.ts @@ -169,4 +169,48 @@ describe('LicenseFetcher', () => { license = await fetcher(); expect(license.error).toEqual('woups'); }); + + it('logs a warning in case of successful call without license', async () => { + clusterClient.asInternalUser.xpack.info.mockResponse({ + license: undefined, + features: {}, + } as any); + + const fetcher = getLicenseFetcher({ + logger, + clusterClient, + cacheDurationMs: 50_000, + }); + + const license = await fetcher(); + expect(license.isAvailable).toEqual(false); + expect(loggerMock.collect(logger).warn.map((args) => args[0])).toMatchInlineSnapshot(` + Array [ + "License information fetched from Elasticsearch, but no license is available", + ] + `); + }); + + it('logs a warning in case of successful call with a missing license', async () => { + clusterClient.asInternalUser.xpack.info.mockResponse({ + license: buildRawLicense({ + type: 'missing', + }), + features: {}, + } as any); + + const fetcher = getLicenseFetcher({ + logger, + clusterClient, + cacheDurationMs: 50_000, + }); + + const license = await fetcher(); + expect(license.isAvailable).toEqual(false); + expect(loggerMock.collect(logger).warn.map((args) => args[0])).toMatchInlineSnapshot(` + Array [ + "License information fetched from Elasticsearch, but no license is available", + ] + `); + }); }); diff --git a/x-pack/plugins/licensing/server/license_fetcher.ts b/x-pack/plugins/licensing/server/license_fetcher.ts index 43d9c204bbf66..56a89fe221c9d 100644 --- a/x-pack/plugins/licensing/server/license_fetcher.ts +++ b/x-pack/plugins/licensing/server/license_fetcher.ts @@ -45,6 +45,10 @@ export const getLicenseFetcher = ({ ? normalizeFeatures(response.features) : undefined; + if (!normalizedLicense) { + logger.warn('License information fetched from Elasticsearch, but no license is available'); + } + const signature = sign({ license: normalizedLicense, features: normalizedFeatures, From 092e57408f560be1b4bfdfe7d50ffbc9abe25953 Mon Sep 17 00:00:00 2001 From: Jatin Kathuria Date: Thu, 11 Jul 2024 12:21:56 +0200 Subject: [PATCH 78/82] [Security Solution] Fix - Unified Timeline Style fixes (#187937) ## Summary ## Unified Timeline ### Before ![issue_unified_timeline mov](https://github.com/elastic/kibana/assets/7485038/d60634b8-3f54-4aab-8264-7d20e269077d) ### After ![Styles_old_timeline mov](https://github.com/elastic/kibana/assets/7485038/aa5eb6eb-511b-421a-abb4-fed7e5c93cd1) ## Old Timeline ### Before ![issue_old_timeline mov](https://github.com/elastic/kibana/assets/7485038/9719af8d-9485-4673-a9b7-dcc1028e8a66) ### After ![Styles_old_timeline mov](https://github.com/elastic/kibana/assets/7485038/1f9b2c76-2dc5-4de4-b1f5-a09fdada550c) ## Row Renderers ### Before ![grafik](https://github.com/elastic/kibana/assets/7485038/9ddf057c-2a04-4f7e-9ba7-8940683e059d) ### After ![grafik](https://github.com/elastic/kibana/assets/7485038/c6628a7c-f07e-4a04-843c-7a7e220243dc) ## Stripes patterns in row renderer Notice the color changes to grow for the same row when `Row Renderer` is switched. ### Before ![styles_row_renderer_switch_stripes_fixed mov](https://github.com/elastic/kibana/assets/7485038/0d356771-1562-42aa-8256-de29c6879cd4) ### After ![styles_row_renderer_switch_stripes mov](https://github.com/elastic/kibana/assets/7485038/95d32feb-9a1f-40f0-9574-db2770980a05) --- .../events/stateful_row_renderer/index.tsx | 24 +++++--- .../timeline/body/unified_timeline_body.tsx | 11 ++-- .../components/timeline/tabs/eql/index.tsx | 59 ++++++++----------- .../timeline/tabs/shared/layout.tsx | 1 - ...stom_timeline_data_grid_body.test.tsx.snap | 4 +- .../custom_timeline_data_grid_body.tsx | 2 +- .../timeline/unified_components/styles.tsx | 2 +- 7 files changed, 53 insertions(+), 50 deletions(-) diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx index 155c92403af3b..b6df692dcabfd 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx @@ -6,7 +6,13 @@ */ import { noop } from 'lodash/fp'; -import { EuiFocusTrap, EuiOutsideClickDetector, EuiScreenReaderOnly } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFocusTrap, + EuiOutsideClickDetector, + EuiScreenReaderOnly, + EuiFlexItem, +} from '@elastic/eui'; import React, { useMemo } from 'react'; import { @@ -73,13 +79,15 @@ export const StatefulRowRenderer = ({

{i18n.YOU_ARE_IN_AN_EVENT_RENDERER(ariaRowindex)}

-
- {rowRenderer.renderRow({ - data: event.ecs, - isDraggable: true, - scopeId: timelineId, - })} -
+ + + {rowRenderer.renderRow({ + data: event.ecs, + isDraggable: true, + scopeId: timelineId, + })} + + diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/unified_timeline_body.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/unified_timeline_body.tsx index 576812016dee8..d832eee22bb64 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/unified_timeline_body.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/unified_timeline_body.tsx @@ -9,7 +9,7 @@ import type { ComponentProps, ReactElement } from 'react'; import React, { useEffect, useState, useMemo } from 'react'; import { RootDragDropProvider } from '@kbn/dom-drag-drop'; import { isEmpty } from 'lodash'; -import { StyledTableFlexGroup, StyledTableFlexItem } from '../unified_components/styles'; +import { StyledTableFlexGroup, StyledUnifiedTableFlexItem } from '../unified_components/styles'; import { UnifiedTimeline } from '../unified_components'; import { defaultUdtHeaders } from '../unified_components/default_headers'; import type { PaginationInputPaginated, TimelineItem } from '../../../../../common/search_strategy'; @@ -65,8 +65,11 @@ export const UnifiedTimelineBody = (props: UnifiedTimelineBodyProps) => { return ( - {header} - + {header} + { leadingControlColumns={leadingControlColumns} /> - + ); }; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx index 0d6332ffe805c..7492a00a4a2de 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/eql/index.tsx @@ -285,31 +285,29 @@ export const EqlTabContentComponent: React.FC = ({ {NotesFlyoutMemo} - - - + ) : ( @@ -325,14 +323,9 @@ export const EqlTabContentComponent: React.FC = ({ loading={isQueryLoading} refetch={refetch} /> - - - + + {unifiedHeader} + props.theme.eui.euiSizeS}; width: 100%; `; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap index 4e220a4d2db51..b3e43da0eb8a1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/__snapshots__/custom_timeline_data_grid_body.test.tsx.snap @@ -75,7 +75,7 @@ exports[`CustomTimelineDataGridBody should render exactly as snapshots 1`] = `
diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/styles.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/styles.tsx index 78ab042155e7e..2d32767ea19c0 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/styles.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/styles.tsx @@ -22,7 +22,7 @@ export const StyledTableFlexGroup = styled(EuiFlexGroup).attrs(({ className = '' } `; -export const StyledTableFlexItem = styled(EuiFlexItem).attrs(({ className = '' }) => ({ +export const StyledUnifiedTableFlexItem = styled(EuiFlexItem).attrs(({ className = '' }) => ({ className: `${className}`, }))` ${({ theme }) => `margin: 0 ${theme.eui.euiSizeM};`} From 879b7b7d9880a99b693685697c435ad9f14159c9 Mon Sep 17 00:00:00 2001 From: Julia Rechkunova Date: Thu, 11 Jul 2024 12:22:15 +0200 Subject: [PATCH 79/82] [Discover] Fix Field Statistics when discover:searchFieldsFromSource is enabled (#187250) - Closes https://github.com/elastic/kibana/issues/187241 ## Summary This PR excludes `_source` when processing current `columns` in UI - For Field Statistics table - For ES|QL fields callout ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: Matthias Wilhelm --- .../field_stats_table/field_stats_table.tsx | 7 +- .../components/layout/discover_documents.tsx | 3 +- .../discover/group6/_field_stats_table.ts | 72 +++++++++++++++++++ test/functional/apps/discover/group6/index.ts | 1 + 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 test/functional/apps/discover/group6/_field_stats_table.ts diff --git a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx index bf48c0bb83cf4..800b143213227 100644 --- a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx +++ b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_table.tsx @@ -56,7 +56,12 @@ export const FieldStatisticsTable = React.memo((props: FieldStatisticsTableProps } = props; const visibleFields = useMemo( - () => convertFieldsToFallbackFields({ fields: columns, additionalFieldGroups }), + () => + convertFieldsToFallbackFields({ + // `discover:searchFieldsFromSource` adds `_source` to the columns, but we should exclude it for Field Statistics + fields: columns.filter((col) => col !== '_source'), + additionalFieldGroups, + }), [additionalFieldGroups, columns] ); const allFallbackFields = useMemo( diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx index caba229e9137a..9e061beffc4fc 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx @@ -277,7 +277,8 @@ function DiscoverDocumentsComponent({ <> col !== '_source')} /> diff --git a/test/functional/apps/discover/group6/_field_stats_table.ts b/test/functional/apps/discover/group6/_field_stats_table.ts new file mode 100644 index 0000000000000..45b05d7ddc4bf --- /dev/null +++ b/test/functional/apps/discover/group6/_field_stats_table.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'discover', 'timePicker', 'header']); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + const kibanaServer = getService('kibanaServer'); + const security = getService('security'); + const defaultSettings = { + defaultIndex: 'logstash-*', + }; + + describe('discover field statistics table', function () { + before(async () => { + await security.testUser.setRoles(['kibana_admin', 'test_logstash_reader']); + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); + }); + + after(async () => { + await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + [true, false].forEach((shouldSearchFieldsFromSource) => { + describe(`discover:searchFieldsFromSource: ${shouldSearchFieldsFromSource}`, function () { + before(async function () { + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update({ + ...defaultSettings, + 'discover:searchFieldsFromSource': shouldSearchFieldsFromSource, + }); + await PageObjects.common.navigateToApp('discover'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + }); + + after(async () => { + await kibanaServer.uiSettings.replace({}); + }); + + it('should show Field Statistics data in data view mode', async () => { + await testSubjects.click('dscViewModeFieldStatsButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('dataVisualizerTableContainer'); + + await testSubjects.click('dscViewModeDocumentButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('discoverDocTable'); + }); + + it('should show Field Statistics data in ES|QL mode', async () => { + await PageObjects.discover.selectTextBaseLang(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await testSubjects.click('dscViewModeFieldStatsButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.existOrFail('dataVisualizerTableContainer'); + }); + }); + }); + }); +} diff --git a/test/functional/apps/discover/group6/index.ts b/test/functional/apps/discover/group6/index.ts index f71d96e63d2fd..6ed514463705f 100644 --- a/test/functional/apps/discover/group6/index.ts +++ b/test/functional/apps/discover/group6/index.ts @@ -25,5 +25,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./_time_field_column')); loadTestFile(require.resolve('./_unsaved_changes_badge')); loadTestFile(require.resolve('./_view_mode_toggle')); + loadTestFile(require.resolve('./_field_stats_table')); }); } From 460b52077ffa26673b1a40fff87a7ee182f0c9db Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:35:56 +0200 Subject: [PATCH 80/82] [Semantic text] Make semantic text work with non-root level fields (#187154) ## Summary This makes semantic text work with non-root level reference fields. It also correctly adds copy_to to existing copy_to fields instead of replacing them, and streamlines a lot of the code. To test these changes: - Create an index - Go to the index mappings page at `app/management/data/index_management/indices/index_details?{yourIndexName}=blah&tab=mappings` - Add an object field with a text field inside - Add a semantic text field referencing that text field - If you're on a Macbook, create a new inference endpoint with the model `.elser_model_2` instead of using the default inference endpoint. - Add a second semantic text field referencing that text field - Save your mappings - Use JSON view to verify that the newly created text field contains a `copy_to` field referencing both newly created semantic text fields - Verify that the newly created semantic text fields are also in the JSON view ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --- .../components/elasticsearch_models.tsx | 5 +- .../packages/ml/trained_models_utils/index.ts | 9 + .../src/constants/trained_models.ts | 50 +- .../server/lib/ml/fetch_ml_models.test.ts | 9 +- .../server/lib/ml/fetch_ml_models.ts | 13 +- .../enterprise_search/server/lib/ml/utils.ts | 13 +- .../index_details_page.helpers.ts | 18 +- .../index_details_page.test.tsx | 2 + .../select_inference_id.test.tsx | 48 +- .../trained_models_deployment_modal.test.tsx | 217 +++++++-- .../helpers/mappings_editor.helpers.tsx | 5 +- .../mappings_editor.test.tsx | 13 +- .../field_parameters/name_parameter.tsx | 14 +- .../reference_field_selects.tsx | 84 ++-- .../field_parameters/select_inference_id.tsx | 455 ++++++++---------- .../fields/create_field/create_field.tsx | 144 ++---- .../semantic_text/use_semantic_text.test.ts | 105 ++-- .../semantic_text/use_semantic_text.ts | 177 ++++--- .../constants/parameters_definition.tsx | 27 +- .../mappings_editor/lib/utils.test.ts | 200 ++++++++ .../components/mappings_editor/lib/utils.ts | 87 ++++ .../mappings_state_context.tsx | 1 + .../components/mappings_editor/reducer.ts | 25 +- .../mappings_editor/types/document_fields.ts | 5 +- .../components/mappings_editor/types/state.ts | 3 +- .../mappings_editor/use_state_listener.tsx | 7 + .../details_page_mappings_content.tsx | 80 +-- .../trained_models_deployment_modal.tsx | 280 ++++++----- .../public/application/services/api.ts | 3 +- ...ils_page_mappings_model_management.test.ts | 145 +++--- ..._details_page_mappings_model_management.ts | 188 ++++---- .../hooks/use_ml_model_status_toasts.ts | 18 +- .../ml_api_service/inference_models.ts | 5 +- .../services/ml_api_service/trained_models.ts | 12 + .../ml/server/routes/inference_models.ts | 33 +- .../server/routes/schemas/inference_schema.ts | 6 + .../ml/server/routes/trained_models.ts | 51 +- 37 files changed, 1524 insertions(+), 1033 deletions(-) diff --git a/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx b/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx index 0825cba6828b4..4bd6354ef73da 100644 --- a/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx +++ b/x-pack/packages/ml/inference_integration_flyout/components/elasticsearch_models.tsx @@ -70,10 +70,7 @@ export const ElasticsearchModels: React.FC = ({ } }, [numberOfAllocations, numberOfThreads, serviceType]); - const elasticSearchModelTypesDescriptions: Record< - ElasticsearchModelDefaultOptions | string, - ElasticsearchModelDescriptions - > = { + const elasticSearchModelTypesDescriptions: Record = { [ElasticsearchModelDefaultOptions.elser]: { description: i18n.translate( 'xpack.ml.addInferenceEndpoint.elasticsearchModels.elser.description', diff --git a/x-pack/packages/ml/trained_models_utils/index.ts b/x-pack/packages/ml/trained_models_utils/index.ts index ada09d62af072..293f6662f5011 100644 --- a/x-pack/packages/ml/trained_models_utils/index.ts +++ b/x-pack/packages/ml/trained_models_utils/index.ts @@ -27,4 +27,13 @@ export { ELASTIC_MODEL_TYPE, MODEL_STATE, type ModelState, + ELSER_LINUX_OPTIMIZED_MODEL_ID, + ELSER_MODEL_ID, + E5_LINUX_OPTIMIZED_MODEL_ID, + E5_MODEL_ID, + LANG_IDENT_MODEL_ID, + LATEST_ELSER_VERSION, + LATEST_ELSER_MODEL_ID, + LATEST_E5_MODEL_ID, + ElserModels, } from './src/constants/trained_models'; diff --git a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts index 49acb6e1d5169..938f9c0ef81e0 100644 --- a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts +++ b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts @@ -7,6 +7,18 @@ import { i18n } from '@kbn/i18n'; +export const ELSER_MODEL_ID = '.elser_model_2'; +export const ELSER_LINUX_OPTIMIZED_MODEL_ID = '.elser_model_2_linux-x86_64'; +export const E5_MODEL_ID = '.multilingual-e5-small'; +export const E5_LINUX_OPTIMIZED_MODEL_ID = '.multilingual-e5-small_linux-x86_64'; +export const LANG_IDENT_MODEL_ID = 'lang_ident_model_1'; +export const ELSER_ID_V1 = '.elser_model_1' as const; +export const LATEST_ELSER_VERSION: ElserVersion = 2; +export const LATEST_ELSER_MODEL_ID = ELSER_LINUX_OPTIMIZED_MODEL_ID; +export const LATEST_E5_MODEL_ID = E5_LINUX_OPTIMIZED_MODEL_ID; + +export const ElserModels = [ELSER_MODEL_ID, ELSER_LINUX_OPTIMIZED_MODEL_ID, ELSER_ID_V1]; + export const DEPLOYMENT_STATE = { STARTED: 'started', STARTING: 'starting', @@ -46,10 +58,8 @@ export const BUILT_IN_MODEL_TAG = 'prepackaged'; export const ELASTIC_MODEL_TAG = 'elastic'; -export const ELSER_ID_V1 = '.elser_model_1' as const; - export const ELASTIC_MODEL_DEFINITIONS: Record = Object.freeze({ - '.elser_model_1': { + [ELSER_ID_V1]: { modelName: 'elser', hidden: true, version: 1, @@ -63,7 +73,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object }), type: ['elastic', 'pytorch', 'text_expansion'], }, - '.elser_model_2': { + [ELSER_MODEL_ID]: { modelName: 'elser', version: 2, default: true, @@ -77,7 +87,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object }), type: ['elastic', 'pytorch', 'text_expansion'], }, - '.elser_model_2_linux-x86_64': { + [ELSER_LINUX_OPTIMIZED_MODEL_ID]: { modelName: 'elser', version: 2, os: 'Linux', @@ -92,7 +102,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object }), type: ['elastic', 'pytorch', 'text_expansion'], }, - '.multilingual-e5-small': { + [E5_MODEL_ID]: { modelName: 'e5', version: 1, default: true, @@ -108,7 +118,7 @@ export const ELASTIC_MODEL_DEFINITIONS: Record = Object licenseUrl: 'https://huggingface.co/elastic/multilingual-e5-small', type: ['pytorch', 'text_embedding'], }, - '.multilingual-e5-small_linux-x86_64': { + [E5_LINUX_OPTIMIZED_MODEL_ID]: { modelName: 'e5', version: 1, os: 'Linux', @@ -178,23 +188,17 @@ export interface GetModelDownloadConfigOptions { version?: ElserVersion; } +export interface LocalInferenceServiceSettings { + service: 'elser' | 'elasticsearch'; + service_settings: { + num_allocations: number; + num_threads: number; + model_id: string; + }; +} + export type InferenceServiceSettings = - | { - service: 'elser'; - service_settings: { - num_allocations: number; - num_threads: number; - model_id: string; - }; - } - | { - service: 'elasticsearch'; - service_settings: { - num_allocations: number; - num_threads: number; - model_id: string; - }; - } + | LocalInferenceServiceSettings | { service: 'openai'; service_settings: { diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts index 9e017424a8f3d..9f1325f2c7a3d 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.test.ts @@ -9,15 +9,16 @@ import { mockLogger } from '../../__mocks__'; import { MlTrainedModels } from '@kbn/ml-plugin/server'; -import { MlModelDeploymentState } from '../../../common/types/ml'; - -import { fetchMlModels } from './fetch_ml_models'; import { E5_LINUX_OPTIMIZED_MODEL_ID, E5_MODEL_ID, ELSER_LINUX_OPTIMIZED_MODEL_ID, ELSER_MODEL_ID, -} from './utils'; +} from '@kbn/ml-trained-models-utils'; + +import { MlModelDeploymentState } from '../../../common/types/ml'; + +import { fetchMlModels } from './fetch_ml_models'; describe('fetchMlModels', () => { const mockTrainedModelsProvider = { diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts index 595c35b33755e..889b7bb1b89e1 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/fetch_ml_models.ts @@ -11,6 +11,14 @@ import { Logger } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; import { MlTrainedModels } from '@kbn/ml-plugin/server'; +import { + E5_LINUX_OPTIMIZED_MODEL_ID, + E5_MODEL_ID, + ELSER_LINUX_OPTIMIZED_MODEL_ID, + ELSER_MODEL_ID, + LANG_IDENT_MODEL_ID, +} from '@kbn/ml-trained-models-utils'; + import { getMlModelTypesForModelConfig } from '../../../common/ml_inference_pipeline'; import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; @@ -18,15 +26,10 @@ import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; import { BASE_MODEL, ELSER_LINUX_OPTIMIZED_MODEL_PLACEHOLDER, - ELSER_MODEL_ID, ELSER_MODEL_PLACEHOLDER, E5_LINUX_OPTIMIZED_MODEL_PLACEHOLDER, - E5_MODEL_ID, E5_MODEL_PLACEHOLDER, - LANG_IDENT_MODEL_ID, MODEL_TITLES_BY_TYPE, - E5_LINUX_OPTIMIZED_MODEL_ID, - ELSER_LINUX_OPTIMIZED_MODEL_ID, } from './utils'; let compatibleElserModelId = ELSER_MODEL_ID; diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts b/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts index d063fd158385a..20c9fe7ce0193 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/utils.ts @@ -8,13 +8,14 @@ import { i18n } from '@kbn/i18n'; import { SUPPORTED_PYTORCH_TASKS } from '@kbn/ml-trained-models-utils'; -import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; +import { + E5_LINUX_OPTIMIZED_MODEL_ID, + E5_MODEL_ID, + ELSER_LINUX_OPTIMIZED_MODEL_ID, + ELSER_MODEL_ID, +} from '@kbn/ml-trained-models-utils'; -export const ELSER_MODEL_ID = '.elser_model_2'; -export const ELSER_LINUX_OPTIMIZED_MODEL_ID = '.elser_model_2_linux-x86_64'; -export const E5_MODEL_ID = '.multilingual-e5-small'; -export const E5_LINUX_OPTIMIZED_MODEL_ID = '.multilingual-e5-small_linux-x86_64'; -export const LANG_IDENT_MODEL_ID = 'lang_ident_model_1'; +import { MlModelDeploymentState, MlModel } from '../../../common/types/ml'; export const MODEL_TITLES_BY_TYPE: Record = { fill_mask: i18n.translate('xpack.enterpriseSearch.content.ml_inference.fill_mask', { diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts index 91dd4d26c2a5b..d80b08b96dacc 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.helpers.ts @@ -61,7 +61,7 @@ export interface IndexDetailsPageTestBed extends TestBed { selectInferenceIdButtonExists: () => void; openSelectInferencePopover: () => void; expectDefaultInferenceModelToExists: () => void; - expectCustomInferenceModelToExists: (customInference: string) => Promise; + expectCustomInferenceModelToExists: (customInference: string) => void; }; settings: { getCodeBlockContent: () => string; @@ -317,23 +317,23 @@ export const setup = async ({ expect(exists('fieldTypesOptions-semantic_text')).toBe(false); }); }, - isReferenceFieldVisible: async () => { - expect(exists('referenceField.select')).toBe(true); + isReferenceFieldVisible: () => { + expect(exists('referenceFieldSelect')).toBe(true); }, - selectInferenceIdButtonExists: async () => { + selectInferenceIdButtonExists: () => { expect(exists('selectInferenceId')).toBe(true); expect(exists('inferenceIdButton')).toBe(true); find('inferenceIdButton').simulate('click'); }, - openSelectInferencePopover: async () => { + openSelectInferencePopover: () => { expect(exists('addInferenceEndpointButton')).toBe(true); expect(exists('manageInferenceEndpointButton')).toBe(true); }, - expectDefaultInferenceModelToExists: async () => { - expect(exists('default-inference_elser_model_2')).toBe(true); - expect(exists('default-inference_e5')).toBe(true); + expectDefaultInferenceModelToExists: () => { + expect(exists('custom-inference_elser_model_2')).toBe(true); + expect(exists('custom-inference_e5')).toBe(true); }, - expectCustomInferenceModelToExists: async (customInference: string) => { + expectCustomInferenceModelToExists: (customInference: string) => { expect(exists(customInference)).toBe(true); }, }; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index 9998dbf0e9874..298ad1f9af02c 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -69,6 +69,7 @@ describe('', () => { httpRequestsMockHelpers.setLoadIndexStatsResponse(testIndexName, testIndexStats); httpRequestsMockHelpers.setLoadIndexMappingResponse(testIndexName, testIndexMappings); httpRequestsMockHelpers.setLoadIndexSettingsResponse(testIndexName, testIndexSettings); + httpRequestsMockHelpers.setInferenceModels([]); await act(async () => { testBed = await setup({ @@ -692,6 +693,7 @@ describe('', () => { ml: { mlApi: { trainedModels: { + getModelsDownloadStatus: jest.fn().mockResolvedValue({}), getTrainedModels: jest.fn().mockResolvedValue([ { model_id: '.elser_model_2', diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx index c734943ec4592..43bf8073de0aa 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/select_inference_id.test.tsx @@ -5,13 +5,20 @@ * 2.0. */ +import { + Form, + useForm, +} from '../../../public/application/components/mappings_editor/shared_imports'; import { registerTestBed } from '@kbn/test-jest-helpers'; import { act } from 'react-dom/test-utils'; -import { SelectInferenceId } from '../../../public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id'; +import { + SelectInferenceId, + SelectInferenceIdProps, +} from '../../../public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id'; +import React from 'react'; -const onChangeMock = jest.fn(); -const setValueMock = jest.fn(); -const setNewInferenceEndpointMock = jest.fn(); +const createInferenceEndpointMock = jest.fn(); +const mockDispatch = jest.fn(); jest.mock('../../../public/application/app_context', () => ({ useAppContext: jest.fn().mockReturnValue({ @@ -41,23 +48,40 @@ jest.mock( }), }) ); + +jest.mock('../../../public/application/components/mappings_editor/mappings_state_context', () => ({ + useMappingsState: () => ({ inferenceToModelIdMap: {} }), + useDispatch: () => mockDispatch, +})); + +function getTestForm(Component: React.FC) { + return (defaultProps: SelectInferenceIdProps) => { + const { form } = useForm(); + form.setFieldValue('inference_id', 'elser_model_2'); + return ( +
+ + + ); + }; +} + describe('SelectInferenceId', () => { let exists: any; let find: any; beforeAll(async () => { - const setup = registerTestBed(SelectInferenceId, { - defaultProps: { - onChange: onChangeMock, - 'data-test-subj': 'data-inference-endpoint-list', - setValue: setValueMock, - setNewInferenceEndpoint: setNewInferenceEndpointMock, - }, + const defaultProps: SelectInferenceIdProps = { + 'data-test-subj': 'data-inference-endpoint-list', + createInferenceEndpoint: createInferenceEndpointMock, + }; + const setup = registerTestBed(getTestForm(SelectInferenceId), { + defaultProps, memoryRouter: { wrapComponent: false }, }); await act(async () => { - const testBed = setup(); + const testBed = await setup(); exists = testBed.exists; find = testBed.find; }); diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx index 17299a0f04b4f..cd9d099ee92f8 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/trained_models_deployment_modal.test.tsx @@ -6,26 +6,159 @@ */ import { registerTestBed } from '@kbn/test-jest-helpers'; -import { TrainedModelsDeploymentModal } from '../../../public/application/sections/home/index_list/details_page/trained_models_deployment_modal'; +import { + TrainedModelsDeploymentModal, + TrainedModelsDeploymentModalProps, +} from '../../../public/application/sections/home/index_list/details_page/trained_models_deployment_modal'; import { act } from 'react-dom/test-utils'; +import * as mappingsContext from '../../../public/application/components/mappings_editor/mappings_state_context'; +import { NormalizedField } from '../../../public/application/components/mappings_editor/types'; -const refreshModal = jest.fn(); -const setIsModalVisible = jest.fn(); -const tryAgainForErrorModal = jest.fn(); -const setIsVisibleForErrorModal = jest.fn(); +jest.mock('../../../public/hooks/use_ml_model_status_toasts', () => ({ + useMLModelNotificationToasts: jest.fn().mockReturnValue({ + showErrorToasts: jest.fn(), + }), +})); -describe('When semantic_text is enabled', () => { - describe('When there is no error in the model deployment', () => { - const setup = registerTestBed(TrainedModelsDeploymentModal, { - defaultProps: { - setIsModalVisible, - refreshModal, - pendingDeployments: ['.elser-test-3'], - errorsInTrainedModelDeployment: [], +jest.mock('../../../public/application/app_context', () => ({ + useAppContext: jest.fn().mockReturnValue({ + url: undefined, + plugins: { + ml: { + mlApi: { + trainedModels: { + getModelsDownloadStatus: jest.fn().mockResolvedValue({}), + getTrainedModels: jest.fn().mockResolvedValue([ + { + model_id: '.elser_model_2', + model_type: 'pytorch', + model_package: { + packaged_model_id: 'elser_model_2', + model_repository: 'https://ml-models.elastic.co', + minimum_version: '11.0.0', + size: 438123914, + sha256: '', + metadata: {}, + tags: [], + vocabulary_file: 'elser_model_2.vocab.json', + }, + description: 'Elastic Learned Sparse EncodeR v2', + tags: ['elastic'], + }, + ]), + getTrainedModelStats: jest.fn().mockResolvedValue({ + count: 1, + trained_model_stats: [ + { + model_id: '.elser_model_2', + + deployment_stats: { + deployment_id: 'elser_model_2', + model_id: '.elser_model_2', + threads_per_allocation: 1, + number_of_allocations: 1, + queue_capacity: 1024, + state: 'started', + }, + }, + ], + }), + }, + }, }, + }, + }), +})); + +jest.mock('../../../public/application/components/mappings_editor/mappings_state_context'); + +const mappingsContextMocked = jest.mocked(mappingsContext); + +const defaultState = { + inferenceToModelIdMap: { + e5: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.multilingual-e5-small', + }, + elser_model_2: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + openai: { + isDeployed: false, + isDeployable: false, + trainedModelId: '', + }, + my_elser_endpoint: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + }, + fields: { + aliases: {}, + byId: {}, + rootLevelFields: [], + maxNestedDepth: 0, + }, + mappingViewFields: { byId: {} }, +} as any; + +const setErrorsInTrainedModelDeployment = jest.fn().mockReturnValue(undefined); +const fetchData = jest.fn().mockReturnValue(undefined); + +describe('When semantic_text is enabled', () => { + const setup = (defaultProps: Partial) => + registerTestBed(TrainedModelsDeploymentModal, { + defaultProps, memoryRouter: { wrapComponent: false }, + })(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('When there are no pending deployments and no errors in the model deployment', () => { + mappingsContextMocked.useMappingsState.mockReturnValue(defaultState); + const { exists } = setup({ + errorsInTrainedModelDeployment: {}, + fetchData, + setErrorsInTrainedModelDeployment: () => undefined, + }); + + it('should not display the modal', () => { + expect(exists('trainedModelsDeploymentModal')).toBe(false); + }); + }); + + describe('When there are pending deployments in the model deployment', () => { + mappingsContextMocked.useMappingsState.mockReturnValue({ + ...defaultState, + fields: { + ...defaultState.fields, + byId: { + new_field: { + id: 'new_field', + isMultiField: false, + path: ['new_field'], + source: { + name: 'new_field', + type: 'semantic_text', + reference_field: 'title', + inference_id: 'elser_model_2', + }, + } as NormalizedField, + }, + rootLevelFields: ['new_field'], + }, + } as any); + const { exists, find } = setup({ + errorsInTrainedModelDeployment: {}, + fetchData, + setErrorsInTrainedModelDeployment, }); - const { exists, find } = setup(); it('should display the modal', () => { expect(exists('trainedModelsDeploymentModal')).toBe(true); @@ -37,55 +170,61 @@ describe('When semantic_text is enabled', () => { ); }); - it('should call refresh method if refresh button is pressed', async () => { + it('should call fetch data if refresh button is pressed', async () => { await act(async () => { find('confirmModalConfirmButton').simulate('click'); }); - expect(refreshModal.mock.calls).toHaveLength(1); - }); - - it('should call setIsModalVisible method if cancel button is pressed', async () => { - await act(async () => { - find('confirmModalCancelButton').simulate('click'); - }); - expect(setIsModalVisible).toHaveBeenLastCalledWith(false); + expect(fetchData.mock.calls).toHaveLength(1); }); }); describe('When there is error in the model deployment', () => { - const setup = registerTestBed(TrainedModelsDeploymentModal, { - defaultProps: { - setIsModalVisible: setIsVisibleForErrorModal, - refreshModal: tryAgainForErrorModal, - pendingDeployments: ['.elser-test-3'], - errorsInTrainedModelDeployment: ['.elser-test-3'], + mappingsContextMocked.useMappingsState.mockReturnValue({ + ...defaultState, + fields: { + ...defaultState.fields, + byId: { + new_field: { + id: 'new_field', + isMultiField: false, + path: ['new_field'], + source: { + name: 'new_field', + type: 'semantic_text', + reference_field: 'title', + inference_id: 'elser_model_2', + }, + } as NormalizedField, + }, + rootLevelFields: ['new_field'], }, - memoryRouter: { wrapComponent: false }, + } as any); + const { find } = setup({ + fetchData, + errorsInTrainedModelDeployment: { '.elser_model_2': 'Error' }, + setErrorsInTrainedModelDeployment, }); - const { exists, find } = setup(); - it('should display the modal', () => { - expect(exists('trainedModelsErroredDeploymentModal')).toBe(true); + it('should display text related to errored deployments', () => { + expect(find('trainedModelsDeploymentModalText').text()).toContain('There was an error'); }); - it('should contain content related to semantic_text', () => { - expect(find('trainedModelsErrorDeploymentModalText').text()).toContain( - 'There was an error when trying to deploy' - ); + it('should display only the errored deployment', () => { + expect(find('trainedModelsDeploymentModal').text()).toContain('.elser_model_2'); + expect(find('trainedModelsDeploymentModal').text()).not.toContain('valid-model'); }); it("should call refresh method if 'Try again' button is pressed", async () => { await act(async () => { find('confirmModalConfirmButton').simulate('click'); }); - expect(tryAgainForErrorModal.mock.calls).toHaveLength(1); + expect(fetchData.mock.calls).toHaveLength(1); }); it('should call setIsVisibleForErrorModal method if cancel button is pressed', async () => { await act(async () => { find('confirmModalCancelButton').simulate('click'); }); - expect(setIsVisibleForErrorModal).toHaveBeenLastCalledWith(false); }); }); }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx index e1c3ea7dc6179..094fd40ab1e32 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx @@ -380,8 +380,11 @@ export const setup = ( props: any = { onUpdate() {} }, appDependencies?: any ): MappingsEditorTestBed => { + const defaultAppDependencies = { + plugins: {}, + }; const setupTestBed = registerTestBed( - WithAppDependencies(MappingsEditor, appDependencies), + WithAppDependencies(MappingsEditor, appDependencies ?? defaultAppDependencies), { memoryRouter: { wrapComponent: false, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx index 1347aaeade4f8..685aa4963edc4 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mappings_editor.test.tsx @@ -28,6 +28,7 @@ describe('Mappings editor: core', () => { let onChangeHandler: jest.Mock = jest.fn(); let getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler); let testBed: MappingsEditorTestBed; + const appDependencies = { plugins: { ml: { mlApi: {} } } }; beforeAll(() => { jest.useFakeTimers({ legacyFakeTimers: true }); @@ -55,7 +56,7 @@ describe('Mappings editor: core', () => { }; await act(async () => { - testBed = setup({ value: defaultMappings, onChange: onChangeHandler }); + testBed = setup({ value: defaultMappings, onChange: onChangeHandler }, appDependencies); }); const { component } = testBed; @@ -95,7 +96,7 @@ describe('Mappings editor: core', () => { }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component, exists } = testBed; @@ -115,7 +116,7 @@ describe('Mappings editor: core', () => { }, }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component, exists } = testBed; @@ -137,6 +138,7 @@ describe('Mappings editor: core', () => { config: { enableMappingsSourceFieldSection: true, }, + ...appDependencies, }; beforeEach(async () => { @@ -295,6 +297,7 @@ describe('Mappings editor: core', () => { config: { enableMappingsSourceFieldSection: true, }, + ...appDependencies, }; beforeEach(async () => { @@ -472,7 +475,7 @@ describe('Mappings editor: core', () => { }, }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component, exists } = testBed; @@ -494,7 +497,7 @@ describe('Mappings editor: core', () => { }, }; await act(async () => { - testBed = setup({ onChange: onChangeHandler, value }); + testBed = setup({ onChange: onChangeHandler, value }, appDependencies); }); const { component } = testBed; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx index e895a00b9f6d8..6fe58e7ba26da 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/name_parameter.tsx @@ -7,6 +7,7 @@ import React, { useCallback, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; import { TextField, UseField, FieldConfig } from '../../../shared_imports'; import { validateUniqueName } from '../../../lib'; import { PARAMETERS_DEFINITION } from '../../../constants'; @@ -14,7 +15,11 @@ import { useMappingsState } from '../../../mappings_state_context'; const { validations, ...rest } = PARAMETERS_DEFINITION.name.fieldConfig as FieldConfig; -export const NameParameter = () => { +interface NameParameterProps { + isSemanticText?: boolean; +} + +export const NameParameter: React.FC = ({ isSemanticText }) => { const { fields: { rootLevelFields, byId }, documentFields: { fieldToAddFieldTo, fieldToEdit }, @@ -32,6 +37,11 @@ export const NameParameter = () => { const nameConfig: FieldConfig = useMemo( () => ({ ...rest, + label: isSemanticText + ? i18n.translate('xpack.idxMgmt.mappingsEditor.semanticTextNameFieldLabel', { + defaultMessage: 'New field name', + }) + : rest.label, validations: [ ...validations!, { @@ -39,7 +49,7 @@ export const NameParameter = () => { }, ], }), - [uniqueNameValidator] + [isSemanticText, uniqueNameValidator] ); return ( diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx index b8f5e866b68a9..9d923f529931b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx @@ -5,65 +5,45 @@ * 2.0. */ -import React, { useEffect } from 'react'; +import React from 'react'; -import { useLoadIndexMappings } from '../../../../../services'; import { getFieldConfig } from '../../../lib'; -import { Form, SuperSelectField, UseField, useForm } from '../../../shared_imports'; +import { useMappingsState } from '../../../mappings_state_context'; +import { SuperSelectField, UseField } from '../../../shared_imports'; import { SuperSelectOption } from '../../../types'; -interface Props { - onChange(value: string): void; - 'data-test-subj'?: string; - indexName?: string; -} +export const ReferenceFieldSelects = () => { + const { fields, mappingViewFields } = useMappingsState(); -export const ReferenceFieldSelects = ({ - onChange, - 'data-test-subj': dataTestSubj, - indexName, -}: Props) => { - const { form } = useForm(); - const { subscribe } = form; + const allFields = { + byId: { + ...mappingViewFields.byId, + ...fields.byId, + }, + rootLevelFields: [], + aliases: {}, + maxNestedDepth: 0, + }; - const { data } = useLoadIndexMappings(indexName ?? ''); - const referenceFieldOptions: SuperSelectOption[] = []; - if (data && data.mappings && data.mappings.properties) { - Object.keys(data.mappings.properties).forEach((key) => { - const field = data.mappings.properties[key]; - if (field.type === 'text') { - referenceFieldOptions.push({ - value: key, - inputDisplay: key, - 'data-test-subj': `select-reference-field-${key}`, - }); - } - }); - } + const referenceFieldOptions: SuperSelectOption[] = Object.values(allFields.byId) + .filter((field) => field.source.type === 'text') + .map((field) => ({ + value: field.path.join('.'), + inputDisplay: field.path.join('.'), + 'data-test-subj': `select-reference-field-${field.path.join('.')}}`, + })); const fieldConfigReferenceField = getFieldConfig('reference_field'); - - useEffect(() => { - const subscription = subscribe((updateData) => { - const formData = updateData.data.internal; - const value = formData.main; - onChange(value); - }); - - return subscription.unsubscribe; - }, [subscribe, onChange]); return ( -
- - {(field) => ( - - )} - -
+ + {(field) => ( + + )} + ); }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx index e9a4387f91206..c4da2d30ac4fd 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/select_inference_id.tsx @@ -24,63 +24,74 @@ import { import { i18n } from '@kbn/i18n'; import React, { useEffect, useState, useCallback, useMemo } from 'react'; -import { - InferenceAPIConfigResponse, - SUPPORTED_PYTORCH_TASKS, - TRAINED_MODEL_TYPE, -} from '@kbn/ml-trained-models-utils'; +import { SUPPORTED_PYTORCH_TASKS, TRAINED_MODEL_TYPE } from '@kbn/ml-trained-models-utils'; import { InferenceTaskType } from '@elastic/elasticsearch/lib/api/types'; -import { - ElasticsearchModelDefaultOptions, - ModelConfig, - Service, -} from '@kbn/inference_integration_flyout/types'; +import { ModelConfig } from '@kbn/inference_integration_flyout/types'; import { InferenceFlyoutWrapper } from '@kbn/inference_integration_flyout/components/inference_flyout_wrapper'; import { TrainedModelConfigResponse } from '@kbn/ml-plugin/common/types/trained_models'; import { getFieldConfig } from '../../../lib'; import { useAppContext } from '../../../../../app_context'; -import { Form, UseField, useForm } from '../../../shared_imports'; import { useLoadInferenceEndpoints } from '../../../../../services/api'; -import { getTrainedModelStats } from '../../../../../../hooks/use_details_page_mappings_model_management'; -import { InferenceToModelIdMap } from '../fields'; import { useMLModelNotificationToasts } from '../../../../../../hooks/use_ml_model_status_toasts'; -import { - CustomInferenceEndpointConfig, - DefaultInferenceModels, - DeploymentState, -} from '../../../types'; +import { CustomInferenceEndpointConfig } from '../../../types'; +import { UseField } from '../../../shared_imports'; -const inferenceServiceTypeElasticsearchModelMap: Record = - { - elser: ElasticsearchModelDefaultOptions.elser, - elasticsearch: ElasticsearchModelDefaultOptions.e5, - }; -const uncheckSelectedModelOption = (options: EuiSelectableOption[]) => { - const checkedOption = options.find(({ checked }) => checked === 'on'); - if (checkedOption) { - checkedOption.checked = undefined; - } -}; -interface Props { - onChange(value: string): void; +export interface SelectInferenceIdProps { + createInferenceEndpoint: ( + trainedModelId: string, + inferenceId: string, + modelConfig: CustomInferenceEndpointConfig + ) => Promise; 'data-test-subj'?: string; - setValue: (value: string) => void; - setNewInferenceEndpoint: ( - newInferenceEndpoint: InferenceToModelIdMap, - customInferenceEndpointConfig: CustomInferenceEndpointConfig - ) => void; } -export const SelectInferenceId = ({ - onChange, + +type SelectInferenceIdContentProps = SelectInferenceIdProps & { + setValue: (value: string) => void; + value: string; +}; + +const defaultEndpoints = [ + { + model_id: 'elser_model_2', + }, + { + model_id: 'e5', + }, +]; + +export const SelectInferenceId: React.FC = ({ + createInferenceEndpoint, + 'data-test-subj': dataTestSubj, +}: SelectInferenceIdProps) => { + const config = getFieldConfig('inference_id'); + return ( + + {(field) => { + return ( + + ); + }} + + ); +}; + +const SelectInferenceIdContent: React.FC = ({ + createInferenceEndpoint, 'data-test-subj': dataTestSubj, setValue, - setNewInferenceEndpoint, -}: Props) => { + value, +}) => { const { core: { application }, docLinks, plugins: { ml }, } = useAppContext(); + const config = getFieldConfig('inference_id'); const getMlTrainedModelPageUrl = useCallback(async () => { return await ml?.locator?.getUrl({ @@ -88,9 +99,6 @@ export const SelectInferenceId = ({ }); }, [ml]); - const { form } = useForm({ defaultValue: { main: DefaultInferenceModels.elser_model_2 } }); - const { subscribe } = form; - const [isInferenceFlyoutVisible, setIsInferenceFlyoutVisible] = useState(false); const [availableTrainedModels, setAvailableTrainedModels] = useState< TrainedModelConfigResponse[] @@ -118,101 +126,57 @@ export const SelectInferenceId = ({ return availableTrainedModelsList; }, [availableTrainedModels]); + const [isSaveInferenceLoading, setIsSaveInferenceLoading] = useState(false); - const fieldConfigModelId = getFieldConfig('inference_id'); - const defaultInferenceIds: EuiSelectableOption[] = useMemo(() => { - return [ - { - checked: 'on', - label: 'elser_model_2', - 'data-test-subj': 'default-inference_elser_model_2', - }, - { - label: 'e5', - 'data-test-subj': 'default-inference_e5', - }, - ]; - }, []); - - const { isLoading, data: models } = useLoadInferenceEndpoints(); - - const [options, setOptions] = useState([...defaultInferenceIds]); - const inferenceIdOptionsFromModels = useMemo(() => { - const inferenceIdOptions = - models?.map((model: InferenceAPIConfigResponse) => ({ - label: model.model_id, - 'data-test-subj': `custom-inference_${model.model_id}`, - })) || []; + const { isLoading, data: endpoints, resendRequest } = useLoadInferenceEndpoints(); - return inferenceIdOptions; - }, [models]); - - useEffect(() => { - const mergedOptions = { - ...inferenceIdOptionsFromModels.reduce( - (acc, option) => ({ ...acc, [option.label]: option }), - {} - ), - ...defaultInferenceIds.reduce((acc, option) => ({ ...acc, [option.label]: option }), {}), - }; - setOptions(Object.values(mergedOptions)); - }, [inferenceIdOptionsFromModels, defaultInferenceIds]); + const options: EuiSelectableOption[] = useMemo(() => { + const missingDefaultEndpoints = defaultEndpoints.filter( + (endpoint) => !(endpoints || []).find((e) => e.model_id === endpoint.model_id) + ); + const newOptions: EuiSelectableOption[] = [ + ...(endpoints || []), + ...missingDefaultEndpoints, + ].map((endpoint) => ({ + label: endpoint.model_id, + 'data-test-subj': `custom-inference_${endpoint.model_id}`, + checked: value === endpoint.model_id ? 'on' : undefined, + })); + if (value && !newOptions.find((option) => option.label === value)) { + // Sometimes we create a new endpoint but the backend is slow in updating so we need to optimistically update + const newOption: EuiSelectableOption = { + label: value, + checked: 'on', + 'data-test-subj': `custom-inference_${value}`, + }; + return [...newOptions, newOption]; + } + return newOptions; + }, [endpoints, value]); const { showErrorToasts } = useMLModelNotificationToasts(); const onSaveInferenceCallback = useCallback( async (inferenceId: string, taskType: InferenceTaskType, modelConfig: ModelConfig) => { - setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); try { - const isDeployable = - modelConfig.service === Service.elser || modelConfig.service === Service.elasticsearch; - - const newOption: EuiSelectableOption[] = [ - { - label: inferenceId, - checked: 'on', - 'data-test-subj': `custom-inference_${inferenceId}`, - }, - ]; - // uncheck selected endpoint id - uncheckSelectedModelOption(options); - - setOptions([...options, ...newOption]); - - const trainedModelStats = await ml?.mlApi?.trainedModels.getTrainedModelStats(); - const defaultEndpointId = - inferenceServiceTypeElasticsearchModelMap[modelConfig.service] || ''; - const newModelId: InferenceToModelIdMap = {}; - newModelId[inferenceId] = { - trainedModelId: defaultEndpointId, - isDeployable, - isDeployed: - getTrainedModelStats(trainedModelStats)[defaultEndpointId] === DeploymentState.DEPLOYED, - }; - const customInferenceEndpointConfig: CustomInferenceEndpointConfig = { + const trainedModelId = modelConfig.service_settings.model_id || ''; + const customModelConfig = { taskType, modelConfig, }; - setNewInferenceEndpoint(newModelId, customInferenceEndpointConfig); + setIsSaveInferenceLoading(true); + await createInferenceEndpoint(trainedModelId, inferenceId, customModelConfig); + resendRequest(); + setValue(inferenceId); + setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); + setIsSaveInferenceLoading(false); } catch (error) { showErrorToasts(error); + setIsSaveInferenceLoading(false); } }, - [isInferenceFlyoutVisible, ml, setNewInferenceEndpoint, options, showErrorToasts] + [createInferenceEndpoint, setValue, isInferenceFlyoutVisible, showErrorToasts, resendRequest] ); - useEffect(() => { - const subscription = subscribe((updateData) => { - const formData = updateData.data.internal; - const value = formData.main; - onChange(value); - }); - - return subscription.unsubscribe; - }, [subscribe, onChange]); - const selectedOptionLabel = options.find((option) => option.checked)?.label; - useEffect(() => { - setValue(selectedOptionLabel ?? DefaultInferenceModels.elser_model_2); - }, [selectedOptionLabel, setValue]); const [isInferencePopoverVisible, setIsInferencePopoverVisible] = useState(false); const [inferenceEndpointError, setInferenceEndpointError] = useState( undefined @@ -221,7 +185,15 @@ export const SelectInferenceId = ({ async (inferenceId: string) => { const modelsExist = options.some((i) => i.label === inferenceId); if (modelsExist) { - setInferenceEndpointError('Inference Endpoint id already exists'); + setInferenceEndpointError( + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.defaultLabel', + { + defaultMessage: 'Inference endpoint {inferenceId} already exists', + values: { inferenceId }, + } + ) + ); } else { setInferenceEndpointError(undefined); } @@ -229,139 +201,133 @@ export const SelectInferenceId = ({ [options] ); - const inferencePopover = () => { - return ( - - - {(field) => ( - <> - -

- {field.label} -

-
- - { - setIsInferencePopoverVisible(!isInferencePopoverVisible); - }} - > - {selectedOptionLabel || - i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.defaultLabel', - { - defaultMessage: 'No model selected', - } - )} - - - )} -
- - } - isOpen={isInferencePopoverVisible} - panelPaddingSize="m" - closePopover={() => setIsInferencePopoverVisible(!isInferencePopoverVisible)} - > - - option.checked)?.label; + + const inferencePopover = () => ( + + +

+ {config.label} +

+
+ + { - setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); - setInferenceEndpointError(undefined); setIsInferencePopoverVisible(!isInferencePopoverVisible); }} > + {selectedOptionLabel || + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.alreadyExistsLabel', + { + defaultMessage: 'No inference endpoint selected', + } + )} + + + } + isOpen={isInferencePopoverVisible} + panelPaddingSize="m" + closePopover={() => setIsInferencePopoverVisible(!isInferencePopoverVisible)} + > + + { + setIsInferenceFlyoutVisible(!isInferenceFlyoutVisible); + setInferenceEndpointError(undefined); + setIsInferencePopoverVisible(!isInferencePopoverVisible); + }} + > + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.addInferenceEndpointButton', + { + defaultMessage: 'Add Inference Endpoint', + } + )} + + + { + const mlTrainedPageUrl = await getMlTrainedModelPageUrl(); + if (typeof mlTrainedPageUrl === 'string') { + application.navigateToUrl(mlTrainedPageUrl); + } + }} + > + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.manageInferenceEndpointButton', + { + defaultMessage: 'Manage Inference Endpoints', + } + )} + + + + + +

{i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.addInferenceEndpointButton', - { - defaultMessage: 'Add inference Endpoint', - } - )} - - - { - const mlTrainedPageUrl = await getMlTrainedModelPageUrl(); - if (typeof mlTrainedPageUrl === 'string') { - application.navigateToUrl(mlTrainedPageUrl); - } - }} - > - {i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.manageInferenceEndpointButton', + 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.selectable.Label', { - defaultMessage: 'Manage Inference Endpoint', + defaultMessage: 'Existing endpoints', } )} - - - - - -

- {i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.inferenceId.popover.selectable.Label', - { - defaultMessage: 'Existing endpoints', - } - )} -

-
- +

+
+ - { - setOptions(newOptions); - setIsInferencePopoverVisible(!isInferencePopoverVisible); - }} - > - {(list, search) => ( - <> - {search} - {list} - - )} - -
-
- ); - }; + ), + }} + options={options} + onChange={(newOptions) => { + setValue(newOptions.find((option) => option.checked)?.label || ''); + }} + > + {(list, search) => ( + <> + {search} + {list} + + )} + + +
+ ); return ( -
+ <> + {inferencePopover()} @@ -378,6 +344,7 @@ export const SelectInferenceId = ({ supportedNlpModels={docLinks.links.enterpriseSearch.supportedNlpModels} nlpImportModel={docLinks.links.ml.nlpImportModel} setInferenceEndpointError={setInferenceEndpointError} + isCreateInferenceApiLoading={isSaveInferenceLoading} /> )} @@ -395,6 +362,6 @@ export const SelectInferenceId = ({ /> - + ); }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx index 4a3f600753dd4..4f8e6557e334f 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx @@ -14,20 +14,16 @@ import { EuiSpacer, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ElasticsearchModelDefaultOptions } from '@kbn/inference_integration_flyout/types'; +import { TrainedModelStat } from '@kbn/ml-plugin/common/types/trained_models'; import { MlPluginStart } from '@kbn/ml-plugin/public'; import classNames from 'classnames'; -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import { EUI_SIZE, TYPE_DEFINITION } from '../../../../constants'; import { fieldSerializer } from '../../../../lib'; -import { useDispatch, useMappingsState } from '../../../../mappings_state_context'; -import { Form, FormDataProvider, UseField, useForm, useFormData } from '../../../../shared_imports'; -import { - CustomInferenceEndpointConfig, - Field, - MainType, - NormalizedFields, -} from '../../../../types'; +import { isSemanticTextField } from '../../../../lib/utils'; +import { useDispatch } from '../../../../mappings_state_context'; +import { Form, FormDataProvider, useForm, useFormData } from '../../../../shared_imports'; +import { Field, MainType, NormalizedFields } from '../../../../types'; import { NameParameter, SubTypeParameter, TypeParameter } from '../../field_parameters'; import { ReferenceFieldSelects } from '../../field_parameters/reference_field_selects'; import { SelectInferenceId } from '../../field_parameters/select_inference_id'; @@ -38,9 +34,11 @@ import { useSemanticText } from './semantic_text/use_semantic_text'; const formWrapper = (props: any) =>
; export interface InferenceToModelIdMap { [key: string]: { - trainedModelId: ElasticsearchModelDefaultOptions | string; + trainedModelId: string; isDeployed: boolean; isDeployable: boolean; + isDownloading: boolean; + modelStats?: TrainedModelStat; // third-party models don't have model stats }; } @@ -48,7 +46,9 @@ export interface SemanticTextInfo { isSemanticTextEnabled?: boolean; indexName?: string; ml?: MlPluginStart; - setErrorsInTrainedModelDeployment: React.Dispatch>; + setErrorsInTrainedModelDeployment: React.Dispatch< + React.SetStateAction> + >; } interface Props { allFields: NormalizedFields['byId']; @@ -73,13 +73,13 @@ export const CreateField = React.memo(function CreateFieldComponent({ isAddingFields, semanticTextInfo, }: Props) { - const { isSemanticTextEnabled, indexName, ml, setErrorsInTrainedModelDeployment } = - semanticTextInfo ?? {}; + const { isSemanticTextEnabled, ml, setErrorsInTrainedModelDeployment } = semanticTextInfo ?? {}; const dispatch = useDispatch(); const { form } = useForm({ serializer: fieldSerializer, options: { stripEmptyFields: false }, + id: 'create-field', }); useFormData({ form }); @@ -93,9 +93,6 @@ export const CreateField = React.memo(function CreateFieldComponent({ return subscription.unsubscribe; }, [dispatch, subscribe]); - const [customInferenceEndpointConfig, setCustomInferenceEndpointConfig] = useState< - CustomInferenceEndpointConfig | undefined - >(undefined); const cancel = () => { if (isAddingFields && onCancelAddingNewFields) { onCancelAddingNewFields(); @@ -104,19 +101,14 @@ export const CreateField = React.memo(function CreateFieldComponent({ } }; - const { - referenceFieldComboValue, - nameValue, - inferenceIdComboValue, - setInferenceValue, - semanticFieldType, - handleSemanticText, - } = useSemanticText({ + const { createInferenceEndpoint, handleSemanticText } = useSemanticText({ form, setErrorsInTrainedModelDeployment, ml, }); + const isSemanticText = form.getFormData().type === 'semantic_text'; + const submitForm = async ( e?: React.FormEvent, exitAfter: boolean = false, @@ -128,11 +120,9 @@ export const CreateField = React.memo(function CreateFieldComponent({ const { isValid, data } = await form.submit(); - if (isValid) { - form.reset(); - - if (data.type === 'semantic_text' && !clickOutside) { - handleSemanticText(data, customInferenceEndpointConfig); + if (isValid && !clickOutside) { + if (isSemanticTextField(data)) { + handleSemanticText(data); } else { dispatch({ type: 'field.add', value: data }); } @@ -140,6 +130,7 @@ export const CreateField = React.memo(function CreateFieldComponent({ if (exitAfter) { cancel(); } + form.reset(); } }; @@ -187,23 +178,19 @@ export const CreateField = React.memo(function CreateFieldComponent({ {/* Field reference_field for semantic_text field type */} - + {isSemanticText && ( + + + + )} {/* Field name */} - + ); - const isAddFieldButtonDisabled = (): boolean => { - if (semanticFieldType) { - return !referenceFieldComboValue || !nameValue || !inferenceIdComboValue; - } - - return false; - }; - const renderFormActions = () => ( {(isCancelable !== false || isAddingFields) && ( @@ -222,7 +209,7 @@ export const CreateField = React.memo(function CreateFieldComponent({ onClick={submitForm} type="submit" data-test-subj="addButton" - isDisabled={isAddFieldButtonDisabled()} + isDisabled={form.getErrors().length > 0} > {isMultiField ? i18n.translate('xpack.idxMgmt.mappingsEditor.createField.addMultiFieldButtonLabel', { @@ -289,11 +276,10 @@ export const CreateField = React.memo(function CreateFieldComponent({ ); }} - {/* Field inference_id for semantic_text field type */} - + + {isSemanticText && ( + + )} {renderFormActions()}
@@ -302,69 +288,3 @@ export const CreateField = React.memo(function CreateFieldComponent({ ); }); - -function ReferenceFieldCombo({ indexName }: { indexName?: string }) { - const [{ type }] = useFormData({ watch: 'type' }); - - if (type === undefined || type[0]?.value !== 'semantic_text') { - return null; - } - - return ( - - - {(field) => } - - - ); -} - -interface InferenceProps { - setValue: (value: string) => void; - setCustomInferenceEndpointConfig: (config: CustomInferenceEndpointConfig) => void; -} - -function InferenceIdCombo({ setValue, setCustomInferenceEndpointConfig }: InferenceProps) { - const { inferenceToModelIdMap } = useMappingsState(); - const dispatch = useDispatch(); - const [{ type }] = useFormData({ watch: 'type' }); - - // update new inferenceEndpoint - const setNewInferenceEndpoint = useCallback( - ( - newInferenceEndpoint: InferenceToModelIdMap, - customInferenceEndpointConfig: CustomInferenceEndpointConfig - ) => { - dispatch({ - type: 'inferenceToModelIdMap.update', - value: { - inferenceToModelIdMap: { - ...inferenceToModelIdMap, - ...newInferenceEndpoint, - }, - }, - }); - setCustomInferenceEndpointConfig(customInferenceEndpointConfig); - }, - [dispatch, inferenceToModelIdMap, setCustomInferenceEndpointConfig] - ); - - if (type === undefined || type[0]?.value !== 'semantic_text') { - return null; - } - - return ( - <> - - - {(field) => ( - - )} - - - ); -} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts index f9bc12a9022fd..72e007b86f786 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.test.ts @@ -6,10 +6,37 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { CustomInferenceEndpointConfig, Field } from '../../../../../types'; +import { CustomInferenceEndpointConfig, SemanticTextField } from '../../../../../types'; import { useSemanticText } from './use_semantic_text'; import { act } from 'react-dom/test-utils'; +jest.mock('../../../../../../../../hooks/use_details_page_mappings_model_management', () => ({ + useDetailsPageMappingsModelManagement: () => ({ + fetchInferenceToModelIdMap: () => ({ + e5: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.multilingual-e5-small', + }, + elser_model_2: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + openai: { + isDeployed: false, + isDeployable: false, + trainedModelId: '', + }, + my_elser_endpoint: { + isDeployed: false, + isDeployable: true, + trainedModelId: '.elser_model_2', + }, + }), + }), +})); + const mlMock: any = { mlApi: { inferenceModels: { @@ -18,26 +45,30 @@ const mlMock: any = { }, }; -const mockField: Record = { +const mockField: Record = { elser_model_2: { name: 'name', type: 'semantic_text', - inferenceId: 'elser_model_2', + inference_id: 'elser_model_2', + reference_field: 'title', }, e5: { name: 'name', type: 'semantic_text', - inferenceId: 'e5', + inference_id: 'e5', + reference_field: 'title', }, openai: { name: 'name', type: 'semantic_text', - inferenceId: 'openai', + inference_id: 'openai', + reference_field: 'title', }, my_elser_endpoint: { name: 'name', type: 'semantic_text', - inferenceId: 'my_elser_endpoint', + inference_id: 'my_elser_endpoint', + reference_field: 'title', }, }; @@ -90,6 +121,10 @@ jest.mock('../../../../../mappings_state_context', () => ({ trainedModelId: '.elser_model_2', }, }, + fields: { + byId: {}, + }, + mappingViewFields: { byId: {} }, }), useDispatch: () => mockDispatch, })); @@ -128,28 +163,31 @@ describe('useSemanticText', () => { jest.clearAllMocks(); mockForm = { form: { - getFields: jest.fn().mockReturnValue({ - referenceField: { value: 'title' }, - name: { value: 'sem' }, - type: { value: [{ value: 'semantic_text' }] }, - inferenceId: { value: 'e5' }, + getFormData: jest.fn().mockReturnValue({ + referenceField: 'title', + name: 'sem', + type: 'semantic_text', + inferenceId: 'e5', }), + setFieldValue: jest.fn(), }, thirdPartyModel: { - getFields: jest.fn().mockReturnValue({ - referenceField: { value: 'title' }, - name: { value: 'semantic_text_openai_endpoint' }, - type: { value: [{ value: 'semantic_text' }] }, - inferenceId: { value: 'openai' }, + getFormData: jest.fn().mockReturnValue({ + referenceField: 'title', + name: 'semantic_text_openai_endpoint', + type: 'semantic_text', + inferenceId: 'openai', }), + setFieldValue: jest.fn(), }, elasticModelEndpointCreatedfromFlyout: { - getFields: jest.fn().mockReturnValue({ - referenceField: { value: 'title' }, - name: { value: 'semantic_text_elserServiceType_endpoint' }, - type: { value: [{ value: 'semantic_text' }] }, - inferenceId: { value: 'my_elser_endpoint' }, + getFormData: jest.fn().mockReturnValue({ + referenceField: 'title', + name: 'semantic_text_elserServiceType_endpoint', + type: 'semantic_text', + inferenceId: 'my_elser_endpoint', }), + setFieldValue: jest.fn(), }, }; }); @@ -162,11 +200,10 @@ describe('useSemanticText', () => { }) ); await act(async () => { - result.current.setInferenceValue('openai'); result.current.handleSemanticText(mockField.openai, mockConfig.openai); }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.openai, }); expect(mlMock.mlApi.inferenceModels.createInferenceEndpoint).toHaveBeenCalledWith( @@ -184,12 +221,11 @@ describe('useSemanticText', () => { }) ); await act(async () => { - result.current.setInferenceValue('my_elser_endpoint'); result.current.handleSemanticText(mockField.my_elser_endpoint, mockConfig.elser); }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.my_elser_endpoint, }); expect(mlMock.mlApi.inferenceModels.createInferenceEndpoint).toHaveBeenCalledWith( @@ -198,20 +234,6 @@ describe('useSemanticText', () => { mockConfig.elser.modelConfig ); }); - it('should populate the values from the form', () => { - const { result } = renderHook(() => - useSemanticText({ - form: mockForm.form, - setErrorsInTrainedModelDeployment: jest.fn(), - ml: mlMock, - }) - ); - - expect(result.current.referenceFieldComboValue).toBe('title'); - expect(result.current.nameValue).toBe('sem'); - expect(result.current.inferenceIdComboValue).toBe('e5'); - expect(result.current.semanticFieldType).toBe('semantic_text'); - }); it('should handle semantic text correctly', async () => { const { result } = renderHook(() => @@ -227,7 +249,7 @@ describe('useSemanticText', () => { }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.elser_model_2, }); expect(mlMock.mlApi.inferenceModels.createInferenceEndpoint).toHaveBeenCalledWith( @@ -253,12 +275,11 @@ describe('useSemanticText', () => { ); await act(async () => { - result.current.setInferenceValue('e5'); result.current.handleSemanticText(mockField.e5); }); expect(mockDispatch).toHaveBeenCalledWith({ - type: 'field.addSemanticText', + type: 'field.add', value: mockField.e5, }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts index 72be2636329a2..2eb4343d0c7a4 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/semantic_text/use_semantic_text.ts @@ -5,23 +5,26 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; import { useCallback } from 'react'; import { MlPluginStart } from '@kbn/ml-plugin/public'; -import React, { useEffect, useState } from 'react'; -import { ElasticsearchModelDefaultOptions } from '@kbn/inference_integration_flyout/types'; +import React, { useEffect } from 'react'; import { InferenceTaskType } from '@elastic/elasticsearch/lib/api/types'; -import { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; +import { ElserModels } from '@kbn/ml-trained-models-utils'; +import { i18n } from '@kbn/i18n'; +import { useDetailsPageMappingsModelManagement } from '../../../../../../../../hooks/use_details_page_mappings_model_management'; import { useDispatch, useMappingsState } from '../../../../../mappings_state_context'; import { FormHook } from '../../../../../shared_imports'; -import { CustomInferenceEndpointConfig, DefaultInferenceModels, Field } from '../../../../../types'; +import { CustomInferenceEndpointConfig, Field, SemanticTextField } from '../../../../../types'; import { useMLModelNotificationToasts } from '../../../../../../../../hooks/use_ml_model_status_toasts'; import { getInferenceEndpoints } from '../../../../../../../services/api'; +import { getFieldByPathName } from '../../../../../lib/utils'; interface UseSemanticTextProps { form: FormHook; ml?: MlPluginStart; - setErrorsInTrainedModelDeployment: React.Dispatch> | undefined; + setErrorsInTrainedModelDeployment?: React.Dispatch< + React.SetStateAction> + >; } interface DefaultInferenceEndpointConfig { taskType: InferenceTaskType; @@ -30,70 +33,52 @@ interface DefaultInferenceEndpointConfig { export function useSemanticText(props: UseSemanticTextProps) { const { form, setErrorsInTrainedModelDeployment, ml } = props; - const { inferenceToModelIdMap } = useMappingsState(); + const { fields, mappingViewFields } = useMappingsState(); + const { fetchInferenceToModelIdMap } = useDetailsPageMappingsModelManagement(); const dispatch = useDispatch(); - const [referenceFieldComboValue, setReferenceFieldComboValue] = useState(); - const [nameValue, setNameValue] = useState(); - const [inferenceIdComboValue, setInferenceIdComboValue] = useState(); - const [semanticFieldType, setSemanticTextFieldType] = useState(); - const [inferenceValue, setInferenceValue] = useState( - DefaultInferenceModels.elser_model_2 - ); - const { showSuccessToasts, showErrorToasts } = useMLModelNotificationToasts(); + const { showSuccessToasts, showErrorToasts, showSuccessfullyDeployedToast } = + useMLModelNotificationToasts(); - const useFieldEffect = ( - semanticTextform: FormHook, - fieldName: string, - setState: React.Dispatch> - ) => { - const fieldValue = semanticTextform.getFields()?.[fieldName]?.value; - useEffect(() => { - if (typeof fieldValue === 'string') { - setState(fieldValue); - } - }, [semanticTextform, fieldValue, setState]); - }; - - useFieldEffect(form, 'referenceField', setReferenceFieldComboValue); - useFieldEffect(form, 'name', setNameValue); - - const fieldTypeValue = form.getFields()?.type?.value; + const fieldTypeValue = form.getFormData()?.type; useEffect(() => { - if (!Array.isArray(fieldTypeValue) || fieldTypeValue.length === 0) { - return; - } - setSemanticTextFieldType( - fieldTypeValue[0]?.value === 'semantic_text' ? fieldTypeValue[0].value : undefined - ); - }, [form, fieldTypeValue]); - - const inferenceId = form.getFields()?.inferenceId?.value; - useEffect(() => { - if (typeof inferenceId === 'string') { - setInferenceIdComboValue(inferenceId); + if (fieldTypeValue === 'semantic_text') { + const allFields = { + byId: { + ...fields.byId, + ...mappingViewFields.byId, + }, + rootLevelFields: [], + aliases: {}, + maxNestedDepth: 0, + }; + const defaultName = getFieldByPathName(allFields, 'semantic_text') ? '' : 'semantic_text'; + const referenceField = + Object.values(allFields.byId) + .find((field) => field.source.type === 'text') + ?.path.join('.') || ''; + if (!form.getFormData().name) { + form.setFieldValue('name', defaultName); + } + if (!form.getFormData().reference_field) { + form.setFieldValue('reference_field', referenceField); + } + if (!form.getFormData().inference_id) { + form.setFieldValue('inference_id', 'elser_model_2'); + } } - }, [form, inferenceId, inferenceToModelIdMap]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [fieldTypeValue]); const createInferenceEndpoint = useCallback( async ( - trainedModelId: ElasticsearchModelDefaultOptions | string, - data: Field, + trainedModelId: string, + inferenceId: string, customInferenceEndpointConfig?: CustomInferenceEndpointConfig ) => { - if (data.inferenceId === undefined) { - throw new Error( - i18n.translate('xpack.idxMgmt.mappingsEditor.createField.undefinedInferenceIdError', { - defaultMessage: 'Inference ID is undefined', - }) - ); - } + const isElser = ElserModels.includes(trainedModelId); const defaultInferenceEndpointConfig: DefaultInferenceEndpointConfig = { - service: - trainedModelId === ElasticsearchModelDefaultOptions.elser ? 'elser' : 'elasticsearch', - taskType: - trainedModelId === ElasticsearchModelDefaultOptions.elser - ? 'sparse_embedding' - : 'text_embedding', + service: isElser ? 'elser' : 'elasticsearch', + taskType: isElser ? 'sparse_embedding' : 'text_embedding', }; const modelConfig = customInferenceEndpointConfig @@ -108,65 +93,69 @@ export function useSemanticText(props: UseSemanticTextProps) { }; const taskType: InferenceTaskType = customInferenceEndpointConfig?.taskType ?? defaultInferenceEndpointConfig.taskType; - try { - await ml?.mlApi?.inferenceModels?.createInferenceEndpoint( - data.inferenceId, - taskType, - modelConfig - ); - } catch (error) { - throw error; - } + + await ml?.mlApi?.inferenceModels?.createInferenceEndpoint(inferenceId, taskType, modelConfig); }, [ml?.mlApi?.inferenceModels] ); const handleSemanticText = async ( - data: Field, + data: SemanticTextField, customInferenceEndpointConfig?: CustomInferenceEndpointConfig ) => { - data.inferenceId = inferenceValue; - if (data.inferenceId === undefined) { - return; - } - const inferenceData = inferenceToModelIdMap?.[data.inferenceId]; + const modelIdMap = await fetchInferenceToModelIdMap(); + const inferenceId = data.inference_id; + const inferenceData = modelIdMap?.[inferenceId]; if (!inferenceData) { - return; + throw new Error( + i18n.translate('xpack.idxMgmt.mappingsEditor.semanticText.inferenceError', { + defaultMessage: 'No inference model found for inference ID {inferenceId}', + }) + ); } const { trainedModelId } = inferenceData; - dispatch({ type: 'field.addSemanticText', value: data }); - + dispatch({ type: 'field.add', value: data }); + const inferenceEndpoints = await getInferenceEndpoints(); + const hasInferenceEndpoint = inferenceEndpoints.data?.some( + (inference) => inference.model_id === inferenceId + ); + // if inference endpoint exists already, do not create new inference endpoint + if (hasInferenceEndpoint) { + return; + } try { - // if inference endpoint exists already, do not create inference endpoint - const inferenceModels = await getInferenceEndpoints(); - const inferenceModel: InferenceAPIConfigResponse[] = inferenceModels.data.some( - (e: InferenceAPIConfigResponse) => e.model_id === inferenceValue - ); - if (inferenceModel) { - return; - } // Only show toast if it's an internal Elastic model that hasn't been deployed yet if (trainedModelId && inferenceData.isDeployable && !inferenceData.isDeployed) { showSuccessToasts(trainedModelId); } - - await createInferenceEndpoint(trainedModelId, data, customInferenceEndpointConfig); + await createInferenceEndpoint( + trainedModelId, + data.inference_id, + customInferenceEndpointConfig + ); + if (trainedModelId) { + // clear error because we've succeeded here + setErrorsInTrainedModelDeployment?.((prevItems) => ({ + ...prevItems, + [trainedModelId]: undefined, + })); + } + showSuccessfullyDeployedToast(trainedModelId); } catch (error) { // trainedModelId is empty string when it's a third party model if (trainedModelId) { - setErrorsInTrainedModelDeployment?.((prevItems) => [...prevItems, trainedModelId]); + setErrorsInTrainedModelDeployment?.((prevItems) => ({ + ...prevItems, + [trainedModelId]: error, + })); } showErrorToasts(error); } }; return { - referenceFieldComboValue, - nameValue, - inferenceIdComboValue, - semanticFieldType, + createInferenceEndpoint, handleSemanticText, - setInferenceValue, }; } diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx index 790b4560000f7..0be09876b63f2 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx @@ -1041,7 +1041,6 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, schema: t.number, }, - dims: { fieldConfig: { defaultValue: '', @@ -1070,20 +1069,46 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, reference_field: { fieldConfig: { + defaultValue: '', label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.referenceFieldLabel', { defaultMessage: 'Reference field', }), helpText: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.referenceFieldHelpText', { defaultMessage: 'Reference field for model inference.', }), + validations: [ + { + validator: emptyField( + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.validations.referenceFieldIsRequiredErrorMessage', + { + defaultMessage: 'Reference field is required.', + } + ) + ), + }, + ], }, schema: t.string, }, inference_id: { fieldConfig: { + defaultValue: 'elser_model_2', label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.inferenceIdLabel', { defaultMessage: 'Select an inference endpoint:', }), + validations: [ + { + validator: emptyField( + i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.validations.inferenceIdIsRequiredErrorMessage', + { + defaultMessage: 'Inference ID is required.', + } + ) + ), + }, + ], }, schema: t.string, }, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts index be00b71b58ea1..3a4f71a8d533b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.test.ts @@ -18,6 +18,7 @@ import { getFieldsFromState, getAllFieldTypesFromState, getFieldsMatchingFilterFromState, + getStateWithCopyToFields, } from './utils'; const fieldsWithnestedFields: NormalizedFields = { @@ -420,6 +421,7 @@ describe('utils', () => { selectedDataTypes: ['Boolean'], }, inferenceToModelIdMap: {}, + mappingViewFields: { byId: {}, rootLevelFields: [], aliases: {}, maxNestedDepth: 0 }, }; test('returns list of matching fields with search term', () => { expect(getFieldsMatchingFilterFromState(sampleState, ['Boolean'])).toEqual({ @@ -442,5 +444,203 @@ describe('utils', () => { }, }); }); + describe('getStateWithCopyToFields', () => { + test('returns state if there is no semantic text field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + source: { + name: 'title', + type: 'text', + }, + }, + }, + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(state); + }); + test('returns state if semantic text field has no reference field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + }, + }, + }, + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(state); + }); + test('adds text field with copy to to state if semantic text field has reference field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + reference_field: 'new', + }, + }, + 'new-field': { + id: 'new-field', + isMultiField: false, + path: ['new'], + source: { + name: 'new', + type: 'text', + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d'], + }, + } as any; + const expectedState = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + }, + }, + 'new-field': { + id: 'new-field', + isMultiField: false, + path: ['new'], + source: { + name: 'new', + type: 'text', + copy_to: ['title'], + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d', 'new-field'], + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(expectedState); + }); + test('adds nested text field with copy to to state if semantic text field has reference field', () => { + const state = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + reference_field: 'existing.new', + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d'], + }, + mappingViewFields: { + byId: { + existing: { + id: 'existing', + isMultiField: false, + path: ['existing'], + source: { + name: 'existing', + type: 'object', + }, + }, + 'new-field': { + id: 'new-field', + parentId: 'existing', + isMultiField: false, + path: ['existing', 'new'], + source: { + name: 'new', + type: 'text', + }, + }, + }, + }, + } as any; + const expectedState = { + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + path: ['title'], + source: { + name: 'title', + type: 'semantic_text', + inference_id: 'id', + }, + }, + existing: { + id: 'existing', + isMultiField: false, + path: ['existing'], + source: { + name: 'existing', + type: 'object', + }, + }, + 'new-field': { + id: 'new-field', + isMultiField: false, + parentId: 'existing', + path: ['existing', 'new'], + source: { + name: 'new', + type: 'text', + copy_to: ['title'], + }, + }, + }, + rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d', 'existing'], + }, + mappingViewFields: { + byId: { + existing: { + id: 'existing', + isMultiField: false, + path: ['existing'], + source: { + name: 'existing', + type: 'object', + }, + }, + 'new-field': { + id: 'new-field', + parentId: 'existing', + isMultiField: false, + path: ['existing', 'new'], + source: { + name: 'new', + type: 'text', + }, + }, + }, + }, + } as any; + expect(getStateWithCopyToFields(state)).toEqual(expectedState); + }); + }); }); }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts index cb95da745a30d..ed966805c0f2e 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts @@ -7,6 +7,7 @@ import { v4 as uuidv4 } from 'uuid'; +import { cloneDeep } from 'lodash'; import { ChildFieldName, ComboBoxOption, @@ -23,6 +24,7 @@ import { ParameterName, RuntimeFields, SubType, + SemanticTextField, } from '../types'; import { @@ -685,3 +687,88 @@ export const getAllFieldTypesFromState = (allFields: Fields): DataType[] => { const fields: DataType[] = []; return getallFieldsIncludingNestedFields(allFields, fields).filter(filterUnique); }; + +export function isSemanticTextField(field: Partial): field is SemanticTextField { + return Boolean(field.inference_id && field.type === 'semantic_text'); +} + +/** + * Returns deep copy of state with `copy_to` added to text fields that are referenced by new semantic text fields + * @param state + * @returns state + */ + +export function getStateWithCopyToFields(state: State): State { + // Make sure we don't accidentally modify existing state + let updatedState = cloneDeep(state); + for (const field of Object.values(updatedState.fields.byId)) { + if (field.source.type === 'semantic_text' && field.source.reference_field) { + // Check fields already added to the list of to-update fields first + // API will not accept reference_field so removing it now + const { reference_field: referenceField, ...source } = field.source; + if (typeof referenceField !== 'string') { + // should never happen + throw new Error('Reference field is not a string'); + } + field.source = source; + const existingTextField = + getFieldByPathName(updatedState.fields, referenceField) || + getFieldByPathName(updatedState.mappingViewFields || { byId: {} }, referenceField); + if (existingTextField) { + // Add copy_to to existing text field's copy_to array + const updatedTextField: NormalizedField = { + ...existingTextField, + source: { + ...existingTextField.source, + copy_to: existingTextField.source.copy_to + ? [ + ...(Array.isArray(existingTextField.source.copy_to) + ? existingTextField.source.copy_to + : [existingTextField.source.copy_to]), + field.path.join('.'), + ] + : [field.path.join('.')], + }, + }; + updatedState = { + ...updatedState, + fields: { + ...updatedState.fields, + byId: { + ...updatedState.fields.byId, + [existingTextField.id]: updatedTextField, + }, + }, + }; + if (existingTextField.parentId) { + let currentField = existingTextField; + let hasParent = true; + while (hasParent) { + if (!currentField.parentId) { + // reached the top of the tree, push current field to root level fields + updatedState.fields.rootLevelFields.push(currentField.id); + hasParent = false; + } else if (updatedState.fields.byId[currentField.parentId]) { + // parent is already in state, don't need to do anything + hasParent = false; + } else { + // parent is not in state yet + updatedState.fields.byId[currentField.parentId] = + updatedState.mappingViewFields.byId[currentField.parentId]; + currentField = updatedState.fields.byId[currentField.parentId]; + } + } + } else { + updatedState.fields.rootLevelFields.push(existingTextField.id); + } + } else { + throw new Error(`Semantic text field ${field.path.join('.')} has invalid reference field`); + } + } + } + return updatedState; +} + +export const getFieldByPathName = (fields: NormalizedFields, name: string) => { + return Object.values(fields.byId).find((field) => field.path.join('.') === name); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx index 2b132d377918d..ac19c5395f974 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_state_context.tsx @@ -60,6 +60,7 @@ export const StateProvider: React.FC<{ children?: React.ReactNode }> = ({ childr selectedDataTypes: [], }, inferenceToModelIdMap: {}, + mappingViewFields: { byId: {}, rootLevelFields: [], aliases: {}, maxNestedDepth: 0 }, }; const [state, dispatch] = useReducer(reducer, initialState); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts index 0e972e9900b9c..626ee0e839a8a 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts @@ -214,6 +214,9 @@ export const reducer = (state: State, action: Action): State => { }, }; } + case 'editor.replaceViewMappings': { + return { ...state, mappingViewFields: action.value.fields }; + } case 'configuration.update': { const nextState = { ...state, @@ -323,28 +326,6 @@ export const reducer = (state: State, action: Action): State => { case 'field.add': { return addFieldToState(action.value, state); } - case 'field.addSemanticText': { - const addTexFieldWithCopyToActionValue: Field = { - name: action.value.referenceField as string, - type: 'text', - copy_to: [action.value.name], - }; - - // Add text field to state with copy_to of semantic_text field - let updatedState = addFieldToState(addTexFieldWithCopyToActionValue, state); - - const addSemanticTextFieldActionValue: Field = { - name: action.value.name, - inference_id: action.value.inferenceId, - type: 'semantic_text', - }; - - // Add semantic_text field to state and reset fieldToAddFieldTo - updatedState = addFieldToState(addSemanticTextFieldActionValue, updatedState); - updatedState.documentFields.fieldToAddFieldTo = undefined; - - return updatedState; - } case 'field.remove': { const field = state.fields.byId[action.value]; const { id, hasChildFields, hasMultiFields } = field; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts index 767d29aaaeda8..7ff156f6817f1 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts @@ -186,9 +186,6 @@ interface FieldBasic { subType?: SubType; properties?: { [key: string]: Omit }; fields?: { [key: string]: Omit }; - referenceField?: string; - inferenceId?: string; - inference_id?: string; // other* exist together as a holder of types that the mappings editor does not yet know about but // enables the user to create mappings with them. @@ -201,6 +198,8 @@ type FieldParams = { export type Field = FieldBasic & Partial; +export type SemanticTextField = Field & { inference_id: string; reference_field: string }; + export interface FieldMeta { childFieldsName: ChildFieldName | undefined; canHaveChildFields: boolean; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts index a0e7247c39bc1..f40fe420eb3be 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts @@ -108,10 +108,12 @@ export interface State { }; templates: TemplatesFormState; inferenceToModelIdMap?: InferenceToModelIdMap; + mappingViewFields: NormalizedFields; // state of the incoming index mappings, separate from the editor state above } export type Action = | { type: 'editor.replaceMappings'; value: { [key: string]: any } } + | { type: 'editor.replaceViewMappings'; value: { fields: NormalizedFields } } | { type: 'inferenceToModelIdMap.update'; value: { inferenceToModelIdMap?: InferenceToModelIdMap }; @@ -122,7 +124,6 @@ export type Action = | { type: 'templates.save'; value: MappingsTemplates } | { type: 'fieldForm.update'; value: OnFormUpdateArg } | { type: 'field.add'; value: Field } - | { type: 'field.addSemanticText'; value: Field } | { type: 'field.remove'; value: string } | { type: 'field.edit'; value: Field } | { type: 'field.toggleExpand'; value: { fieldId: string; isExpanded?: boolean } } diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx index 1bd58bcc8e5f0..5c5e1c6a289fa 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx @@ -8,6 +8,7 @@ import { useEffect, useMemo } from 'react'; import { EuiSelectableOption } from '@elastic/eui'; +import { cloneDeep } from 'lodash'; import { DocumentFieldsStatus, Field, @@ -182,6 +183,12 @@ export const useMappingsStateListener = ({ onChange, value, status }: Args) => { }, }, }); + dispatch({ + type: 'editor.replaceViewMappings', + value: { + fields: cloneDeep(parsedFieldsDefaultValue), + }, + }); }, [ value, parsedFieldsDefaultValue, diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx index 88902ff517c35..f1a625dafbbda 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx @@ -29,6 +29,10 @@ import { FormattedMessage } from '@kbn/i18n-react'; import React, { FunctionComponent, useCallback, useEffect, useMemo, useState } from 'react'; import { ILicense } from '@kbn/licensing-plugin/public'; import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt'; +import { + getStateWithCopyToFields, + isSemanticTextField, +} from '../../../../components/mappings_editor/lib/utils'; import { Index } from '../../../../../../common'; import { useDetailsPageMappingsModelManagement } from '../../../../../hooks/use_details_page_mappings_model_management'; import { useAppContext } from '../../../../app_context'; @@ -73,7 +77,6 @@ export const DetailsPageMappingsContent: FunctionComponent<{ http, }, plugins: { ml, licensing }, - url, config, overlays, history, @@ -89,9 +92,9 @@ export const DetailsPageMappingsContent: FunctionComponent<{ }, [licensing]); const { enableSemanticText: isSemanticTextEnabled } = config; - const [errorsInTrainedModelDeployment, setErrorsInTrainedModelDeployment] = useState( - [] - ); + const [errorsInTrainedModelDeployment, setErrorsInTrainedModelDeployment] = useState< + Record + >({}); const hasMLPermissions = capabilities?.ml?.canGetTrainedModels ? true : false; @@ -151,11 +154,10 @@ export const DetailsPageMappingsContent: FunctionComponent<{ [jsonData] ); + const [hasSavedFields, setHasSavedFields] = useState(false); + useMappingsStateListener({ value: parsedDefaultValue, status: 'disabled' }); - const { fetchInferenceToModelIdMap, pendingDeployments } = useDetailsPageMappingsModelManagement( - state.fields, - state.inferenceToModelIdMap - ); + const { fetchInferenceToModelIdMap } = useDetailsPageMappingsModelManagement(); const onCancelAddingNewFields = useCallback(() => { setAddingFields(!isAddingFields); @@ -198,8 +200,6 @@ export const DetailsPageMappingsContent: FunctionComponent<{ }); }, [dispatch, isAddingFields, state]); - const [isModalVisible, setIsModalVisible] = useState(false); - useEffect(() => { if (!isSemanticTextEnabled || !hasMLPermissions) { return; @@ -213,7 +213,7 @@ export const DetailsPageMappingsContent: FunctionComponent<{ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const refreshModal = useCallback(async () => { + const fetchInferenceData = useCallback(async () => { try { if (!isSemanticTextEnabled) { return; @@ -230,35 +230,45 @@ export const DetailsPageMappingsContent: FunctionComponent<{ }, [fetchInferenceToModelIdMap, isSemanticTextEnabled, hasMLPermissions]); const updateMappings = useCallback(async () => { + const hasSemanticText = hasSemanticTextField(state.fields); try { - if (isSemanticTextEnabled && hasMLPermissions) { + if (isSemanticTextEnabled && hasMLPermissions && hasSemanticText) { await fetchInferenceToModelIdMap(); - - if (pendingDeployments.length > 0) { - setIsModalVisible(true); - return; - } } - const denormalizedFields = deNormalize(state.fields); + const fields = hasSemanticText ? getStateWithCopyToFields(state).fields : state.fields; - const { error } = await updateIndexMappings(indexName, denormalizedFields); + const denormalizedFields = deNormalize(fields); - if (!error) { - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.indexDetails.mappings.successfullyUpdatedIndexMappings', { - defaultMessage: 'Updated index mapping', - }) + const inferenceIdsInPendingList = Object.values(deNormalize(fields)) + .filter(isSemanticTextField) + .map((field) => field.inference_id) + .filter( + (inferenceId: string) => + state.inferenceToModelIdMap?.[inferenceId] && + !state.inferenceToModelIdMap?.[inferenceId].isDeployed ); - refetchMapping(); - } else { - setSaveMappingError(error.message); + setHasSavedFields(true); + if (inferenceIdsInPendingList.length === 0) { + const { error } = await updateIndexMappings(indexName, denormalizedFields); + + if (!error) { + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.indexDetails.mappings.successfullyUpdatedIndexMappings', { + defaultMessage: 'Updated index mapping', + }) + ); + refetchMapping(); + setHasSavedFields(false); + } else { + setSaveMappingError(error.message); + } } } catch (exception) { setSaveMappingError(exception.message); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [state.fields, pendingDeployments]); + }, [state.fields]); const onSearchChange = useCallback( (value: string) => { @@ -494,7 +504,7 @@ export const DetailsPageMappingsContent: FunctionComponent<{ > )} @@ -601,15 +611,17 @@ export const DetailsPageMappingsContent: FunctionComponent<{ - {isModalVisible && isSemanticTextEnabled && ( + {isSemanticTextEnabled && isAddingFields && hasSavedFields && ( )} ); }; + +function hasSemanticTextField(fields: NormalizedFields): boolean { + return Object.values(fields.byId).some((field) => field.source.type === 'semantic_text'); +} diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx index 8c2bfbbbef96d..4bba408197661 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/trained_models_deployment_modal.tsx @@ -8,179 +8,175 @@ import { EuiConfirmModal, useGeneratedHtmlId, EuiHealth } from '@elastic/eui'; import React from 'react'; import { EuiLink } from '@elastic/eui'; -import { useEffect, useState } from 'react'; -import type { SharePluginStart } from '@kbn/share-plugin/public'; +import { useEffect, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; +import { isSemanticTextField } from '../../../../components/mappings_editor/lib/utils'; +import { deNormalize } from '../../../../components/mappings_editor/lib'; +import { useMLModelNotificationToasts } from '../../../../../hooks/use_ml_model_status_toasts'; +import { useMappingsState } from '../../../../components/mappings_editor/mappings_state_context'; +import { useAppContext } from '../../../../app_context'; -interface SemanticTextProps { - setIsModalVisible: (isVisible: boolean) => void; - refreshModal: () => void; - pendingDeployments: Array; - errorsInTrainedModelDeployment: string[]; - url?: SharePluginStart['url']; +export interface TrainedModelsDeploymentModalProps { + fetchData: () => void; + errorsInTrainedModelDeployment: Record; + setErrorsInTrainedModelDeployment: React.Dispatch< + React.SetStateAction> + >; } const ML_APP_LOCATOR = 'ML_APP_LOCATOR'; const TRAINED_MODELS_MANAGE = 'trained_models'; export function TrainedModelsDeploymentModal({ - setIsModalVisible, - refreshModal, - pendingDeployments = [], - errorsInTrainedModelDeployment = [], - url, -}: SemanticTextProps) { + errorsInTrainedModelDeployment = {}, + fetchData, + setErrorsInTrainedModelDeployment, +}: TrainedModelsDeploymentModalProps) { + const { fields, inferenceToModelIdMap } = useMappingsState(); + const { + plugins: { ml }, + url, + } = useAppContext(); const modalTitleId = useGeneratedHtmlId(); + const [isModalVisible, setIsModalVisible] = useState(false); const closeModal = () => setIsModalVisible(false); const [mlManagementPageUrl, setMlManagementPageUrl] = useState(''); + const { showErrorToasts } = useMLModelNotificationToasts(); useEffect(() => { - setIsModalVisible(pendingDeployments.length > 0); - }, [pendingDeployments, setIsModalVisible]); - - useEffect(() => { - let isCancelled = false; const mlLocator = url?.locators.get(ML_APP_LOCATOR); const generateUrl = async () => { if (mlLocator) { const mlURL = await mlLocator.getUrl({ page: TRAINED_MODELS_MANAGE, }); - if (!isCancelled) { - setMlManagementPageUrl(mlURL); - } + setMlManagementPageUrl(mlURL); } }; generateUrl(); - return () => { - isCancelled = true; - }; }, [url]); - const ErroredDeployments = pendingDeployments.filter( - (deployment) => deployment !== undefined && errorsInTrainedModelDeployment.includes(deployment) - ); + const inferenceIdsInPendingList = useMemo(() => { + return Object.values(deNormalize(fields)) + .filter(isSemanticTextField) + .map((field) => field.inference_id); + }, [fields]); - const PendingModelsDeploymentModal = () => { - const pendingDeploymentsList = pendingDeployments.map((deployment, index) => ( -
  • - - {deployment} - -
  • - )); + const [pendingDeployments, setPendingDeployments] = useState([]); - return ( - -

    - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textAboutDeploymentsNotCompleted', - { - defaultMessage: - 'Some fields are referencing models that have not yet completed deployment. Deployment may take a few minutes to complete.', - } - )} -

    -
      {pendingDeploymentsList}
    - - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textTrainedModelManagementLink', - { - defaultMessage: 'Go to Trained Model Management', - } - )} - -
    - ); + const startModelAllocation = async (trainedModelId: string) => { + try { + await ml?.mlApi?.trainedModels.startModelAllocation(trainedModelId); + } catch (error) { + setErrorsInTrainedModelDeployment((previousState) => ({ + ...previousState, + [trainedModelId]: error.message, + })); + showErrorToasts(error); + setIsModalVisible(true); + } }; - const ErroredModelsDeploymentModal = () => { - const pendingDeploymentsList = pendingDeployments.map((deployment, index) => ( -
  • - - {deployment} - -
  • - )); + useEffect(() => { + const models = inferenceIdsInPendingList.map( + (inferenceId) => inferenceToModelIdMap?.[inferenceId] + ); + for (const model of models) { + if (model && !model.isDownloading && !model.isDeployed) { + // Sometimes the model gets stuck in a ready to deploy state, so we need to trigger deployment manually + startModelAllocation(model.trainedModelId); + } + } + const pendingModels = models + .map((model) => { + return model?.trainedModelId && !model?.isDeployed ? model?.trainedModelId : ''; + }) + .filter((trainedModelId) => !!trainedModelId); + const uniqueDeployments = pendingModels.filter( + (deployment, index) => pendingModels.indexOf(deployment) === index + ); + setPendingDeployments(uniqueDeployments); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [inferenceIdsInPendingList, inferenceToModelIdMap]); + + const erroredDeployments = pendingDeployments.filter( + (deployment) => errorsInTrainedModelDeployment[deployment] + ); - return ( - { + if (erroredDeployments.length > 0 || pendingDeployments.length > 0) { + setIsModalVisible(true); + } + }, [erroredDeployments.length, pendingDeployments.length]); + return isModalVisible ? ( + 0 + ? i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorTitle', + { + defaultMessage: 'Models could not be deployed', + } + ) + : i18n.translate('xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.titleLabel', { + defaultMessage: 'Models still deploying', + }) + } + titleProps={{ id: modalTitleId }} + onCancel={closeModal} + onConfirm={fetchData} + cancelButtonText={i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.closeButtonLabel', + { + defaultMessage: 'Close', + } + )} + confirmButtonText={i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.refreshButtonLabel', + { + defaultMessage: 'Refresh', + } + )} + defaultFocusedButton="confirm" + data-test-subj="trainedModelsDeploymentModal" + > +

    + {erroredDeployments.length > 0 + ? i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorText', + { + defaultMessage: 'There was an error when trying to deploy the following models.', + } + ) + : i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textAboutDeploymentsNotCompleted', + { + defaultMessage: + 'Some fields are referencing models that have not yet completed deployment. Deployment may take a few minutes to complete.', + } + )} +

    +
      + {(erroredDeployments.length > 0 ? erroredDeployments : pendingDeployments).map( + (deployment) => ( +
    • + + {deployment} + +
    • + ) )} - confirmButtonText={i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorTryAgainButtonLabel', +
    + + {i18n.translate( + 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.textTrainedModelManagementLink', { - defaultMessage: 'Try again', + defaultMessage: 'Go to Trained Model Management', } )} - defaultFocusedButton="confirm" - data-test-subj="trainedModelsErroredDeploymentModal" - > -

    - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorText', - { - defaultMessage: 'There was an error when trying to deploy the following models.', - } - )} -

    -
      {pendingDeploymentsList}
    - - {i18n.translate( - 'xpack.idxMgmt.indexDetails.trainedModelsDeploymentModal.deploymentErrorTrainedModelManagementLink', - { - defaultMessage: 'Go to Trained Model Management', - } - )} - -
    - ); - }; - - return ErroredDeployments.length > 0 ? ( - - ) : ( - - ); + +
    + ) : null; } diff --git a/x-pack/plugins/index_management/public/application/services/api.ts b/x-pack/plugins/index_management/public/application/services/api.ts index e071e0bf3c68c..e68335b8e0ba5 100644 --- a/x-pack/plugins/index_management/public/application/services/api.ts +++ b/x-pack/plugins/index_management/public/application/services/api.ts @@ -434,6 +434,7 @@ export function createIndex(indexName: string) { }), }); } + export function updateIndexMappings(indexName: string, newFields: Fields) { return sendRequest({ path: `${API_BASE_PATH}/mapping/${encodeURIComponent(indexName)}`, @@ -443,7 +444,7 @@ export function updateIndexMappings(indexName: string, newFields: Fields) { } export function getInferenceEndpoints() { - return sendRequest({ + return sendRequest({ path: `${API_BASE_PATH}/inference/all`, method: 'get', }); diff --git a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts index c3d74c21ec528..6e80bcea5c349 100644 --- a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts +++ b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.test.ts @@ -6,7 +6,6 @@ */ import { renderHook } from '@testing-library/react-hooks'; -import { InferenceToModelIdMap } from '../application/components/mappings_editor/components/document_fields/fields'; import { NormalizedFields } from '../application/components/mappings_editor/types'; import { useDetailsPageMappingsModelManagement } from './use_details_page_mappings_model_management'; @@ -16,13 +15,24 @@ jest.mock('../application/app_context', () => ({ ml: { mlApi: { trainedModels: { + getModelsDownloadStatus: jest.fn().mockResolvedValue({ + '.elser_model_2_linux-x86_64': {}, + }), getTrainedModelStats: jest.fn().mockResolvedValue({ trained_model_stats: [ { - model_id: '.elser_model_2', + model_id: '.elser_model_2-x86_64', deployment_stats: { deployment_id: 'elser_model_2', - model_id: '.elser_model_2', + model_id: '.elser_model_2-x86_64', + state: 'not started', + }, + }, + { + model_id: '.multilingual-e5-small', + deployment_stats: { + deployment_id: 'e5', + model_id: '.multilingual-e5-small', state: 'started', }, }, @@ -55,68 +65,73 @@ jest.mock('../application/services/api', () => ({ jest.mock('../application/components/mappings_editor/mappings_state_context', () => ({ useDispatch: () => mockDispatch, -})); -const mockDispatch = jest.fn(); -const fields = { - byId: { - '88ebcfdb-19b7-4458-9ea2-9488df54453d': { - id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', - isMultiField: false, - source: { - name: 'title', - type: 'text', - copy_to: ['semantic'], + useMappingsState: () => ({ + fields: { + byId: { + '88ebcfdb-19b7-4458-9ea2-9488df54453d': { + id: '88ebcfdb-19b7-4458-9ea2-9488df54453d', + isMultiField: false, + source: { + name: 'title', + type: 'text', + copy_to: ['semantic'], + }, + path: ['title'], + nestedDepth: 0, + childFieldsName: 'fields', + canHaveChildFields: false, + hasChildFields: false, + canHaveMultiFields: true, + hasMultiFields: false, + isExpanded: false, + }, + 'c5d86c82-ea07-4457-b469-3ffd4b96db81': { + id: 'c5d86c82-ea07-4457-b469-3ffd4b96db81', + isMultiField: false, + source: { + name: 'semantic', + inference_id: 'elser_model_2', + type: 'semantic_text', + }, + path: ['semantic'], + nestedDepth: 0, + childFieldsName: 'fields', + canHaveChildFields: false, + hasChildFields: false, + canHaveMultiFields: true, + hasMultiFields: false, + isExpanded: false, + }, }, - path: ['title'], - nestedDepth: 0, - childFieldsName: 'fields', - canHaveChildFields: false, - hasChildFields: false, - canHaveMultiFields: true, - hasMultiFields: false, - isExpanded: false, - }, - 'c5d86c82-ea07-4457-b469-3ffd4b96db81': { - id: 'c5d86c82-ea07-4457-b469-3ffd4b96db81', - isMultiField: false, - source: { - name: 'semantic', - inference_id: 'elser_model_2', - type: 'semantic_text', + aliases: {}, + rootLevelFields: [ + '88ebcfdb-19b7-4458-9ea2-9488df54453d', + 'c5d86c82-ea07-4457-b469-3ffd4b96db81', + ], + maxNestedDepth: 2, + } as NormalizedFields, + inferenceToModelIdMap: { + elser_model_2: { + trainedModelId: '.elser_model_2', + isDeployed: false, + isDeployable: true, + isDownloading: false, + }, + e5: { + trainedModelId: '.multilingual-e5-small', + isDeployed: true, + isDeployable: true, + isDownloading: false, }, - path: ['semantic'], - nestedDepth: 0, - childFieldsName: 'fields', - canHaveChildFields: false, - hasChildFields: false, - canHaveMultiFields: true, - hasMultiFields: false, - isExpanded: false, }, - }, - aliases: {}, - rootLevelFields: ['88ebcfdb-19b7-4458-9ea2-9488df54453d', 'c5d86c82-ea07-4457-b469-3ffd4b96db81'], - maxNestedDepth: 2, -} as NormalizedFields; + }), +})); -const inferenceToModelIdMap = { - elser_model_2: { - trainedModelId: '.elser_model_2', - isDeployed: true, - isDeployable: true, - }, - e5: { - trainedModelId: '.multilingual-e5-small', - isDeployed: true, - isDeployable: true, - }, -} as InferenceToModelIdMap; +const mockDispatch = jest.fn(); describe('useDetailsPageMappingsModelManagement', () => { it('should call the dispatch with correct parameters', async () => { - const { result } = renderHook(() => - useDetailsPageMappingsModelManagement(fields, inferenceToModelIdMap) - ); + const { result } = renderHook(() => useDetailsPageMappingsModelManagement()); await result.current.fetchInferenceToModelIdMap(); @@ -125,14 +140,22 @@ describe('useDetailsPageMappingsModelManagement', () => { value: { inferenceToModelIdMap: { e5: { - isDeployed: false, + isDeployed: true, isDeployable: true, trainedModelId: '.multilingual-e5-small', + isDownloading: false, + modelStats: { + deployment_id: 'e5', + model_id: '.multilingual-e5-small', + state: 'started', + }, }, elser_model_2: { - isDeployed: true, + isDeployed: false, isDeployable: true, - trainedModelId: '.elser_model_2', + trainedModelId: '.elser_model_2_linux-x86_64', + isDownloading: true, + modelStats: undefined, }, }, }, diff --git a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts index 125892bdf6979..2d920a2d18ee0 100644 --- a/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts +++ b/x-pack/plugins/index_management/public/hooks/use_details_page_mappings_model_management.ts @@ -5,134 +5,130 @@ * 2.0. */ -import { ElasticsearchModelDefaultOptions, Service } from '@kbn/inference_integration_flyout/types'; -import { InferenceStatsResponse } from '@kbn/ml-plugin/public/application/services/ml_api_service/trained_models'; -import type { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; -import { useCallback, useMemo } from 'react'; -import { useAppContext } from '../application/app_context'; +import { Service } from '@kbn/inference_integration_flyout/types'; +import { ModelDownloadState, TrainedModelStat } from '@kbn/ml-plugin/common/types/trained_models'; +import { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; +import { + LATEST_ELSER_VERSION, + InferenceServiceSettings, + LocalInferenceServiceSettings, + LATEST_ELSER_MODEL_ID, + LATEST_E5_MODEL_ID, + ElserVersion, +} from '@kbn/ml-trained-models-utils/src/constants/trained_models'; +import { useCallback } from 'react'; +import { AppDependencies, useAppContext } from '../application/app_context'; import { InferenceToModelIdMap } from '../application/components/mappings_editor/components/document_fields/fields'; -import { deNormalize } from '../application/components/mappings_editor/lib'; import { useDispatch } from '../application/components/mappings_editor/mappings_state_context'; -import { - DefaultInferenceModels, - DeploymentState, - NormalizedFields, -} from '../application/components/mappings_editor/types'; +import { DefaultInferenceModels } from '../application/components/mappings_editor/types'; import { getInferenceEndpoints } from '../application/services/api'; -interface InferenceModel { - data: InferenceAPIConfigResponse[]; +function isLocalModel(model: InferenceServiceSettings): model is LocalInferenceServiceSettings { + return Boolean((model as LocalInferenceServiceSettings).service_settings.model_id); } -type DeploymentStatusType = Record; - const getCustomInferenceIdMap = ( - deploymentStatsByModelId: DeploymentStatusType, - models?: InferenceModel -) => { - return models?.data.reduce((inferenceMap, model) => { - const inferenceId = model.model_id; - - const trainedModelId = - 'model_id' in model.service_settings && - (model.service_settings.model_id === ElasticsearchModelDefaultOptions.elser || - model.service_settings.model_id === ElasticsearchModelDefaultOptions.e5) - ? model.service_settings.model_id - : ''; - inferenceMap[inferenceId] = { - trainedModelId, - isDeployable: model.service === Service.elser || model.service === Service.elasticsearch, - isDeployed: deploymentStatsByModelId[trainedModelId] === 'deployed', - }; + models: InferenceAPIConfigResponse[], + modelStatsById: Record, + downloadStates: Record, + elser: string, + e5: string +): InferenceToModelIdMap => { + const inferenceIdMap = models.reduce((inferenceMap, model) => { + const inferenceEntry = isLocalModel(model) + ? { + trainedModelId: model.service_settings.model_id, // third-party models don't have trained model ids + isDeployable: model.service === Service.elser || model.service === Service.elasticsearch, + isDeployed: modelStatsById[model.service_settings.model_id]?.state === 'started', + isDownloading: Boolean(downloadStates[model.service_settings.model_id]), + modelStats: modelStatsById[model.service_settings.model_id], + } + : { + trainedModelId: '', + isDeployable: false, + isDeployed: false, + isDownloading: false, + modelStats: undefined, + }; + inferenceMap[model.model_id] = inferenceEntry; return inferenceMap; }, {}); -}; - -export const getTrainedModelStats = (modelStats?: InferenceStatsResponse): DeploymentStatusType => { - return ( - modelStats?.trained_model_stats.reduce((acc, modelStat) => { - if (modelStat.model_id) { - acc[modelStat.model_id] = - modelStat?.deployment_stats?.state === 'started' - ? DeploymentState.DEPLOYED - : DeploymentState.NOT_DEPLOYED; - } - return acc; - }, {}) || {} - ); -}; - -const getDefaultInferenceIds = (deploymentStatsByModelId: DeploymentStatusType) => { - return { + const defaultInferenceIds = { [DefaultInferenceModels.elser_model_2]: { - trainedModelId: ElasticsearchModelDefaultOptions.elser, + trainedModelId: elser, isDeployable: true, - isDeployed: - deploymentStatsByModelId[ElasticsearchModelDefaultOptions.elser] === - DeploymentState.DEPLOYED, + isDeployed: modelStatsById[elser]?.state === 'started', + isDownloading: Boolean(downloadStates[elser]), + modelStats: modelStatsById[elser], }, [DefaultInferenceModels.e5]: { - trainedModelId: ElasticsearchModelDefaultOptions.e5, + trainedModelId: e5, isDeployable: true, - isDeployed: - deploymentStatsByModelId[ElasticsearchModelDefaultOptions.e5] === DeploymentState.DEPLOYED, + isDeployed: modelStatsById[e5]?.state === 'started', + isDownloading: Boolean(downloadStates[e5]), + modelStats: modelStatsById[e5], }, }; + return { ...defaultInferenceIds, ...inferenceIdMap }; }; -export const useDetailsPageMappingsModelManagement = ( - fields: NormalizedFields, - inferenceToModelIdMap?: InferenceToModelIdMap -) => { +async function getCuratedModelConfig( + ml: AppDependencies['plugins']['ml'] | undefined, + model: string, + version?: ElserVersion +) { + if (ml?.mlApi) { + try { + const result = await ml.mlApi.trainedModels.getCuratedModelConfig( + model, + version ? { version } : undefined + ); + return result.model_id; + } catch (e) { + // pass through and return default models below + } + } + return model === 'elser' ? LATEST_ELSER_MODEL_ID : LATEST_E5_MODEL_ID; +} + +export const useDetailsPageMappingsModelManagement = () => { const { plugins: { ml }, } = useAppContext(); const dispatch = useDispatch(); - const fetchInferenceModelsAndTrainedModelStats = useCallback(async () => { + const fetchInferenceToModelIdMap = useCallback<() => Promise>(async () => { const inferenceModels = await getInferenceEndpoints(); - const trainedModelStats = await ml?.mlApi?.trainedModels.getTrainedModelStats(); - - return { inferenceModels, trainedModelStats }; - }, [ml]); - - const fetchInferenceToModelIdMap = useCallback(async () => { - const { inferenceModels, trainedModelStats } = await fetchInferenceModelsAndTrainedModelStats(); - const deploymentStatsByModelId = getTrainedModelStats(trainedModelStats); - const defaultInferenceIds = getDefaultInferenceIds(deploymentStatsByModelId); - const modelIdMap = getCustomInferenceIdMap(deploymentStatsByModelId, inferenceModels); + const downloadStates = await ml?.mlApi?.trainedModels.getModelsDownloadStatus(); + const elser = await getCuratedModelConfig(ml, 'elser', LATEST_ELSER_VERSION); + const e5 = await getCuratedModelConfig(ml, 'e5'); + const modelStatsById = + trainedModelStats?.trained_model_stats.reduce< + Record + >((acc, { model_id: modelId, deployment_stats: stats }) => { + if (modelId && stats) { + acc[modelId] = stats; + } + return acc; + }, {}) || {}; + const modelIdMap = getCustomInferenceIdMap( + inferenceModels.data || [], + modelStatsById, + downloadStates || {}, + elser, + e5 + ); dispatch({ type: 'inferenceToModelIdMap.update', - value: { inferenceToModelIdMap: { ...defaultInferenceIds, ...modelIdMap } }, + value: { inferenceToModelIdMap: modelIdMap }, }); - }, [dispatch, fetchInferenceModelsAndTrainedModelStats]); - - const inferenceIdsInPendingList = useMemo(() => { - return Object.values(deNormalize(fields)) - .filter((field) => field.type === 'semantic_text' && field.inference_id) - .map((field) => field.inference_id); - }, [fields]); - - const pendingDeployments = useMemo(() => { - return inferenceIdsInPendingList - .map((inferenceId) => { - if (inferenceId === undefined) { - return undefined; - } - const trainedModelId = inferenceToModelIdMap?.[inferenceId]?.trainedModelId ?? ''; - return trainedModelId && !inferenceToModelIdMap?.[inferenceId]?.isDeployed - ? trainedModelId - : undefined; - }) - .filter((trainedModelId) => !!trainedModelId); - }, [inferenceIdsInPendingList, inferenceToModelIdMap]); + return modelIdMap; + }, [dispatch, ml]); return { - pendingDeployments, fetchInferenceToModelIdMap, - fetchInferenceModelsAndTrainedModelStats, }; }; diff --git a/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts b/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts index cba440186a1d0..7b553f37498d5 100644 --- a/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts +++ b/x-pack/plugins/index_management/public/hooks/use_ml_model_status_toasts.ts @@ -27,6 +27,22 @@ export function useMLModelNotificationToasts() { }), }); }; + const showSuccessfullyDeployedToast = (modelName: string) => { + return toasts.addSuccess({ + title: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.createField.modelDeploymentStartedNotification', + { + defaultMessage: 'Model deployment started', + } + ), + text: i18n.translate('xpack.idxMgmt.mappingsEditor.createField.modelDeployedNotification', { + defaultMessage: 'Model {modelName} has been deployed on your machine learning node.', + values: { + modelName, + }, + }), + }); + }; const showErrorToasts = (error: ErrorType) => { const errorObj = extractErrorProperties(error); return toasts.addError(new MLRequestFailure(errorObj, error), { @@ -35,5 +51,5 @@ export function useMLModelNotificationToasts() { }), }); }; - return { showSuccessToasts, showErrorToasts }; + return { showSuccessToasts, showErrorToasts, showSuccessfullyDeployedToast }; } diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/inference_models.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/inference_models.ts index 7f4ba9dbf23f7..2895d1fed4336 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/inference_models.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/inference_models.ts @@ -18,17 +18,18 @@ export function inferenceModelsApiProvider(httpService: HttpService) { * @param taskType - Inference Task type. Either sparse_embedding or text_embedding * @param modelConfig - Model configuration based on service type */ - createInferenceEndpoint( + async createInferenceEndpoint( inferenceId: string, taskType: InferenceTaskType, modelConfig: ModelConfig ) { - return httpService.http({ + const result = await httpService.http({ path: `${ML_INTERNAL_BASE_PATH}/_inference/${taskType}/${inferenceId}`, method: 'PUT', body: JSON.stringify(modelConfig), version: '1', }); + return result; }, }; } diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts index 3070c3a4b7441..1d3e0f97ff4ab 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts @@ -177,6 +177,18 @@ export function trainedModelsApiProvider(httpService: HttpService) { }); }, + /** + * Gets model config based on the cluster OS and CPU architecture. + */ + getCuratedModelConfig(modelName: string, options?: GetModelDownloadConfigOptions) { + return httpService.http({ + path: `${ML_INTERNAL_BASE_PATH}/trained_models/curated_model_config/${modelName}`, + method: 'GET', + ...(options ? { query: options as HttpFetchQuery } : {}), + version: '1', + }); + }, + getTrainedModelsNodesOverview() { return httpService.http({ path: `${ML_INTERNAL_BASE_PATH}/model_management/nodes_overview`, diff --git a/x-pack/plugins/ml/server/routes/inference_models.ts b/x-pack/plugins/ml/server/routes/inference_models.ts index 1ab5d576181ef..29f687ede932d 100644 --- a/x-pack/plugins/ml/server/routes/inference_models.ts +++ b/x-pack/plugins/ml/server/routes/inference_models.ts @@ -12,6 +12,7 @@ import { createInferenceSchema } from './schemas/inference_schema'; import { modelsProvider } from '../models/model_management'; import { wrapError } from '../client/error_wrapper'; import { ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; +import { syncSavedObjectsFactory } from '../saved_objects'; export function inferenceModelRoutes( { router, routeGuard }: RouteInitialization, @@ -42,20 +43,24 @@ export function inferenceModelRoutes( }, }, }, - routeGuard.fullLicenseAPIGuard(async ({ client, mlClient, request, response }) => { - try { - const { inferenceId, taskType } = request.params; - const body = await modelsProvider(client, mlClient, cloud).createInferenceEndpoint( - inferenceId, - taskType as InferenceTaskType, - request.body as InferenceModelConfig - ); - return response.ok({ - body, - }); - } catch (e) { - return response.customError(wrapError(e)); + routeGuard.fullLicenseAPIGuard( + async ({ client, mlClient, request, response, mlSavedObjectService }) => { + try { + const { inferenceId, taskType } = request.params; + const body = await modelsProvider(client, mlClient, cloud).createInferenceEndpoint( + inferenceId, + taskType as InferenceTaskType, + request.body as InferenceModelConfig + ); + const { syncSavedObjects } = syncSavedObjectsFactory(client, mlSavedObjectService); + await syncSavedObjects(false); + return response.ok({ + body, + }); + } catch (e) { + return response.customError(wrapError(e)); + } } - }) + ) ); } diff --git a/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts b/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts index a69b1384e2c7e..662b3313a06e3 100644 --- a/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts @@ -96,3 +96,9 @@ export const createIngestPipelineSchema = schema.object({ export const modelDownloadsQuery = schema.object({ version: schema.maybe(schema.oneOf([schema.literal('1'), schema.literal('2')])), }); + +export const curatedModelsParamsSchema = schema.object({ + modelName: schema.string(), +}); + +export const curatedModelsQuerySchema = schema.object({ version: schema.maybe(schema.number()) }); diff --git a/x-pack/plugins/ml/server/routes/trained_models.ts b/x-pack/plugins/ml/server/routes/trained_models.ts index cdd4d8128c219..5b2441435268d 100644 --- a/x-pack/plugins/ml/server/routes/trained_models.ts +++ b/x-pack/plugins/ml/server/routes/trained_models.ts @@ -10,7 +10,11 @@ import { groupBy } from 'lodash'; import { schema } from '@kbn/config-schema'; import type { ErrorType } from '@kbn/ml-error-utils'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; -import type { ElserVersion, InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; +import type { + ElasticCuratedModelName, + ElserVersion, + InferenceAPIConfigResponse, +} from '@kbn/ml-trained-models-utils'; import { isDefined } from '@kbn/ml-is-defined'; import type { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; import { type MlFeatures, ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; @@ -30,6 +34,8 @@ import { updateDeploymentParamsSchema, createIngestPipelineSchema, modelDownloadsQuery, + curatedModelsParamsSchema, + curatedModelsQuerySchema, } from './schemas/inference_schema'; import type { PipelineDefinition } from '../../common/types/trained_models'; import { type TrainedModelConfigResponse } from '../../common/types/trained_models'; @@ -920,6 +926,49 @@ export function trainedModelsRoutes( try { const body = await modelsProvider(client, mlClient, cloud).getModelsDownloadStatus(); + return response.ok({ + body, + }); + } catch (e) { + return response.customError(wrapError(e)); + } + } + ) + ); + + /** + * @apiGroup TrainedModels + * + * @api {get} /internal/ml/trained_models/curated_model_config Gets curated model config + * @apiName ModelsCuratedConfigs + * @apiDescription Gets curated model config for the specified model based on cluster architecture + */ + router.versioned + .get({ + path: `${ML_INTERNAL_BASE_PATH}/trained_models/curated_model_config/{modelName}`, + access: 'internal', + options: { + tags: ['access:ml:canGetTrainedModels'], + }, + }) + .addVersion( + { + version: '1', + validate: { + request: { + params: curatedModelsParamsSchema, + query: curatedModelsQuerySchema, + }, + }, + }, + routeGuard.fullLicenseAPIGuard( + async ({ client, mlClient, request, response, mlSavedObjectService }) => { + try { + const body = await modelsProvider(client, mlClient, cloud).getCuratedModelConfig( + request.params.modelName as ElasticCuratedModelName, + { version: request.query.version as ElserVersion } + ); + return response.ok({ body, }); From 12bd8fe53ac94e36fc40bad167250390111d122f Mon Sep 17 00:00:00 2001 From: Mark Hopkin Date: Thu, 11 Jul 2024 11:43:51 +0100 Subject: [PATCH 81/82] [Entity Analytics] Remove links to legacy risk scoring docs (#187585) ## Summary Related to https://github.com/elastic/security-docs/issues/5489. We had a few places where we incorrectly link to the legacy user/host risk scoring docs. In deleting the links I found we had two `RiskSummary` components which components which I have renamed `RiskSummaryPanel` and `FlyoutRiskSummary` to make life easier. Screenshot 2024-07-04 at 15 47 14 --------- Co-authored-by: Elastic Machine --- packages/kbn-doc-links/src/get_doc_links.ts | 2 - packages/kbn-doc-links/src/types.ts | 2 - .../cti_details/threat_summary_view.tsx | 6 +-- .../components/enable_risk_score/index.tsx | 4 +- .../translations.ts | 8 ---- .../components/risk_information/index.tsx | 11 +---- .../components/risk_score/translations.ts | 7 +++ .../entity_analytics_doc_link.tsx | 37 +++++++++++++++ .../risk_score_doc_link.tsx | 46 ------------------- .../risk_score_enable_button.tsx | 2 +- .../risk_score_restart_button.tsx | 2 +- .../use_risk_score_toast_content.tsx | 9 ++-- .../risk_summary.stories.tsx | 10 ++-- .../risk_summary_flyout/risk_summary.test.tsx | 26 +++++------ .../risk_summary_flyout/risk_summary.tsx | 6 +-- ...y.test.tsx => risk_summary_panel.test.tsx} | 10 ++-- ...isk_summary.tsx => risk_summary_panel.tsx} | 11 ++--- .../right/components/host_entity_overview.tsx | 2 +- .../right/components/user_entity_overview.tsx | 2 +- .../entity_details/host_right/content.tsx | 4 +- .../entity_details/user_right/content.tsx | 4 +- .../public/overview/components/common.tsx | 18 +++++--- .../components/host_overview/index.tsx | 2 +- .../components/user_overview/index.tsx | 2 +- .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 27 files changed, 106 insertions(+), 133 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/entity_analytics_doc_link.tsx delete mode 100644 x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_doc_link.tsx rename x-pack/plugins/security_solution/public/entity_analytics/components/{risk_summary.test.tsx => risk_summary_panel.test.tsx} (91%) rename x-pack/plugins/security_solution/public/entity_analytics/components/{risk_summary.tsx => risk_summary_panel.tsx} (89%) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 3c59a98498842..9b38a716a714c 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -488,8 +488,6 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D ruleUiAdvancedParams: `${SECURITY_SOLUTION_DOCS}rules-ui-create.html#rule-ui-advanced-params`, entityAnalytics: { riskScorePrerequisites: `${SECURITY_SOLUTION_DOCS}ers-requirements.html`, - hostRiskScore: `${SECURITY_SOLUTION_DOCS}host-risk-score.html`, - userRiskScore: `${SECURITY_SOLUTION_DOCS}user-risk-score.html`, entityRiskScoring: `${SECURITY_SOLUTION_DOCS}entity-risk-scoring.html`, assetCriticality: `${SECURITY_SOLUTION_DOCS}asset-criticality.html`, }, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 5586f0f8f201f..c6b1b753ce883 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -360,8 +360,6 @@ export interface DocLinks { readonly ruleUiAdvancedParams: string; readonly entityAnalytics: { readonly riskScorePrerequisites: string; - readonly hostRiskScore: string; - readonly userRiskScore: string; readonly entityRiskScoring: string; readonly assetCriticality: string; }; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx index af878acd8b104..3f32ba4fd5a00 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx @@ -18,7 +18,7 @@ import type { TimelineEventsDetailsItem, RiskSeverity, } from '../../../../../common/search_strategy'; -import { RiskSummary } from '../../../../entity_analytics/components/risk_summary'; +import { RiskSummaryPanel } from '../../../../entity_analytics/components/risk_summary_panel'; import { EnrichmentSummary } from './enrichment_summary'; import { RiskScoreEntity } from '../../../../../common/search_strategy'; import { useHasSecurityCapability } from '../../../../helper_hooks'; @@ -137,7 +137,7 @@ const ThreatSummaryViewComponent: React.FC<{ {hasEntityAnalyticsCapability && ( <> - - {text.body} {` `} - + } actions={ diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/translations.ts index 5816accea220a..d87f0a8b899fc 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/entity_analytics_risk_score/translations.ts @@ -25,14 +25,6 @@ export const VIEW_ALL = i18n.translate( } ); -export const LEARN_MORE = (riskEntity?: RiskScoreEntity) => - i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.learnMore', { - defaultMessage: 'Learn more about {riskEntity} risk', - values: { - riskEntity: getRiskEntityTranslation(riskEntity, true), - }, - }); - export const LAST_UPDATED = i18n.translate( 'xpack.securitySolution.entityAnalytics.riskDashboard.lastUpdatedTitle', { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.tsx index 8596c7869edcb..0b08c8976cf67 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_information/index.tsx @@ -37,7 +37,7 @@ import { CriticalityLevels, CriticalityModifiers, } from '../../../../common/entity_analytics/asset_criticality'; -import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link'; +import { EntityAnalyticsLearnMoreLink } from '../risk_score_onboarding/entity_analytics_doc_link'; import { BETA } from '../risk_score_onboarding/translations'; import { AssetCriticalityBadge } from '../asset_criticality'; @@ -262,14 +262,7 @@ export const RiskInformationFlyout = ({ handleOnClose }: { handleOnClose: () => - - } - /> + diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/translations.ts b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/translations.ts index d072607544d4f..4ad2314afb859 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/translations.ts +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score/translations.ts @@ -40,6 +40,13 @@ export const RISK_SCORE_TITLE = (riskEntity: RiskScoreEntity) => }, }); +export const RISK_SCORING_TITLE = i18n.translate( + 'xpack.securitySolution.riskScore.overview.riskScoringTitle', + { + defaultMessage: 'Entity Risk Scoring', + } +); + export const ENTITY_RISK_LEVEL = (riskEntity: RiskScoreEntity) => i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle', { defaultMessage: '{riskEntity} risk level', diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/entity_analytics_doc_link.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/entity_analytics_doc_link.tsx new file mode 100644 index 0000000000000..b0d421c743411 --- /dev/null +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/entity_analytics_doc_link.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiLink } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; +import { useKibana } from '../../../common/lib/kibana'; + +const EntityAnalyticsLearnMoreLinkComponent = ({ title }: { title?: string | React.ReactNode }) => { + const { docLinks } = useKibana().services; + const entityAnalyticsLinks = docLinks.links.securitySolution.entityAnalytics; + + return ( + + {title ? ( + title + ) : ( + + )} + + ); +}; + +export const EntityAnalyticsLearnMoreLink = React.memo(EntityAnalyticsLearnMoreLinkComponent); + +EntityAnalyticsLearnMoreLink.displayName = 'EntityAnalyticsLearnMoreLink'; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_doc_link.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_doc_link.tsx deleted file mode 100644 index ca7b67134b29d..0000000000000 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_doc_link.tsx +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiLink } from '@elastic/eui'; -import React, { useMemo } from 'react'; -import { RiskScoreEntity } from '../../../../common/search_strategy'; -import { useKibana } from '../../../common/lib/kibana'; -import { LEARN_MORE } from '../entity_analytics_risk_score/translations'; - -const useLearnMoreLinkForEntity = (riskScoreEntity?: RiskScoreEntity) => { - const { docLinks } = useKibana().services; - const entityAnalyticsLinks = docLinks.links.securitySolution.entityAnalytics; - return useMemo(() => { - if (!riskScoreEntity) { - return entityAnalyticsLinks.entityRiskScoring; - } - if (riskScoreEntity === RiskScoreEntity.user) { - return entityAnalyticsLinks.userRiskScore; - } - return entityAnalyticsLinks.hostRiskScore; - }, [riskScoreEntity, entityAnalyticsLinks]); -}; - -const RiskScoreDocLinkComponent = ({ - riskScoreEntity, - title, -}: { - riskScoreEntity?: RiskScoreEntity; - title?: string | React.ReactNode; -}) => { - const learnMoreLink = useLearnMoreLinkForEntity(riskScoreEntity); - - return ( - - {title ? title : LEARN_MORE(riskScoreEntity)} - - ); -}; - -export const RiskScoreDocLink = React.memo(RiskScoreDocLinkComponent); - -RiskScoreDocLink.displayName = 'RiskScoreDocLink'; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.tsx index f75204ad5ffd2..6878f9aab0512 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_enable_button.tsx @@ -36,7 +36,7 @@ const RiskScoreEnableButtonComponent = ({ }) => { const spaceId = useSpaceId(); const { http, dashboard, ...startServices } = useKibana().services; - const { renderDocLink, renderDashboardLink } = useRiskScoreToastContent(riskScoreEntity); + const { renderDocLink, renderDashboardLink } = useRiskScoreToastContent(); const { fetch, isLoading } = useFetch(REQUEST_NAMES.ENABLE_RISK_SCORE, installRiskScoreModule); const isRiskEngineEnabled = useIsExperimentalFeatureEnabled('riskScoringRoutesEnabled'); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.tsx index 70f28df4420f9..87ef0df078c09 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/risk_score_restart_button.tsx @@ -30,7 +30,7 @@ const RiskScoreRestartButtonComponent = ({ ); const spaceId = useSpaceId(); - const { renderDocLink } = useRiskScoreToastContent(riskScoreEntity); + const { renderDocLink } = useRiskScoreToastContent(); const { http, ...startServices } = useKibana().services; const onClick = useCallback(async () => { diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/use_risk_score_toast_content.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/use_risk_score_toast_content.tsx index 7df01d9f8bd86..30fdc0f9204f2 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/use_risk_score_toast_content.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_score_onboarding/use_risk_score_toast_content.tsx @@ -10,21 +10,20 @@ import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { RiskScoreEntity } from '../../../../common/search_strategy'; -import { RiskScoreDocLink } from './risk_score_doc_link'; +import { EntityAnalyticsLearnMoreLink } from './entity_analytics_doc_link'; const StyledButton = styled(EuiButton)` float: right; `; -export const useRiskScoreToastContent = (riskScoreEntity: RiskScoreEntity) => { +export const useRiskScoreToastContent = () => { const renderDocLink = useCallback( (message: string) => ( <> - {message} + {message} ), - [riskScoreEntity] + [] ); const renderDashboardLink = useCallback( (message: string, targetUrl: string) => ( diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx index 2d0d8f9525713..76105e78a815b 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.stories.tsx @@ -10,11 +10,11 @@ import type { Story } from '@storybook/react'; import { TestProvider } from '@kbn/expandable-flyout/src/test/provider'; import { StorybookProviders } from '../../../common/mock/storybook_providers'; import { mockRiskScoreState } from '../../../timelines/components/side_panel/new_user_detail/__mocks__'; -import { RiskSummary } from './risk_summary'; +import { FlyoutRiskSummary } from './risk_summary'; export default { - component: RiskSummary, - title: 'Components/RiskSummary', + component: FlyoutRiskSummary, + title: 'Components/FlyoutRiskSummary', }; export const Default: Story = () => { @@ -22,7 +22,7 @@ export const Default: Story = () => {
    - {}} riskScoreData={{ ...mockRiskScoreState, data: [] }} queryId={'testQuery'} @@ -39,7 +39,7 @@ export const PreviewMode: Story = () => {
    - { }; }); -describe('RiskSummary', () => { +describe('FlyoutRiskSummary', () => { beforeEach(() => { mockVisualizationEmbeddable.mockClear(); }); @@ -45,7 +45,7 @@ describe('RiskSummary', () => { it('renders risk summary table with alerts only', () => { const { getByTestId, queryByTestId } = render( - {}} @@ -76,7 +76,7 @@ describe('RiskSummary', () => { const { getByTestId } = render( - {}} @@ -108,7 +108,7 @@ describe('RiskSummary', () => { it('renders risk summary table when riskScoreData is empty', () => { const { getByTestId } = render( - {}} @@ -122,7 +122,7 @@ describe('RiskSummary', () => { it('risk summary header does not render link when riskScoreData is loading', () => { const { queryByTestId } = render( - {}} @@ -137,7 +137,7 @@ describe('RiskSummary', () => { it('risk summary header does not render expand icon when in preview mode', () => { const { queryByTestId } = render( - {}} @@ -154,7 +154,7 @@ describe('RiskSummary', () => { it('renders visualization embeddable', () => { const { getByTestId } = render( - {}} @@ -169,7 +169,7 @@ describe('RiskSummary', () => { it('renders updated at', () => { const { getByTestId } = render( - {}} @@ -184,7 +184,7 @@ describe('RiskSummary', () => { it('builds lens attributes for host risk score', () => { render( - {}} @@ -211,7 +211,7 @@ describe('RiskSummary', () => { it('builds lens cases attachment metadata for host risk score', () => { render( - {}} @@ -233,7 +233,7 @@ describe('RiskSummary', () => { it('builds lens cases attachment metadata for user risk score', () => { render( - {}} @@ -255,7 +255,7 @@ describe('RiskSummary', () => { it('builds lens attributes for user risk score', () => { render( - {}} diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx index ce70b5fb211e7..8d0b00129057e 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_flyout/risk_summary.tsx @@ -55,7 +55,7 @@ export interface RiskSummaryProps { isPreviewMode?: boolean; } -const RiskSummaryComponent = ({ +const FlyoutRiskSummaryComponent = ({ riskScoreData, recalculatingScore, queryId, @@ -287,5 +287,5 @@ const RiskSummaryComponent = ({ ); }; -export const RiskSummary = React.memo(RiskSummaryComponent); -RiskSummary.displayName = 'RiskSummary'; +export const FlyoutRiskSummary = React.memo(FlyoutRiskSummaryComponent); +FlyoutRiskSummary.displayName = 'RiskSummary'; diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.test.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_panel.test.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.test.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_panel.test.tsx index 75722d781bbc7..cfe1e4ec898c4 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.test.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_panel.test.tsx @@ -9,9 +9,9 @@ import React from 'react'; import { render } from '@testing-library/react'; import { TestProviders } from '../../common/mock'; -import type { RiskEntity } from './risk_summary'; +import type { RiskEntity } from './risk_summary_panel'; import * as i18n from '../../common/components/event_details/cti_details/translations'; -import { RiskSummary } from './risk_summary'; +import { RiskSummaryPanel } from './risk_summary_panel'; import { RiskScoreEntity, RiskSeverity } from '../../../common/search_strategy'; import { getEmptyValue } from '../../common/components/empty_value'; @@ -46,7 +46,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( const { getByText } = render( - + ); @@ -67,7 +67,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( } as RiskEntity; const { getByTestId } = render( - + ); @@ -86,7 +86,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])( } as RiskEntity; const { getByText } = render( - + ); diff --git a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.tsx b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_panel.tsx similarity index 89% rename from x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.tsx rename to x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_panel.tsx index df3933ae50e5b..80d0558f5cf55 100644 --- a/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary.tsx +++ b/x-pack/plugins/security_solution/public/entity_analytics/components/risk_summary_panel.tsx @@ -17,7 +17,7 @@ import { RiskScoreLevel } from './severity/common'; import type { RiskSeverity } from '../../../common/search_strategy'; import { RiskScoreEntity } from '../../../common/search_strategy'; import { getEmptyValue } from '../../common/components/empty_value'; -import { RiskScoreDocLink } from './risk_score_onboarding/risk_score_doc_link'; +import { EntityAnalyticsLearnMoreLink } from './risk_score_onboarding/entity_analytics_doc_link'; import { RiskScoreHeaderTitle } from './risk_score_onboarding/risk_score_header_title'; import type { HostRisk, UserRisk } from '../api/types'; @@ -35,7 +35,7 @@ interface UserRiskEntity { export type RiskEntity = HostRiskEntity | UserRiskEntity; -const RiskSummaryComponent: React.FC = ({ risk, riskEntity, originalRisk }) => { +const RiskSummaryPanelComponent: React.FC = ({ risk, riskEntity, originalRisk }) => { const currentRiskScore = riskEntity === RiskScoreEntity.host ? risk?.result?.[0]?.host?.risk?.calculated_level @@ -64,10 +64,7 @@ const RiskSummaryComponent: React.FC = ({ risk, riskEntity, original values={{ riskEntity, riskScoreDocumentationLink: ( - + ), }} /> @@ -103,4 +100,4 @@ const RiskSummaryComponent: React.FC = ({ risk, riskEntity, original ); }; -export const RiskSummary = React.memo(RiskSummaryComponent); +export const RiskSummaryPanel = React.memo(RiskSummaryPanelComponent); diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx index 39772a9b61c36..ddcb5a805cd46 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/host_entity_overview.tsx @@ -187,7 +187,7 @@ export const HostEntityOverview: React.FC = ({ hostName {HOST_RISK_LEVEL} - + ), diff --git a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx index 300c31a7f6ba1..f8b9a49abc306 100644 --- a/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx +++ b/x-pack/plugins/security_solution/public/flyout/document_details/right/components/user_entity_overview.tsx @@ -187,7 +187,7 @@ export const UserEntityOverview: React.FC = ({ userName {USER_RISK_LEVEL} - + ), diff --git a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx index 26dcb462a1609..af3eae38fc1f8 100644 --- a/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx +++ b/x-pack/plugins/security_solution/public/flyout/entity_details/host_right/content.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { EuiHorizontalRule } from '@elastic/eui'; import { AssetCriticalityAccordion } from '../../../entity_analytics/components/asset_criticality/asset_criticality_selector'; -import { RiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary'; +import { FlyoutRiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary'; import type { RiskScoreState } from '../../../entity_analytics/api/hooks/use_risk_score'; import type { RiskScoreEntity, HostItem } from '../../../../common/search_strategy'; import { FlyoutBody } from '../../shared/components/flyout_body'; @@ -49,7 +49,7 @@ export const HostPanelContent = ({ {riskScoreState.isModuleEnabled && riskScoreState.data?.length !== 0 && ( <> - {riskScoreState.isModuleEnabled && riskScoreState.data?.length !== 0 && ( <> - = ({ toolTipContent, toolTipTitle, width = 270 }) => { + anchorPosition?: EuiPopover['props']['anchorPosition']; +}> = ({ toolTipContent, toolTipTitle, width = 270, anchorPosition = 'leftCenter' }) => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); const onClick = useCallback(() => { @@ -30,7 +30,7 @@ export const RiskScoreInfoTooltip: React.FC<{ ( +export const RiskScoreDocTooltip = ({ + anchorPosition, +}: { + anchorPosition?: React.ComponentProps['anchorPosition']; +}) => ( } - width={200} // Magic number to match the width of the doc link + anchorPosition={anchorPosition} + toolTipContent={} /> ); diff --git a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx index 6ac68b9522762..b25509c1b88f5 100644 --- a/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/host_overview/index.tsx @@ -158,7 +158,7 @@ export const HostOverview = React.memo( /> - + ), diff --git a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx index 30e528509b9c1..102e39cf1b740 100644 --- a/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/user_overview/index.tsx @@ -156,7 +156,7 @@ export const UserOverview = React.memo( /> - + ), diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5b97f97d5a585..d696f1ad07208 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -32715,7 +32715,6 @@ "xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "{ errorCount, plural, =1 {Erreur rencontrée} other {Erreurs rencontrées}} :", "xpack.securitySolution.enrichment.noInvestigationEnrichment": "Aucun renseignement supplémentaire sur les menaces n'a été détecté sur la période sélectionnée. Sélectionnez une autre plage temporelle ou {link} afin de collecter des renseignements sur les menaces pour les détecter et les comparer.", "xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} {incompatibleJobCount, plural, =1 {tâche est actuellement indisponible} other {tâches sont actuellement indisponibles}}", - "xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "Découvrez plus d'informations sur les risques {riskEntity}", "xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "Nom de {riskEntity}", "xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "Score de risque de {riskEntity}", "xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "Privilèges de cluster manquants : {privileges}.", @@ -37046,7 +37045,6 @@ "xpack.securitySolution.riskInformation.howOftenTitle": "À quelle fréquence le risque est-il calculé ?", "xpack.securitySolution.riskInformation.informationAriaLabel": "Informations", "xpack.securitySolution.riskInformation.introText": "L'analyse de risque des entités détecte les hôtes et les utilisateurs risqués à l'intérieur de votre environnement.", - "xpack.securitySolution.riskInformation.learnMore": "Découvrez plus d'informations sur les risques des entités", "xpack.securitySolution.riskInformation.levelHeader": "Niveau de risque", "xpack.securitySolution.riskInformation.riskCalculationStep1": "Uniquement les utilisateurs et les hôtes (entités) de scores associés aux alertes de détection non fermées.", "xpack.securitySolution.riskInformation.riskCalculationStep2": "Génère un score de catégorie \"Alerte\" en regroupant les alertes par identificateur d'entité, afin que les alertes ayant des scores de risque plus élevés contribuent davantage que les alertes dont les scores de risque sont moins élevés.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 624ab8b984ad9..5ada4e124f4c7 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -32688,7 +32688,6 @@ "xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "次の{ errorCount, plural, other {件のエラー}}が発生しました:", "xpack.securitySolution.enrichment.noInvestigationEnrichment": "選択した期間内に追加の脅威情報が見つかりませんでした。別の時間枠、または{link}を試して、脅威の検出と照合のための脅威インテリジェンスを収集します。", "xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} {incompatibleJobCount, plural, other {件のジョブ}}が現在使用できません", - "xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "{riskEntity}リスクの詳細", "xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "{riskEntity}名", "xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "{riskEntity}リスクレベル", "xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "クラスター権限が不足しています:{privileges}。", @@ -37021,7 +37020,6 @@ "xpack.securitySolution.riskInformation.howOftenTitle": "リスクを計算する頻度", "xpack.securitySolution.riskInformation.informationAriaLabel": "情報", "xpack.securitySolution.riskInformation.introText": "Entity Risk Analyticsは、環境内のリスクのあるホストとユーザーを明らかにします。", - "xpack.securitySolution.riskInformation.learnMore": "エンティティリスクの詳細", "xpack.securitySolution.riskInformation.levelHeader": "リスクレベル", "xpack.securitySolution.riskInformation.riskCalculationStep1": "クローズされていない検出アラートに関連付けられたユーザーとホスト(エンティティ)のみスコア付けします。", "xpack.securitySolution.riskInformation.riskCalculationStep2": "エンティティID別にアラートを集約することで、「アラート」カテゴリスコアを生成します。リスクスコアが高いアラートがリスクスコアが低いアラートよりも大きく寄与するように設定されます。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e3f237c9ac047..373b448116918 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -32732,7 +32732,6 @@ "xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "遇到以下{ errorCount, plural, other {错误}}:", "xpack.securitySolution.enrichment.noInvestigationEnrichment": "在选定时间范围内未发现其他威胁情报。请尝试不同时间范围,或 {link} 以收集威胁情报用于威胁检测和匹配。", "xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} 个{incompatibleJobCount, plural, other {作业}}当前不可用", - "xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "详细了解 {riskEntity} 风险", "xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "{riskEntity}名称", "xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "{riskEntity} 风险级别", "xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "缺少集群权限:{privileges}。", @@ -37064,7 +37063,6 @@ "xpack.securitySolution.riskInformation.howOftenTitle": "多久计算一次风险?", "xpack.securitySolution.riskInformation.informationAriaLabel": "信息", "xpack.securitySolution.riskInformation.introText": "实体风险分析将显示您的环境中存在的有风险主机和用户。", - "xpack.securitySolution.riskInformation.learnMore": "详细了解实体风险", "xpack.securitySolution.riskInformation.levelHeader": "风险级别", "xpack.securitySolution.riskInformation.riskCalculationStep1": "仅对与尚未关闭的检测告警关联的用户和主机(实体)评分。", "xpack.securitySolution.riskInformation.riskCalculationStep2": "通过按实体标识符聚合告警来生成“告警”类别分数,从而使风险分数高的告警贡献高于风险分数低的告警。", From 5761a382e144799b09e45fe5cd59e0c1a012c81e Mon Sep 17 00:00:00 2001 From: Julia Bardi <90178898+juliaElastic@users.noreply.github.com> Date: Thu, 11 Jul 2024 12:57:01 +0200 Subject: [PATCH 82/82] [Fleet] Missing policy filter in Fleet Server check to enable secrets (#187935) ## Summary Closes https://github.com/elastic/kibana/issues/187933 Closes https://github.com/elastic/kibana/issues/186845 Fixed missing policy filter when checking if Fleet Servers met minimum version to enable secrets storage. The integration tests cover now a case where there are no fleet servers but there are agents with minimum version, to verify that the query filters them out. Manual verification is hard because you can't enroll an agent without enrolling FS with at least the same version. It could be done by manually creating docs in `.fleet-agents`. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../fleet/server/services/fleet_server/index.test.ts | 7 +++++++ .../plugins/fleet/server/services/fleet_server/index.ts | 8 ++++++++ x-pack/test/fleet_api_integration/apis/policy_secrets.ts | 5 +++++ 3 files changed, 20 insertions(+) diff --git a/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts b/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts index f00d78cd59ad9..7faea8c526819 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts @@ -115,6 +115,13 @@ describe('checkFleetServerVersionsForSecretsStorage', () => { version ); expect(result).toBe(true); + expect(mockedGetAgentsByKuery).toHaveBeenCalledWith( + esClientMock, + soClientMock, + expect.objectContaining({ + kuery: 'policy_id:("1" or "2")', + }) + ); }); }); diff --git a/x-pack/plugins/fleet/server/services/fleet_server/index.ts b/x-pack/plugins/fleet/server/services/fleet_server/index.ts index 004a0deeea7b7..a0d508f0929e9 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/index.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/index.ts @@ -128,11 +128,19 @@ export async function checkFleetServerVersionsForSecretsStorage( hasMore = false; } } + if (policyIds.size === 0) { + return false; + } + + const kuery = `policy_id:(${Array.from(policyIds) + .map((id) => `"${id}"`) + .join(' or ')})`; const managedAgentPolicies = await agentPolicyService.getAllManagedAgentPolicies(soClient); const fleetServerAgents = await getAgentsByKuery(esClient, soClient, { showInactive: true, perPage: SO_SEARCH_LIMIT, + kuery, }); if (fleetServerAgents.agents.length === 0) { diff --git a/x-pack/test/fleet_api_integration/apis/policy_secrets.ts b/x-pack/test/fleet_api_integration/apis/policy_secrets.ts index 226c22d6ca924..d8e641b7af0a5 100644 --- a/x-pack/test/fleet_api_integration/apis/policy_secrets.ts +++ b/x-pack/test/fleet_api_integration/apis/policy_secrets.ts @@ -847,6 +847,8 @@ export default function (providerContext: FtrProviderContext) { it('should not store secrets if fleet server does not meet minimum version', async () => { const { fleetServerAgentPolicy } = await createFleetServerAgentPolicy(); await createFleetServerAgent(fleetServerAgentPolicy.id, 'server_1', '7.0.0'); + const { fleetServerAgentPolicy: fleetServerPolicy2 } = await createFleetServerAgentPolicy(); // extra policy to verify `or` condition + await createFleetServerAgent(fleetServerPolicy2.id, 'server_1', '8.12.0'); await callFleetSetup(); @@ -865,7 +867,10 @@ export default function (providerContext: FtrProviderContext) { }); it('should not store secrets if there are no fleet servers', async () => { + await createFleetServerAgentPolicy(); const agentPolicy = await createAgentPolicy(); + // agent with new version shouldn't make storage secrets enabled + await createFleetServerAgent(agentPolicy.id, 'server_2', '8.12.0'); const packagePolicyWithSecrets = await createPackagePolicyWithSecrets(agentPolicy.id); // secret should be in plain text i.e not a secret refrerence

    Pd=y!FJg<|% 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%0DmKt!C&m5!$`T5MBG9F{@A{-i*y7JZS_+O03b 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 literal 315936 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≧A`SDnVE6se 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